blob: 777734c82598c625423cdd5b565486181ee43f43 [file] [log] [blame]
Ted Kremenekb831c672011-03-29 01:40:00 +00001// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fcxx-exceptions %s -verify
Ted Kremenekc21fed32011-01-18 21:18:58 +00002
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
Ted Kremenek2d4bed12011-01-20 21:25:31 +000016// 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() {
Ted Kremenek609e3172011-02-02 23:35:53 +000036 unsigned x; // expected-note{{declared here}} expected-note{{add initialization}}
Ted Kremenek2d4bed12011-01-20 21:25:31 +000037 const bool flag = false;
38 if (flag && (x = test3_aux()) == 0) {
39 x = 1;
40 }
Ted Kremenek609e3172011-02-02 23:35:53 +000041 return x; // expected-warning{{variable 'x' is possibly uninitialized when used here}}
Ted Kremenek2d4bed12011-01-20 21:25:31 +000042}
43
Ted Kremenek09f57b92011-02-05 01:18:18 +000044enum 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 possibly uninitialized when used here}}
50}
51
Ted Kremenekb831c672011-03-29 01:40:00 +000052// 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 {}
Ted Kremenekf8adeef2011-04-04 20:30:58 +000073
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}
Ted Kremeneka21612f2011-04-07 20:02:56 +000081
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