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