1 // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s
2 
3 namespace implicit_constructor {
4 struct S {
5 public:
Simplicit_constructor::S6   S() {}
Simplicit_constructor::S7   S(const S &) {}
8 };
9 
10 // Warning is in a weird position because the body of the constructor is
11 // missing. Specify which field is being assigned.
12 class C { // expected-warning{{Value assigned to field 'y' in implicit constructor is garbage or undefined}}
13           // expected-note@-1{{Value assigned to field 'y' in implicit constructor is garbage or undefined}}
14   int x, y;
15   S s;
16 
17 public:
C()18   C(): x(0) {}
19 };
20 
test()21 void test() {
22   C c1;
23   C c2(c1); // expected-note{{Calling implicit copy constructor for 'C'}}
24 }
25 } // end namespace implicit_constructor
26 
27 
28 namespace explicit_constructor {
29 class C {
30   int x, y;
31 
32 public:
C()33   C(): x(0) {}
34   // It is not necessary to specify which field is being assigned to.
C(const C & c)35   C(const C &c):
36     x(c.x),
37     y(c.y) // expected-warning{{Assigned value is garbage or undefined}}
38            // expected-note@-1{{Assigned value is garbage or undefined}}
39   {}
40 };
41 
test()42 void test() {
43   C c1;
44   C c2(c1); // expected-note{{Calling copy constructor for 'C'}}
45 }
46 } // end namespace explicit_constructor
47 
48 
49 namespace base_class_constructor {
50 struct S {
51 public:
Sbase_class_constructor::S52   S() {}
Sbase_class_constructor::S53   S(const S &) {}
54 };
55 
56 class C { // expected-warning{{Value assigned to field 'y' in implicit constructor is garbage or undefined}}
57           // expected-note@-1{{Value assigned to field 'y' in implicit constructor is garbage or undefined}}
58   int x, y;
59   S s;
60 
61 public:
C()62   C(): x(0) {}
63 };
64 
65 class D: public C {
66 public:
D()67   D(): C() {}
68 };
69 
test()70 void test() {
71   D d1;
72   D d2(d1); // expected-note   {{Calling implicit copy constructor for 'D'}}
73             // expected-note@-1{{Calling implicit copy constructor for 'C'}}
74 }
75 } // end namespace base_class_constructor
76