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