diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c3ecc1eee20..ba63620afb6e 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -555,7 +555,7 @@ private: struct ReplayWithoutInlining{}; template <> struct ProgramStateTrait : - public ProgramStatePartialTrait { + public ProgramStatePartialTrait { static void *GDMIndex() { static int index = 0; return &index; } }; diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h index 34f450f4fb78..eb52ae47bdf2 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h @@ -167,7 +167,7 @@ namespace ento { } static inline void *MakeVoidPtr(data_type D) { - return const_cast >(D.getInternalPointer()); + return const_cast *>(D.getInternalPointer()); } static inline context_type MakeContext(void *p) { @@ -223,7 +223,20 @@ namespace ento { } }; -} // end GR namespace + // Partial specialization for const void *. + template <> struct ProgramStatePartialTrait { + typedef const void *data_type; + + static inline data_type MakeData(void * const *p) { + return p ? *p : data_type(); + } + + static inline void *MakeVoidPtr(data_type d) { + return const_cast(d); + } + }; + +} // end ento namespace } // end clang namespace diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index 7c1c26e8f77f..af93baa0a292 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -608,11 +608,11 @@ bool ExprEngine::inlineCall(const CallEvent &Call, const Decl *D, static ProgramStateRef getInlineFailedState(ProgramStateRef State, const Stmt *CallE) { - void *ReplayState = State->get(); + const void *ReplayState = State->get(); if (!ReplayState) return 0; - assert(ReplayState == (const void*)CallE && "Backtracked to the wrong call."); + assert(ReplayState == CallE && "Backtracked to the wrong call."); (void)CallE; return State->remove();