initializer.cpp revision ee04959f88e26ed38dccf4aed2ff10cad1f703c9
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=inlining -cfg-add-implicit-dtors -std=c++11 -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 48struct DelegatingConstructor { 49 int x; 50 DelegatingConstructor(int y) { x = y; } 51 DelegatingConstructor() : DelegatingConstructor(42) {} 52}; 53 54void testDelegatingConstructor() { 55 DelegatingConstructor obj; 56 clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}} 57} 58 59 60// ------------------------------------ 61// False negatives 62// ------------------------------------ 63 64struct RefWrapper { 65 RefWrapper(int *p) : x(*p) {} 66 RefWrapper(int &r) : x(r) {} 67 int &x; 68}; 69 70void testReferenceMember() { 71 int *p = 0; 72 RefWrapper X(p); // should warn in the constructor 73} 74 75void testReferenceMember2() { 76 int *p = 0; 77 RefWrapper X(*p); // should warn here 78} 79