1b831c673621c5587642343cace9def134916a17bTed Kremenek// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fcxx-exceptions %s -verify
2c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek
3866849498461cf9022316034516475188b25955bChandler Carruth// Stub out types for 'typeid' to work.
4866849498461cf9022316034516475188b25955bChandler Carruthnamespace std { class type_info {}; }
5866849498461cf9022316034516475188b25955bChandler Carruth
6c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekint test1_aux(int &x);
7c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekint test1() {
8c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  int x;
9c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  test1_aux(x);
10c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  return x; // no-warning
11c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek}
12c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek
13c21fed361c11f13db345cba69101578578d8fb79Ted Kremenekint test2_aux() {
14c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  int x;
15c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  int &y = x;
16c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek  return x; // no-warning
17c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek}
18c21fed361c11f13db345cba69101578578d8fb79Ted Kremenek
19866849498461cf9022316034516475188b25955bChandler Carruth// Don't warn on unevaluated contexts.
20866849498461cf9022316034516475188b25955bChandler Carruthvoid unevaluated_tests() {
21866849498461cf9022316034516475188b25955bChandler Carruth  int x;
22866849498461cf9022316034516475188b25955bChandler Carruth  (void)sizeof(x);
23866849498461cf9022316034516475188b25955bChandler Carruth  (void)typeid(x);
24866849498461cf9022316034516475188b25955bChandler Carruth}
25866849498461cf9022316034516475188b25955bChandler Carruth
26866849498461cf9022316034516475188b25955bChandler Carruth// Warn for glvalue arguments to typeid whose type is polymorphic.
27866849498461cf9022316034516475188b25955bChandler Carruthstruct A { virtual ~A() {} };
28866849498461cf9022316034516475188b25955bChandler Carruthvoid polymorphic_test() {
294f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  A *a; // expected-note{{initialize the variable 'a' to silence this warning}}
30866849498461cf9022316034516475188b25955bChandler Carruth  (void)typeid(*a); // expected-warning{{variable 'a' is uninitialized when used here }}
31866849498461cf9022316034516475188b25955bChandler Carruth}
32866849498461cf9022316034516475188b25955bChandler Carruth
332d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek// Handle cases where the CFG may constant fold some branches, thus
342d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek// mitigating the need for some path-sensitivity in the analysis.
352d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenekunsigned test3_aux();
362d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenekunsigned test3() {
372d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  unsigned x = 0;
382d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  const bool flag = true;
392d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  if (flag && (x = test3_aux()) == 0) {
402d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek    return x;
412d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  }
422d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  return x;
432d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek}
442d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenekunsigned test3_b() {
452d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  unsigned x ;
462d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  const bool flag = true;
472d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  if (flag && (x = test3_aux()) == 0) {
482d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek    x = 1;
492d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  }
502d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  return x; // no-warning
512d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek}
522d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenekunsigned test3_c() {
534f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  unsigned x; // expected-note{{initialize the variable 'x' to silence this warning}}
542d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  const bool flag = false;
552d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  if (flag && (x = test3_aux()) == 0) {
562d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek    x = 1;
572d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek  }
58f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth  return x; // expected-warning{{variable 'x' is uninitialized when used here}}
592d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek}
602d4bed140f65d713673d2d32ec3adadc960078c6Ted Kremenek
6109f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenekenum test4_A {
6209f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenek test4_A_a, test_4_A_b
6309f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenek};
6409f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenektest4_A test4() {
6509f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenek test4_A a; // expected-note{{variable 'a' is declared here}}
66f04eb2de1f17dce4dfaebbf9002844087b7d357dChandler Carruth return a; // expected-warning{{variable 'a' is uninitialized when used here}}
6709f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenek}
6809f57b966c2a6c0a1c8d2e0be9862f6b2c89f9f4Ted Kremenek
69dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek// Test variables getting invalidated by function calls with reference arguments
70dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek// *AND* there are multiple invalidated arguments.
71dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenekvoid test5_aux(int &, int &);
72dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek
73dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenekint test5() {
74dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek  int x, y;
75dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek  test5_aux(x, y);
76dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek  return x + y; // no-warning
77dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek}
78dd4286b5b7b02b8bb962e4b996b8f36cb7935d4fTed Kremenek
79b831c673621c5587642343cace9def134916a17bTed Kremenek// This test previously crashed Sema.
80b831c673621c5587642343cace9def134916a17bTed Kremenekclass Rdar9188004A {
81b831c673621c5587642343cace9def134916a17bTed Kremenekpublic:
82b831c673621c5587642343cace9def134916a17bTed Kremenek  virtual ~Rdar9188004A();
83b831c673621c5587642343cace9def134916a17bTed Kremenek};
84b831c673621c5587642343cace9def134916a17bTed Kremenek
85b831c673621c5587642343cace9def134916a17bTed Kremenektemplate< typename T > class Rdar9188004B : public Rdar9188004A {
86b831c673621c5587642343cace9def134916a17bTed Kremenekvirtual double *foo(Rdar9188004B *next) const  {
87b831c673621c5587642343cace9def134916a17bTed Kremenek    double *values = next->foo(0);
88b831c673621c5587642343cace9def134916a17bTed Kremenek    try {
89b831c673621c5587642343cace9def134916a17bTed Kremenek    }
90b831c673621c5587642343cace9def134916a17bTed Kremenek    catch(double e) {
91b831c673621c5587642343cace9def134916a17bTed Kremenek      values[0] = e;
92b831c673621c5587642343cace9def134916a17bTed Kremenek    }
93b831c673621c5587642343cace9def134916a17bTed Kremenek    return 0;
94b831c673621c5587642343cace9def134916a17bTed Kremenek  }
95b831c673621c5587642343cace9def134916a17bTed Kremenek};
96b831c673621c5587642343cace9def134916a17bTed Kremenekclass Rdar9188004C : public Rdar9188004B<Rdar9188004A> {
97b831c673621c5587642343cace9def134916a17bTed Kremenek  virtual void bar(void) const;
98b831c673621c5587642343cace9def134916a17bTed Kremenek};
99b831c673621c5587642343cace9def134916a17bTed Kremenekvoid Rdar9188004C::bar(void) const {}
100f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek
101f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek// Don't warn about uninitialized variables in unreachable code.
102f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenekvoid PR9625() {
103f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek  if (false) {
104f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek    int x;
105f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek    (void)static_cast<float>(x); // no-warning
106f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek  }
107f8adeefa9e9882bff402e092024dd457f8574673Ted Kremenek}
108a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek
109a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek// Don't warn about variables declared in "catch"
110a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenekvoid RDar9251392_bar(const char *msg);
111a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek
112a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenekvoid RDar9251392() {
113a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek  try {
114a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek    throw "hi";
115a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek  }
116a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek  catch (const char* msg) {
117a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek    RDar9251392_bar(msg); // no-warning
118a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek  }
119a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek}
120a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek
12157fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek// Test handling of "no-op" casts.
12257fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenekvoid test_noop_cast()
12357fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek{
12457fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek    int x = 1;
12557fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek    int y = (int&)x; // no-warning
12657fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek}
12757fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek
12857fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenekvoid test_noop_cast2() {
1294f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie    int x; // expected-note {{initialize the variable 'x' to silence this warning}}
13057fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek    int y = (int&)x; // expected-warning {{uninitialized when used here}}
13157fb591a54eab7db65d73e77c632f047bca22c54Ted Kremenek}
132a21612f95792c1ea8b4362f0861f0c724c39388eTed Kremenek
133de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek// Test handling of bit casts.
134de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenekvoid test_bitcasts() {
135de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek  int x = 1;
136de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek  int y = (float &)x; // no-warning
137de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek}
138de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek
139de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenekvoid test_bitcasts_2() {
1404f4f349208b2b2307454e169ac7b039e989f003fDavid Blaikie  int x;  // expected-note {{initialize the variable 'x' to silence this warning}}
141de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek  int y = (float &)x; // expected-warning {{uninitialized when used here}}
142de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek}
143de091aeb4658e986ed8fa5fbce7ab35ef2ae26ecTed Kremenek
144