| // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s | 
 |  | 
 | void clang_analyzer_eval(bool); | 
 |  | 
 | namespace basic_tests { | 
 | struct A { | 
 |   int x; | 
 |   A(int x): x(x) {} | 
 | }; | 
 |  | 
 | struct B : A { | 
 |   using A::A; | 
 | }; | 
 |  | 
 | struct C : B { | 
 |   using B::B; | 
 | }; | 
 |  | 
 | void test_B() { | 
 |   B b(1); | 
 |   clang_analyzer_eval(b.x == 1); // expected-warning{{TRUE}} | 
 | } | 
 |  | 
 | void test_C() { | 
 |   C c(2); | 
 |   clang_analyzer_eval(c.x == 2); // expected-warning{{TRUE}} | 
 | } | 
 | } // namespace basic_tests | 
 |  | 
 | namespace arguments_with_constructors { | 
 | struct S { | 
 |   int x, y; | 
 |   S(int x, int y): x(x), y(y) {} | 
 |   ~S() {} | 
 | }; | 
 |  | 
 | struct A { | 
 |   S s; | 
 |   int z; | 
 |   A(S s, int z) : s(s), z(z) {} | 
 | }; | 
 |  | 
 | struct B : A { | 
 |   using A::A; | 
 | }; | 
 |  | 
 | void test_B() { | 
 |   B b(S(1, 2), 3); | 
 |   // FIXME: There should be no execution path on which this is false. | 
 |   clang_analyzer_eval(b.s.x == 1); // expected-warning{{TRUE}} | 
 |                                    // expected-warning@-1{{FALSE}} | 
 |  | 
 |   // FIXME: There should be no execution path on which this is false. | 
 |   clang_analyzer_eval(b.s.y == 2); // expected-warning{{TRUE}} | 
 |                                    // expected-warning@-1{{FALSE}} | 
 |  | 
 |   clang_analyzer_eval(b.z == 3); // expected-warning{{TRUE}} | 
 | } | 
 | } // namespace arguments_with_constructors | 
 |  | 
 | namespace inherited_constructor_crash { | 
 | class a { | 
 | public: | 
 |   a(int); | 
 | }; | 
 | struct b : a { | 
 |   using a::a; // Ihnerited ctor. | 
 | }; | 
 | void c() { | 
 |   int d; | 
 |   // This construct expr utilizes the inherited ctor. | 
 |   // Note that d must be uninitialized to cause the crash. | 
 |   (b(d)); // expected-warning{{1st function call argument is an uninitialized value}} | 
 | } | 
 | } // namespace inherited_constructor_crash |