initializer.cpp revision 018e9aa033ff7363797c62fc3b14669d0558284b
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=constructors -std=c++11 -verify %s
2
3void clang_analyzer_eval(bool);
4
5class A {
6  int x;
7public:
8  A();
9};
10
11A::A() : x(0) {
12  clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
13}
14
15
16class DirectMember {
17  int x;
18public:
19  DirectMember(int value) : x(value) {}
20
21  int getX() { return x; }
22};
23
24void testDirectMember() {
25  DirectMember obj(3);
26  clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
27}
28
29
30class IndirectMember {
31  struct {
32    int x;
33  };
34public:
35  IndirectMember(int value) : x(value) {}
36
37  int getX() { return x; }
38};
39
40void testIndirectMember() {
41  IndirectMember obj(3);
42  clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
43}
44
45
46struct DelegatingConstructor {
47  int x;
48  DelegatingConstructor(int y) { x = y; }
49  DelegatingConstructor() : DelegatingConstructor(42) {}
50};
51
52void testDelegatingConstructor() {
53  DelegatingConstructor obj;
54  clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
55}
56
57
58struct RefWrapper {
59  RefWrapper(int *p) : x(*p) {}
60  RefWrapper(int &r) : x(r) {}
61  int &x;
62};
63
64void testReferenceMember() {
65  int *p = 0;
66  RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
67}
68
69void testReferenceMember2() {
70  int *p = 0;
71  RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}}
72}
73
74
75extern "C" char *strdup(const char *);
76
77class StringWrapper {
78  char *str;
79public:
80  StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
81};
82
83
84// PR15070 - Constructing a type containing a non-POD array mistakenly
85// tried to perform a bind instead of relying on the CXXConstructExpr,
86// which caused a cast<> failure in RegionStore.
87namespace DefaultConstructorWithCleanups {
88  class Element {
89  public:
90    int value;
91
92    class Helper {
93    public:
94      ~Helper();
95    };
96    Element(Helper h = Helper());
97  };
98  class Wrapper {
99  public:
100    Element arr[2];
101
102    Wrapper();
103  };
104
105  Wrapper::Wrapper() /* initializers synthesized */ {}
106
107  int test() {
108    Wrapper w;
109    return w.arr[0].value; // no-warning
110  }
111}
112