1a82ffe9dSArtem Dergachev // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s 2a82ffe9dSArtem Dergachev 3a82ffe9dSArtem Dergachev void clang_analyzer_eval(bool); 4a82ffe9dSArtem Dergachev 5a82ffe9dSArtem Dergachev namespace basic_tests { 6a82ffe9dSArtem Dergachev struct A { 7a82ffe9dSArtem Dergachev int x; Abasic_tests::A8a82ffe9dSArtem Dergachev A(int x): x(x) {} 9a82ffe9dSArtem Dergachev }; 10a82ffe9dSArtem Dergachev 11a82ffe9dSArtem Dergachev struct B : A { 12a82ffe9dSArtem Dergachev using A::A; 13a82ffe9dSArtem Dergachev }; 14a82ffe9dSArtem Dergachev 15a82ffe9dSArtem Dergachev struct C : B { 16a82ffe9dSArtem Dergachev using B::B; 17a82ffe9dSArtem Dergachev }; 18a82ffe9dSArtem Dergachev test_B()19a82ffe9dSArtem Dergachevvoid test_B() { 20a82ffe9dSArtem Dergachev B b(1); 21a82ffe9dSArtem Dergachev clang_analyzer_eval(b.x == 1); // expected-warning{{TRUE}} 22a82ffe9dSArtem Dergachev } 23a82ffe9dSArtem Dergachev test_C()24a82ffe9dSArtem Dergachevvoid test_C() { 25a82ffe9dSArtem Dergachev C c(2); 26a82ffe9dSArtem Dergachev clang_analyzer_eval(c.x == 2); // expected-warning{{TRUE}} 27a82ffe9dSArtem Dergachev } 28a82ffe9dSArtem Dergachev } // namespace basic_tests 29a82ffe9dSArtem Dergachev 30a82ffe9dSArtem Dergachev namespace arguments_with_constructors { 31a82ffe9dSArtem Dergachev struct S { 32a82ffe9dSArtem Dergachev int x, y; Sarguments_with_constructors::S33a82ffe9dSArtem Dergachev S(int x, int y): x(x), y(y) {} ~Sarguments_with_constructors::S34a82ffe9dSArtem Dergachev ~S() {} 35a82ffe9dSArtem Dergachev }; 36a82ffe9dSArtem Dergachev 37a82ffe9dSArtem Dergachev struct A { 38a82ffe9dSArtem Dergachev S s; 39a82ffe9dSArtem Dergachev int z; Aarguments_with_constructors::A40a82ffe9dSArtem Dergachev A(S s, int z) : s(s), z(z) {} 41a82ffe9dSArtem Dergachev }; 42a82ffe9dSArtem Dergachev 43a82ffe9dSArtem Dergachev struct B : A { 44a82ffe9dSArtem Dergachev using A::A; 45a82ffe9dSArtem Dergachev }; 46a82ffe9dSArtem Dergachev test_B()47a82ffe9dSArtem Dergachevvoid test_B() { 48a82ffe9dSArtem Dergachev B b(S(1, 2), 3); 49a82ffe9dSArtem Dergachev // FIXME: There should be no execution path on which this is false. 50a82ffe9dSArtem Dergachev clang_analyzer_eval(b.s.x == 1); // expected-warning{{TRUE}} 51a82ffe9dSArtem Dergachev // expected-warning@-1{{FALSE}} 52a82ffe9dSArtem Dergachev 53a82ffe9dSArtem Dergachev // FIXME: There should be no execution path on which this is false. 54a82ffe9dSArtem Dergachev clang_analyzer_eval(b.s.y == 2); // expected-warning{{TRUE}} 55a82ffe9dSArtem Dergachev // expected-warning@-1{{FALSE}} 56a82ffe9dSArtem Dergachev 57a82ffe9dSArtem Dergachev clang_analyzer_eval(b.z == 3); // expected-warning{{TRUE}} 58a82ffe9dSArtem Dergachev } 59a82ffe9dSArtem Dergachev } // namespace arguments_with_constructors 60*59a960b8SGabor Marton 61*59a960b8SGabor Marton namespace inherited_constructor_crash { 62*59a960b8SGabor Marton class a { 63*59a960b8SGabor Marton public: 64*59a960b8SGabor Marton a(int); 65*59a960b8SGabor Marton }; 66*59a960b8SGabor Marton struct b : a { 67*59a960b8SGabor Marton using a::a; // Ihnerited ctor. 68*59a960b8SGabor Marton }; c()69*59a960b8SGabor Martonvoid c() { 70*59a960b8SGabor Marton int d; 71*59a960b8SGabor Marton // This construct expr utilizes the inherited ctor. 72*59a960b8SGabor Marton // Note that d must be uninitialized to cause the crash. 73*59a960b8SGabor Marton (b(d)); // expected-warning{{1st function call argument is an uninitialized value}} 74*59a960b8SGabor Marton } 75*59a960b8SGabor Marton } // namespace inherited_constructor_crash 76