1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store region -cfg-add-implicit-dtors -std=c++11 -verify %s 2 3 // We don't inline constructors unless we have destructors turned on. 4 5 void clang_analyzer_eval(bool); 6 7 class A { 8 int x; 9 public: 10 A(); 11 }; 12 13 A::A() : x(0) { 14 clang_analyzer_eval(x == 0); // expected-warning{{TRUE}} 15 } 16 17 18 class DirectMember { 19 int x; 20 public: 21 DirectMember(int value) : x(value) {} 22 23 int getX() { return x; } 24 }; 25 26 void testDirectMember() { 27 DirectMember obj(3); 28 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} 29 } 30 31 32 class IndirectMember { 33 struct { 34 int x; 35 }; 36 public: 37 IndirectMember(int value) : x(value) {} 38 39 int getX() { return x; } 40 }; 41 42 void testIndirectMember() { 43 IndirectMember obj(3); 44 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} 45 } 46 47 48 struct DelegatingConstructor { 49 int x; 50 DelegatingConstructor(int y) { x = y; } 51 DelegatingConstructor() : DelegatingConstructor(42) {} 52 }; 53 54 void testDelegatingConstructor() { 55 DelegatingConstructor obj; 56 clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}} 57 } 58 59 60 // ------------------------------------ 61 // False negatives 62 // ------------------------------------ 63 64 struct RefWrapper { 65 RefWrapper(int *p) : x(*p) {} 66 RefWrapper(int &r) : x(r) {} 67 int &x; 68 }; 69 70 void testReferenceMember() { 71 int *p = 0; 72 RefWrapper X(p); // should warn in the constructor 73 } 74 75 void testReferenceMember2() { 76 int *p = 0; 77 RefWrapper X(*p); // should warn here 78 } 79