diff --git a/clang/test/Analysis/NewDeleteLeaks.cpp b/clang/test/Analysis/NewDeleteLeaks.cpp --- a/clang/test/Analysis/NewDeleteLeaks.cpp +++ b/clang/test/Analysis/NewDeleteLeaks.cpp @@ -192,3 +192,26 @@ // expected-note@-1 {{Potential leak of memory pointed to by 'v'}} } // namespace refkind_from_unoallocated_to_allocated + +namespace symbol_reaper_lifetime { +struct Nested { + int buf[2]; +}; +struct Wrapping { + Nested data; +}; + +Nested allocateWrappingAndReturnNested() { + // expected-note@+1 {{Memory is allocated}} + Wrapping const* p = new Wrapping(); + // expected-warning@+2 {{Potential leak of memory pointed to by 'p'}} + // expected-note@+1 {{Potential leak of memory pointed to by 'p'}} + return p->data; +} + +void caller() { + // expected-note@+1 {{Calling 'allocateWrappingAndReturnNested'}} + Nested n = allocateWrappingAndReturnNested(); + (void)n; +} // no-warning: No potential memory leak here, because that's been already reported. +} // namespace symbol_reaper_lifetime diff --git a/clang/test/Analysis/symbol-reaper-lambda.cpp b/clang/test/Analysis/symbol-reaper-lambda.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Analysis/symbol-reaper-lambda.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s +// expected-no-diagnostics + +template +void escape(Ts&...); +struct Dummy {}; + +int strange(Dummy param) { + Dummy local_pre_lambda; + int ref_captured = 0; + + auto fn = [&] { + escape(param, local_pre_lambda); + return ref_captured; // no-warning: The value is not garbage. + }; + + int local_defined_after_lambda; // Unused, but necessary! Important that it's before the call. + return fn(); +} \ No newline at end of file