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