1 // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify -std=c++98 %s 3 // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify -std=c++11 %s 4 5 class A { 6 int m; 7 public: 8 A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}} 9 A(int); 10 }; 11 12 class B : public A { 13 public: 14 B() : A(), m(1), n(3.14) { } 15 16 private: 17 int m; 18 float n; 19 }; 20 21 22 class C : public virtual B { 23 public: 24 C() : B() { } 25 }; 26 27 class D : public C { 28 public: 29 D() : B(), C() { } 30 }; 31 32 class E : public D, public B { // expected-warning{{direct base 'B' is inaccessible due to ambiguity:\n class E -> class D -> class C -> class B\n class E -> class B}} 33 public: 34 E() : B(), D() { } // expected-error{{base class initializer 'B' names both a direct base class and an inherited virtual base class}} 35 }; 36 37 38 typedef int INT; 39 40 class F : public B { 41 public: 42 int B; 43 44 F() : B(17), 45 m(17), // expected-error{{member initializer 'm' does not name a non-static data member or base class}} 46 INT(17) // expected-error{{constructor initializer 'INT' (aka 'int') does not name a class}} 47 { 48 } 49 }; 50 51 class G : A { 52 G() : A(10); // expected-error{{expected '{'}} 53 }; 54 55 void f() : a(242) { } // expected-error{{only constructors take base initializers}} 56 57 class H : A { 58 H(); 59 }; 60 61 H::H() : A(10) { } 62 63 64 class X {}; 65 class Y {}; 66 67 struct S : Y, virtual X { 68 S (); 69 }; 70 71 struct Z : S { 72 Z() : X(), S(), E() {} // expected-error {{type 'E' is not a direct or virtual base of 'Z'}} 73 }; 74 75 class U { 76 union { int a; char* p; }; 77 union { int b; double d; }; 78 79 U() : a(1), // expected-note {{previous initialization is here}} 80 p(0), // expected-error {{initializing multiple members of union}} 81 d(1.0) {} 82 }; 83 84 struct V {}; 85 struct Base {}; 86 struct Base1 {}; 87 88 struct Derived : Base, Base1, virtual V { 89 Derived (); 90 }; 91 92 struct Current : Derived { 93 int Derived; 94 Current() : Derived(1), ::Derived(), // expected-warning {{field 'Derived' will be initialized after base '::Derived'}} \ 95 // expected-warning {{base class '::Derived' will be initialized after base 'Derived::V'}} 96 ::Derived::Base(), // expected-error {{type '::Derived::Base' is not a direct or virtual base of 'Current'}} 97 Derived::Base1(), // expected-error {{type 'Derived::Base1' is not a direct or virtual base of 'Current'}} 98 Derived::V(), 99 ::NonExisting(), // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}} 100 INT::NonExisting() {} // expected-error {{'INT' (aka 'int') is not a class, namespace, or enumeration}} \ 101 // expected-error {{member initializer 'NonExisting' does not name a non-static data member or}} 102 }; 103 104 struct M { // expected-note 2 {{candidate constructor (the implicit copy constructor)}} 105 #if __cplusplus >= 201103L // C++11 or later 106 // expected-note@-2 2 {{candidate constructor (the implicit move constructor) not viable}} 107 #endif 108 // expected-note@-4 2 {{'M' declared here}} 109 M(int i, int j); // expected-note 2 {{candidate constructor}} 110 }; 111 112 struct N : M { 113 N() : M(1), // expected-error {{no matching constructor for initialization of 'M'}} 114 m1(100) { } // expected-error {{no matching constructor for initialization of 'M'}} 115 M m1; 116 }; 117 118 struct P : M { 119 P() { } // expected-error {{constructor for 'P' must explicitly initialize the base class 'M' which does not have a default constructor}} \ 120 // expected-error {{member 'm'}} 121 M m; // expected-note {{member is declared here}} 122 }; 123 124 struct Q { 125 Q() : f1(1,2), // expected-error {{excess elements in scalar initializer}} 126 pf(0.0) { } // expected-error {{cannot initialize a member subobject of type 'float *' with an rvalue of type 'double'}} 127 float f1; 128 129 float *pf; 130 }; 131 132 // A silly class used to demonstrate field-is-uninitialized in constructors with 133 // multiple params. 134 int IntParam(int i) { return 0; }; 135 class TwoInOne { public: TwoInOne(TwoInOne a, TwoInOne b) {} }; 136 class InitializeUsingSelfTest { 137 bool A; 138 char* B; 139 int C; 140 TwoInOne D; 141 int E; 142 InitializeUsingSelfTest(int F) 143 : A(A), // expected-warning {{field 'A' is uninitialized when used here}} 144 B((((B)))), // expected-warning {{field 'B' is uninitialized when used here}} 145 C(A && InitializeUsingSelfTest::C), // expected-warning {{field 'C' is uninitialized when used here}} 146 D(D, // expected-warning {{field 'D' is uninitialized when used here}} 147 D), // expected-warning {{field 'D' is uninitialized when used here}} 148 E(IntParam(E)) {} // expected-warning {{field 'E' is uninitialized when used here}} 149 }; 150 151 int IntWrapper(int &i) { return 0; }; 152 class InitializeUsingSelfExceptions { 153 int A; 154 int B; 155 int C; 156 void *P; 157 InitializeUsingSelfExceptions(int B) 158 : A(IntWrapper(A)), // Due to a conservative implementation, we do not report warnings inside function/ctor calls even though it is possible to do so. 159 B(B), // Not a warning; B is a local variable. 160 C(sizeof(C)), // sizeof doesn't reference contents, do not warn 161 P(&P) {} // address-of doesn't reference contents (the pointer may be dereferenced in the same expression but it would be rare; and weird) 162 }; 163 164 class CopyConstructorTest { 165 bool A, B, C; 166 CopyConstructorTest(const CopyConstructorTest& rhs) 167 : A(rhs.A), 168 B(B), // expected-warning {{field 'B' is uninitialized when used here}} 169 C(rhs.C || C) { } // expected-warning {{field 'C' is uninitialized when used here}} 170 }; 171 172 // Make sure we aren't marking default constructors when we shouldn't be. 173 template<typename T> 174 struct NDC { 175 T &ref; 176 177 NDC() { } 178 NDC(T &ref) : ref(ref) { } 179 }; 180 181 struct X0 : NDC<int> { 182 X0(int &ref) : NDC<int>(ref), ndc(ref) { } 183 184 NDC<int> ndc; 185 }; 186 187 namespace Test0 { 188 189 struct A { A(); }; 190 191 struct B { 192 B() { } 193 const A a; 194 }; 195 196 } 197 198 namespace Test1 { 199 struct A { 200 enum Kind { Foo } Kind; 201 A() : Kind(Foo) {} 202 }; 203 } 204 205 namespace Test2 { 206 207 struct A { 208 A(const A&); 209 }; 210 211 struct B : virtual A { }; 212 213 struct C : A, B { }; // expected-warning{{direct base 'Test2::A' is inaccessible due to ambiguity:\n struct Test2::C -> struct Test2::A\n struct Test2::C -> struct Test2::B -> struct Test2::A}} 214 215 C f(C c) { 216 return c; 217 } 218 219 } 220 221 // Don't build implicit initializers for anonymous union fields when we already 222 // have an explicit initializer for another field in the union. 223 namespace PR7402 { 224 struct S { 225 union { 226 void* ptr_; 227 struct { int i_; }; 228 }; 229 230 template <typename T> S(T) : ptr_(0) { } 231 }; 232 233 void f() { 234 S s(3); 235 } 236 } 237 238 // <rdar://problem/8308215>: don't crash. 239 // Lots of questionable recovery here; errors can change. 240 namespace test3 { 241 class A : public std::exception {}; // expected-error {{undeclared identifier}} expected-error {{expected class name}} 242 // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable}} 243 #if __cplusplus >= 201103L // C++11 or later 244 // expected-note@-3 {{candidate constructor (the implicit move constructor) not viable}} 245 #endif 246 // expected-note@-5 {{candidate constructor (the implicit default constructor) not viable}} 247 248 class B : public A { 249 public: 250 B(const String& s, int e=0) // expected-error {{unknown type name}} 251 : A(e), m_String(s) , m_ErrorStr(__null) {} // expected-error {{no matching constructor}} expected-error {{does not name}} 252 B(const B& e) 253 : A(e), m_String(e.m_String), m_ErrorStr(__null) { // expected-error {{does not name}} \ 254 // expected-error {{no member named 'm_String' in 'test3::B'}} 255 } 256 }; 257 } 258 259 // PR8075 260 namespace PR8075 { 261 262 struct S1 { 263 enum { FOO = 42 }; 264 static const int bar = 42; 265 static int baz(); 266 S1(int); 267 }; 268 269 const int S1::bar; 270 271 struct S2 { 272 S1 s1; 273 S2() : s1(s1.FOO) {} 274 }; 275 276 struct S3 { 277 S1 s1; 278 S3() : s1(s1.bar) {} 279 }; 280 281 struct S4 { 282 S1 s1; 283 S4() : s1(s1.baz()) {} 284 }; 285 286 } 287 288 namespace PR12049 { 289 int function(); 290 291 class Class 292 { 293 public: 294 Class() : member(function() {} // expected-note {{to match this '('}} 295 296 int member; // expected-error {{expected ')'}} 297 }; 298 } 299 300 namespace PR14073 { 301 struct S1 { union { int n; }; S1() : n(n) {} }; // expected-warning {{field 'n' is uninitialized when used here}} 302 struct S2 { union { union { int n; }; char c; }; S2() : n(n) {} }; // expected-warning {{field 'n' is uninitialized when used here}} 303 struct S3 { struct { int n; }; S3() : n(n) {} }; // expected-warning {{field 'n' is uninitialized when used here}} 304 } 305