uninit-variables.cpp revision f04eb2de1f17dce4dfaebbf9002844087b7d357d
1// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fcxx-exceptions %s -verify 2 3int test1_aux(int &x); 4int test1() { 5 int x; 6 test1_aux(x); 7 return x; // no-warning 8} 9 10int test2_aux() { 11 int x; 12 int &y = x; 13 return x; // no-warning 14} 15 16// Handle cases where the CFG may constant fold some branches, thus 17// mitigating the need for some path-sensitivity in the analysis. 18unsigned test3_aux(); 19unsigned test3() { 20 unsigned x = 0; 21 const bool flag = true; 22 if (flag && (x = test3_aux()) == 0) { 23 return x; 24 } 25 return x; 26} 27unsigned test3_b() { 28 unsigned x ; 29 const bool flag = true; 30 if (flag && (x = test3_aux()) == 0) { 31 x = 1; 32 } 33 return x; // no-warning 34} 35unsigned test3_c() { 36 unsigned x; // expected-note{{declared here}} expected-note{{add initialization}} 37 const bool flag = false; 38 if (flag && (x = test3_aux()) == 0) { 39 x = 1; 40 } 41 return x; // expected-warning{{variable 'x' is uninitialized when used here}} 42} 43 44enum test4_A { 45 test4_A_a, test_4_A_b 46}; 47test4_A test4() { 48 test4_A a; // expected-note{{variable 'a' is declared here}} 49 return a; // expected-warning{{variable 'a' is uninitialized when used here}} 50} 51 52// This test previously crashed Sema. 53class Rdar9188004A { 54public: 55 virtual ~Rdar9188004A(); 56}; 57 58template< typename T > class Rdar9188004B : public Rdar9188004A { 59virtual double *foo(Rdar9188004B *next) const { 60 double *values = next->foo(0); 61 try { 62 } 63 catch(double e) { 64 values[0] = e; 65 } 66 return 0; 67 } 68}; 69class Rdar9188004C : public Rdar9188004B<Rdar9188004A> { 70 virtual void bar(void) const; 71}; 72void Rdar9188004C::bar(void) const {} 73 74// Don't warn about uninitialized variables in unreachable code. 75void PR9625() { 76 if (false) { 77 int x; 78 (void)static_cast<float>(x); // no-warning 79 } 80} 81 82// Don't warn about variables declared in "catch" 83void RDar9251392_bar(const char *msg); 84 85void RDar9251392() { 86 try { 87 throw "hi"; 88 } 89 catch (const char* msg) { 90 RDar9251392_bar(msg); // no-warning 91 } 92} 93 94 95