Author: dcoughlin Date: Mon Nov 9 13:50:29 2015 New Revision: 252506 URL: http://llvm.org/viewvc/llvm-project?rev=252506&view=rev Log: [analyzer] Fix assertion failure invalidating on const member function calls (PR25392).
We now return early when the 'this' value cannot be converted to a MemRegion. Modified: cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp cfe/trunk/test/Analysis/const-method-call.cpp Modified: cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp?rev=252506&r1=252505&r2=252506&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp Mon Nov 9 13:50:29 2015 @@ -438,7 +438,9 @@ void CXXInstanceCall::getExtraInvalidate return; // Preserve CXXThis. const MemRegion *ThisRegion = ThisVal.getAsRegion(); - assert(ThisRegion && "ThisValue was not a memory region"); + if (!ThisRegion) + return; + ETraits->setTrait(ThisRegion->getBaseRegion(), RegionAndSymbolInvalidationTraits::TK_PreserveContents); } Modified: cfe/trunk/test/Analysis/const-method-call.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/const-method-call.cpp?rev=252506&r1=252505&r2=252506&view=diff ============================================================================== --- cfe/trunk/test/Analysis/const-method-call.cpp (original) +++ cfe/trunk/test/Analysis/const-method-call.cpp Mon Nov 9 13:50:29 2015 @@ -204,6 +204,25 @@ void PR21606() s2().f(0); } +// --- PR25392 --- // + +struct HasConstMemberFunction { +public: + void constMemberFunction() const; +}; + +HasConstMemberFunction hasNoReturn() { } // expected-warning {{control reaches end of non-void function}} + +void testUnknownWithConstMemberFunction() { + hasNoReturn().constMemberFunction(); +} + +void testNonRegionLocWithConstMemberFunction() { + (*((HasConstMemberFunction *)(&&label))).constMemberFunction(); + + label: return; +} + // FIXME // When there is a circular reference to an object and a const method is called // the object is not invalidated because TK_PreserveContents has already been _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits