forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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
 |