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