uninit-variables.c revision c21fed361c11f13db345cba69101578578d8fb79
1// RUN: %clang_cc1 -fsyntax-only -Wuninitialized-experimental -fsyntax-only %s -verify
2
3int test1() {
4  int x;
5  return x; // expected-warning{{use of uninitialized variable 'x'}}
6}
7
8int test2() {
9  int x = 0;
10  return x; // no-warning
11}
12
13int test3() {
14  int x;
15  x = 0;
16  return x; // no-warning
17}
18
19int test4() {
20  int x;
21  ++x; // expected-warning{{use of uninitialized variable 'x'}}
22  return x;
23}
24
25int test5() {
26  int x, y;
27  x = y; // expected-warning{{use of uninitialized variable 'y'}}
28  return x;
29}
30
31int test6() {
32  int x;
33  x += 2; // expected-warning{{use of uninitialized variable 'x'}}
34  return x;
35}
36
37int test7(int y) {
38  int x;
39  if (y)
40    x = 1;
41  return x;  // expected-warning{{use of uninitialized variable 'x'}}
42}
43
44int test8(int y) {
45  int x;
46  if (y)
47    x = 1;
48  else
49    x = 0;
50  return x; // no-warning
51}
52
53int test9(int n) {
54  int x;
55  for (unsigned i = 0 ; i < n; ++i) {
56    if (i == n - 1)
57      break;
58    x = 1;
59  }
60  return x; // expected-warning{{use of uninitialized variable 'x'}}
61}
62
63int test10(unsigned n) {
64  int x;
65  for (unsigned i = 0 ; i < n; ++i) {
66    x = 1;
67  }
68  return x; // expected-warning{{use of uninitialized variable 'x'}}
69}
70
71int test11(unsigned n) {
72  int x;
73  for (unsigned i = 0 ; i <= n; ++i) {
74    x = 1;
75  }
76  return x; // expected-warning{{use of uninitialized variable 'x'}}
77}
78
79void test12(unsigned n) {
80  for (unsigned i ; n ; ++i) ; // expected-warning{{use of uninitialized variable 'i'}}
81}
82
83int test13() {
84  static int i;
85  return i; // no-warning
86}
87
88// Simply don't crash on this test case.
89void test14() {
90  const char *p = 0;
91  for (;;) {}
92}
93
94void test15() {
95  int x = x; // expected-warning{{use of uninitialized variable 'x'}}
96}
97
98// Don't warn in the following example; shows dataflow confluence.
99char *test16_aux();
100void test16() {
101  char *p = test16_aux();
102  for (unsigned i = 0 ; i < 100 ; i++)
103    p[i] = 'a'; // no-warning
104}
105
106void test17() {
107  // Don't warn multiple times about the same uninitialized variable
108  // along the same path.
109  int *x;
110  *x = 1; // expected-warning{{use of uninitialized variable 'x'}}
111  *x = 1; // no-warning
112}
113
114