diff options
Diffstat (limited to 'test/SemaCXX/uninit-variables.cpp')
-rw-r--r-- | test/SemaCXX/uninit-variables.cpp | 66 |
1 files changed, 63 insertions, 3 deletions
diff --git a/test/SemaCXX/uninit-variables.cpp b/test/SemaCXX/uninit-variables.cpp index 2bc7fb3..a0180e3 100644 --- a/test/SemaCXX/uninit-variables.cpp +++ b/test/SemaCXX/uninit-variables.cpp @@ -1,4 +1,7 @@ -// RUN: %clang_cc1 -fsyntax-only -Wuninitialized-experimental -fsyntax-only %s -verify +// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fcxx-exceptions %s -verify + +// Stub out types for 'typeid' to work. +namespace std { class type_info {}; } int test1_aux(int &x); int test1() { @@ -13,6 +16,20 @@ int test2_aux() { return x; // no-warning } +// Don't warn on unevaluated contexts. +void unevaluated_tests() { + int x; + (void)sizeof(x); + (void)typeid(x); +} + +// Warn for glvalue arguments to typeid whose type is polymorphic. +struct A { virtual ~A() {} }; +void polymorphic_test() { + A *a; // expected-note{{declared here}} expected-note{{add initialization}} + (void)typeid(*a); // expected-warning{{variable 'a' is uninitialized when used here }} +} + // Handle cases where the CFG may constant fold some branches, thus // mitigating the need for some path-sensitivity in the analysis. unsigned test3_aux(); @@ -38,7 +55,7 @@ unsigned test3_c() { if (flag && (x = test3_aux()) == 0) { x = 1; } - return x; // expected-warning{{variable 'x' is possibly uninitialized when used here}} + return x; // expected-warning{{variable 'x' is uninitialized when used here}} } enum test4_A { @@ -46,6 +63,49 @@ enum test4_A { }; test4_A test4() { test4_A a; // expected-note{{variable 'a' is declared here}} - return a; // expected-warning{{variable 'a' is possibly uninitialized when used here}} + return a; // expected-warning{{variable 'a' is uninitialized when used here}} } +// This test previously crashed Sema. +class Rdar9188004A { +public: + virtual ~Rdar9188004A(); +}; + +template< typename T > class Rdar9188004B : public Rdar9188004A { +virtual double *foo(Rdar9188004B *next) const { + double *values = next->foo(0); + try { + } + catch(double e) { + values[0] = e; + } + return 0; + } +}; +class Rdar9188004C : public Rdar9188004B<Rdar9188004A> { + virtual void bar(void) const; +}; +void Rdar9188004C::bar(void) const {} + +// Don't warn about uninitialized variables in unreachable code. +void PR9625() { + if (false) { + int x; + (void)static_cast<float>(x); // no-warning + } +} + +// Don't warn about variables declared in "catch" +void RDar9251392_bar(const char *msg); + +void RDar9251392() { + try { + throw "hi"; + } + catch (const char* msg) { + RDar9251392_bar(msg); // no-warning + } +} + + |