18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s 21c9d5d95SFariborz Jahanian 31c9d5d95SFariborz Jahanian struct X1 { // has no implicit default constructor 41c9d5d95SFariborz Jahanian X1(int); 51c9d5d95SFariborz Jahanian }; 61c9d5d95SFariborz Jahanian 785f90559SJohn McCall struct X2 : X1 { // expected-note 2 {{'X2' declared here}} 81c9d5d95SFariborz Jahanian X2(int); 91c9d5d95SFariborz Jahanian }; 101c9d5d95SFariborz Jahanian 1185f90559SJohn McCall struct X3 : public X2 { // expected-error {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}} 121c9d5d95SFariborz Jahanian }; 139cf6b594SEli Friedman X3 x3; // expected-note {{first required here}} 141c9d5d95SFariborz Jahanian 151c9d5d95SFariborz Jahanian 16d7686ef3SEli Friedman struct X4 { // expected-error {{must explicitly initialize the member 'x2'}} \ 17d7686ef3SEli Friedman // expected-error {{must explicitly initialize the reference member 'rx2'}} 188ae5b0a1SFariborz Jahanian X2 x2; // expected-note {{member is declared here}} 1958e24a8fSAnders Carlsson X2 & rx2; // expected-note {{declared here}} 201c9d5d95SFariborz Jahanian }; 211c9d5d95SFariborz Jahanian 229cf6b594SEli Friedman X4 x4; // expected-note {{first required here}} 231c9d5d95SFariborz Jahanian 241c9d5d95SFariborz Jahanian 251c9d5d95SFariborz Jahanian struct Y1 { // has no implicit default constructor 261c9d5d95SFariborz Jahanian Y1(int); 271c9d5d95SFariborz Jahanian }; 281c9d5d95SFariborz Jahanian 291c9d5d95SFariborz Jahanian struct Y2 : Y1 { 301c9d5d95SFariborz Jahanian Y2(int); 311c9d5d95SFariborz Jahanian Y2(); 321c9d5d95SFariborz Jahanian }; 331c9d5d95SFariborz Jahanian 341c9d5d95SFariborz Jahanian struct Y3 : public Y2 { 351c9d5d95SFariborz Jahanian }; 361c9d5d95SFariborz Jahanian Y3 y3; 371c9d5d95SFariborz Jahanian 381c9d5d95SFariborz Jahanian struct Y4 { 391c9d5d95SFariborz Jahanian Y2 y2; 401c9d5d95SFariborz Jahanian }; 411c9d5d95SFariborz Jahanian 421c9d5d95SFariborz Jahanian Y4 y4; 431c9d5d95SFariborz Jahanian 441c9d5d95SFariborz Jahanian // More tests 451c9d5d95SFariborz Jahanian 46d7686ef3SEli Friedman struct Z1 { // expected-error {{must explicitly initialize the reference member 'z'}} \ 47d7686ef3SEli Friedman // expected-error {{must explicitly initialize the const member 'c1'}} 4858e24a8fSAnders Carlsson int& z; // expected-note {{declared here}} 4958e24a8fSAnders Carlsson const int c1; // expected-note {{declared here}} 501c9d5d95SFariborz Jahanian volatile int v1; 511c9d5d95SFariborz Jahanian }; 521c9d5d95SFariborz Jahanian 53c9262401SChandler Carruth // Test default initialization which *requires* a constructor call for non-POD. 549cf6b594SEli Friedman Z1 z1; // expected-note {{first required here}} 551c9d5d95SFariborz Jahanian 56c9262401SChandler Carruth // Ensure that value initialization doesn't use trivial implicit constructors. 57c9262401SChandler Carruth namespace PR7948 { 58c9262401SChandler Carruth // Note that this is also non-POD to ensure we don't just special case PODs. 59c9262401SChandler Carruth struct S { const int x; ~S(); }; 60c9262401SChandler Carruth const S arr[2] = { { 42 } }; 61c9262401SChandler Carruth } 62*8b455184SAlexis Hunt 63*8b455184SAlexis Hunt // This is valid 64*8b455184SAlexis Hunt union U { 65*8b455184SAlexis Hunt const int i; 66*8b455184SAlexis Hunt float f; 67*8b455184SAlexis Hunt }; 68*8b455184SAlexis Hunt U u; 69