diff options
Diffstat (limited to 'clang/test/Analysis/cxx-uninitialized-object.cpp')
| -rw-r--r-- | clang/test/Analysis/cxx-uninitialized-object.cpp | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/clang/test/Analysis/cxx-uninitialized-object.cpp b/clang/test/Analysis/cxx-uninitialized-object.cpp index e9079d99af3..07006bea478 100644 --- a/clang/test/Analysis/cxx-uninitialized-object.cpp +++ b/clang/test/Analysis/cxx-uninitialized-object.cpp @@ -1,11 +1,11 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject \ // RUN: -analyzer-config alpha.cplusplus.UninitializedObject:Pedantic=true -DPEDANTIC \ // RUN: -analyzer-config alpha.cplusplus.UninitializedObject:CheckPointeeInitialization=true \ -// RUN: -std=c++11 -verify %s +// RUN: -std=c++14 -verify %s // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject \ // RUN: -analyzer-config alpha.cplusplus.UninitializedObject:CheckPointeeInitialization=true \ -// RUN: -std=c++11 -verify %s +// RUN: -std=c++14 -verify %s //===----------------------------------------------------------------------===// // Default constructor test. @@ -781,7 +781,7 @@ struct LambdaTest2 { void fLambdaTest2() { int b; - auto equals = [&b](int a) { return a == b; }; // expected-note{{uninitialized pointee 'this->functor.b'}} + auto equals = [&b](int a) { return a == b; }; // expected-note{{uninitialized pointee 'this->functor./*captured variable*/b'}} LambdaTest2<decltype(equals)>(equals, int()); } #else @@ -803,8 +803,8 @@ void fLambdaTest2() { namespace LT3Detail { struct RecordType { - int x; // expected-note{{uninitialized field 'this->functor.rec1.x'}} - int y; // expected-note{{uninitialized field 'this->functor.rec1.y'}} + int x; // expected-note{{uninitialized field 'this->functor./*captured variable*/rec1.x'}} + int y; // expected-note{{uninitialized field 'this->functor./*captured variable*/rec1.y'}} }; } // namespace LT3Detail @@ -857,8 +857,8 @@ struct MultipleLambdaCapturesTest1 { void fMultipleLambdaCapturesTest1() { int b1, b2 = 3, b3; - auto equals = [&b1, &b2, &b3](int a) { return a == b1 == b2 == b3; }; // expected-note{{uninitialized pointee 'this->functor.b1'}} - // expected-note@-1{{uninitialized pointee 'this->functor.b3'}} + auto equals = [&b1, &b2, &b3](int a) { return a == b1 == b2 == b3; }; // expected-note{{uninitialized pointee 'this->functor./*captured variable*/b1'}} + // expected-note@-1{{uninitialized pointee 'this->functor./*captured variable*/b3'}} MultipleLambdaCapturesTest1<decltype(equals)>(equals, int()); } @@ -872,10 +872,35 @@ struct MultipleLambdaCapturesTest2 { void fMultipleLambdaCapturesTest2() { int b1, b2 = 3, b3; - auto equals = [b1, &b2, &b3](int a) { return a == b1 == b2 == b3; }; // expected-note{{uninitialized pointee 'this->functor.b3'}} + auto equals = [b1, &b2, &b3](int a) { return a == b1 == b2 == b3; }; // expected-note{{uninitialized pointee 'this->functor./*captured variable*/b3'}} MultipleLambdaCapturesTest2<decltype(equals)>(equals, int()); } +struct LambdaWrapper { + void *func; // no-crash + int dontGetFilteredByNonPedanticMode = 0; + + LambdaWrapper(void *ptr) : func(ptr) {} // expected-warning{{1 uninitialized field}} +}; + +struct ThisCapturingLambdaFactory { + int a; // expected-note{{uninitialized field 'static_cast<decltype(a.ret()) *>(this->func)->/*'this' capture*/->a'}} + + auto ret() { + return [this] { (void)this; }; + } +}; + +void fLambdaFieldWithInvalidThisCapture() { + void *ptr; + { + ThisCapturingLambdaFactory a; + decltype(a.ret()) lambda = a.ret(); + ptr = λ + } + LambdaWrapper t(ptr); +} + //===----------------------------------------------------------------------===// // System header tests. //===----------------------------------------------------------------------===// |

