uninit-variables-conditional.cpp revision c5e43c19ddb40b8a1371291f73ae66fe54951ca5
1c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -Wconditional-uninitialized -fsyntax-only %s -verify
2c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek
3c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenekclass Foo {
4c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenekpublic:
5c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  Foo();
6c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  ~Foo();
7c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  operator bool();
8c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek};
9c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek
10c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenekint bar();
11c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenekint baz();
12c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenekint init(double *);
13c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek
14c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek// This case flags a false positive under -Wconditional-uninitialized because
15c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek// the destructor in Foo fouls about the minor bit of path-sensitivity in
16c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek// -Wuninitialized.
17c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenekdouble test() {
18c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  double x; // expected-note {{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}}
19c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  if (bar() || baz() || Foo() || init(&x)) {
20c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek    return x; // expected-warning {{variable 'x' is possibly uninitialized when used here}}
21c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  }
22c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek  return 1.0;
23c5e43c19ddb40b8a1371291f73ae66fe54951ca5Ted Kremenek}
24