Index: lib/StaticAnalyzer/Core/ExprEngine.cpp =================================================================== --- lib/StaticAnalyzer/Core/ExprEngine.cpp +++ lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -460,7 +460,8 @@ const CXXBindTemporaryExpr *BTE, const LocationContext *LC) { ConstructedObjectKey Key({BTE, /*IsElided=*/true}, LC); - assert(!State->contains(Key)); + // FIXME: Currently the state might already contain the marker due to + // incorrect handling of temporaries bound to default parameters. return State->set(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}}