27 lines
798 B
C++
27 lines
798 B
C++
// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
|
|
// expected-no-diagnostics
|
|
|
|
template <typename... Ts>
|
|
void escape(Ts&...);
|
|
struct Dummy {};
|
|
|
|
int strange(Dummy param) {
|
|
Dummy local_pre_lambda;
|
|
int ref_captured = 0;
|
|
|
|
// LambdaExpr is modeled as lazyCompoundVal of tempRegion, that contains
|
|
// all captures. In this instance, this region contains a pointer/reference
|
|
// to ref_captured variable.
|
|
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.
|
|
|
|
// The ref_captured binding should not be pruned at this point, as it is still
|
|
// accessed via reference captured in operator() of fn.
|
|
return fn();
|
|
}
|
|
|