1 // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s 2 3 namespace implicit_constructor { 4 struct S { 5 public: 6 S() {} 7 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: 18 C(): x(0) {} 19 }; 20 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: 33 C(): x(0) {} 34 // It is not necessary to specify which field is being assigned to. 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 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: 52 S() {} 53 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: 62 C(): x(0) {} 63 }; 64 65 class D: public C { 66 public: 67 D(): C() {} 68 }; 69 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