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