uninit-variables.cpp revision dd4286b5b7b02b8bb962e4b996b8f36cb7935d4f
1// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fcxx-exceptions %s -verify 2 3// Stub out types for 'typeid' to work. 4namespace std { class type_info {}; } 5 6int test1_aux(int &x); 7int test1() { 8 int x; 9 test1_aux(x); 10 return x; // no-warning 11} 12 13int test2_aux() { 14 int x; 15 int &y = x; 16 return x; // no-warning 17} 18 19// Don't warn on unevaluated contexts. 20void unevaluated_tests() { 21 int x; 22 (void)sizeof(x); 23 (void)typeid(x); 24} 25 26// Warn for glvalue arguments to typeid whose type is polymorphic. 27struct A { virtual ~A() {} }; 28void polymorphic_test() { 29 A *a; // expected-note{{declared here}} expected-note{{add initialization}} 30 (void)typeid(*a); // expected-warning{{variable 'a' is uninitialized when used here }} 31} 32 33// Handle cases where the CFG may constant fold some branches, thus 34// mitigating the need for some path-sensitivity in the analysis. 35unsigned test3_aux(); 36unsigned test3() { 37 unsigned x = 0; 38 const bool flag = true; 39 if (flag && (x = test3_aux()) == 0) { 40 return x; 41 } 42 return x; 43} 44unsigned test3_b() { 45 unsigned x ; 46 const bool flag = true; 47 if (flag && (x = test3_aux()) == 0) { 48 x = 1; 49 } 50 return x; // no-warning 51} 52unsigned test3_c() { 53 unsigned x; // expected-note{{declared here}} expected-note{{add initialization}} 54 const bool flag = false; 55 if (flag && (x = test3_aux()) == 0) { 56 x = 1; 57 } 58 return x; // expected-warning{{variable 'x' is uninitialized when used here}} 59} 60 61enum test4_A { 62 test4_A_a, test_4_A_b 63}; 64test4_A test4() { 65 test4_A a; // expected-note{{variable 'a' is declared here}} 66 return a; // expected-warning{{variable 'a' is uninitialized when used here}} 67} 68 69// Test variables getting invalidated by function calls with reference arguments 70// *AND* there are multiple invalidated arguments. 71void test5_aux(int &, int &); 72 73int test5() { 74 int x, y; 75 test5_aux(x, y); 76 return x + y; // no-warning 77} 78 79// This test previously crashed Sema. 80class Rdar9188004A { 81public: 82 virtual ~Rdar9188004A(); 83}; 84 85template< typename T > class Rdar9188004B : public Rdar9188004A { 86virtual double *foo(Rdar9188004B *next) const { 87 double *values = next->foo(0); 88 try { 89 } 90 catch(double e) { 91 values[0] = e; 92 } 93 return 0; 94 } 95}; 96class Rdar9188004C : public Rdar9188004B<Rdar9188004A> { 97 virtual void bar(void) const; 98}; 99void Rdar9188004C::bar(void) const {} 100 101// Don't warn about uninitialized variables in unreachable code. 102void PR9625() { 103 if (false) { 104 int x; 105 (void)static_cast<float>(x); // no-warning 106 } 107} 108 109// Don't warn about variables declared in "catch" 110void RDar9251392_bar(const char *msg); 111 112void RDar9251392() { 113 try { 114 throw "hi"; 115 } 116 catch (const char* msg) { 117 RDar9251392_bar(msg); // no-warning 118 } 119} 120 121 122