blob: eb6428d631f2b2995c99ffd85e4317a67fb994b7 [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
Chandler Carruth86684942011-04-13 08:18:42 +00003// Stub out types for 'typeid' to work.
4namespace std { class type_info {}; }
5
Ted Kremenekc21fed32011-01-18 21:18:58 +00006int 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
Chandler Carruth86684942011-04-13 08:18:42 +000019// 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() {
David Blaikie4f4f3492011-09-10 05:35:08 +000029 A *a; // expected-note{{initialize the variable 'a' to silence this warning}}
Richard Trieu2fe9b7f2011-12-15 00:38:15 +000030 (void)typeid(*a); // expected-warning{{variable 'a' is uninitialized when used here}}
Chandler Carruth86684942011-04-13 08:18:42 +000031}
32
Ted Kremenek2d4bed12011-01-20 21:25:31 +000033// 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() {
David Blaikie4f4f3492011-09-10 05:35:08 +000053 unsigned x; // expected-note{{initialize the variable 'x' to silence this warning}}
Ted Kremenek2d4bed12011-01-20 21:25:31 +000054 const bool flag = false;
55 if (flag && (x = test3_aux()) == 0) {
56 x = 1;
57 }
Chandler Carruthf04eb2d2011-04-08 06:33:38 +000058 return x; // expected-warning{{variable 'x' is uninitialized when used here}}
Ted Kremenek2d4bed12011-01-20 21:25:31 +000059}
60
Ted Kremenek09f57b92011-02-05 01:18:18 +000061enum 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}}
Chandler Carruthf04eb2d2011-04-08 06:33:38 +000066 return a; // expected-warning{{variable 'a' is uninitialized when used here}}
Ted Kremenek09f57b92011-02-05 01:18:18 +000067}
68
Ted Kremenekdd4286b2011-07-20 19:49:47 +000069// 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
Ted Kremenekb831c672011-03-29 01:40:00 +000079// 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 {}
Ted Kremenekf8adeef2011-04-04 20:30:58 +0000100
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}
Ted Kremeneka21612f2011-04-07 20:02:56 +0000108
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
Ted Kremenek57fb5912011-08-04 22:40:57 +0000121// Test handling of "no-op" casts.
122void test_noop_cast()
123{
124 int x = 1;
125 int y = (int&)x; // no-warning
126}
127
128void test_noop_cast2() {
David Blaikie4f4f3492011-09-10 05:35:08 +0000129 int x; // expected-note {{initialize the variable 'x' to silence this warning}}
Ted Kremenek57fb5912011-08-04 22:40:57 +0000130 int y = (int&)x; // expected-warning {{uninitialized when used here}}
131}
Ted Kremeneka21612f2011-04-07 20:02:56 +0000132
Ted Kremenekde091ae2011-08-08 21:43:08 +0000133// Test handling of bit casts.
134void test_bitcasts() {
135 int x = 1;
136 int y = (float &)x; // no-warning
137}
138
139void test_bitcasts_2() {
David Blaikie4f4f3492011-09-10 05:35:08 +0000140 int x; // expected-note {{initialize the variable 'x' to silence this warning}}
Ted Kremenekde091ae2011-08-08 21:43:08 +0000141 int y = (float &)x; // expected-warning {{uninitialized when used here}}
142}
143