NoQ created this revision. NoQ added reviewers: dcoughlin, xazax.hun, a.sidorin, george.karpenkov, szepet, rnkovacs. Herald added subscribers: cfe-commits, mikhail.ramalho, baloghadamsoftware.
@alexfh provided an example that demonstrates that elided copy constructors may get agglutinated due to improper control flow when default arguments are involved. Suppress the assertion failure for now. Proper support is still an open problem. Repository: rC Clang https://reviews.llvm.org/D49213 Files: lib/StaticAnalyzer/Core/ExprEngine.cpp test/Analysis/temporaries.cpp Index: test/Analysis/temporaries.cpp =================================================================== --- test/Analysis/temporaries.cpp +++ test/Analysis/temporaries.cpp @@ -458,6 +458,21 @@ #endif // TEMPORARY_DTORS } +namespace default_param_elided_destructors { +struct a { + ~a(); +}; +struct F { + a d; + F(char *, a = a()); +}; +void g() { + char h[1]; + for (int i = 0;;) + F j(i ? j : h); +} +} // namespace default_param_elided_destructors + void testStaticMaterializeTemporaryExpr() { static const Trivial &ref = getTrivial(); clang_analyzer_eval(ref.value == 42); // expected-warning{{TRUE}} Index: lib/StaticAnalyzer/Core/ExprEngine.cpp =================================================================== --- lib/StaticAnalyzer/Core/ExprEngine.cpp +++ lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -458,7 +458,8 @@ const CXXBindTemporaryExpr *BTE, const LocationContext *LC) { ConstructedObjectKey Key({BTE, /*IsElided=*/true}, LC); - assert(!State->contains<ObjectsUnderConstruction>(Key)); + // FIXME: Currently the state might already contain the marker due to + // incorrect handling of temporaries bound to default parameters. return State->set<ObjectsUnderConstruction>(Key, UnknownVal()); }
Index: test/Analysis/temporaries.cpp =================================================================== --- test/Analysis/temporaries.cpp +++ test/Analysis/temporaries.cpp @@ -458,6 +458,21 @@ #endif // TEMPORARY_DTORS } +namespace default_param_elided_destructors { +struct a { + ~a(); +}; +struct F { + a d; + F(char *, a = a()); +}; +void g() { + char h[1]; + for (int i = 0;;) + F j(i ? j : h); +} +} // namespace default_param_elided_destructors + void testStaticMaterializeTemporaryExpr() { static const Trivial &ref = getTrivial(); clang_analyzer_eval(ref.value == 42); // expected-warning{{TRUE}} Index: lib/StaticAnalyzer/Core/ExprEngine.cpp =================================================================== --- lib/StaticAnalyzer/Core/ExprEngine.cpp +++ lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -458,7 +458,8 @@ const CXXBindTemporaryExpr *BTE, const LocationContext *LC) { ConstructedObjectKey Key({BTE, /*IsElided=*/true}, LC); - assert(!State->contains<ObjectsUnderConstruction>(Key)); + // FIXME: Currently the state might already contain the marker due to + // incorrect handling of temporaries bound to default parameters. return State->set<ObjectsUnderConstruction>(Key, UnknownVal()); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits