1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 23da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 33da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanianstruct X1 { // has no implicit default constructor 43da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian X1(int); 53da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 63da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 77c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct X2 : X1 { // expected-note 2 {{'X2' declared here}} 83da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian X2(int); 93da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 103da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 117c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct X3 : public X2 { // expected-error {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}} 123da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 1380c30dad6c6fca077293125a96f464b6c8857171Eli FriedmanX3 x3; // expected-note {{first required here}} 143da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 153da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 1649c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedmanstruct X4 { // expected-error {{must explicitly initialize the member 'x2'}} \ 1749c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedman // expected-error {{must explicitly initialize the reference member 'rx2'}} 180c728f1eb2e8e6e5adc2501c6fdcd87105b34d5cFariborz Jahanian X2 x2; // expected-note {{member is declared here}} 19d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson X2 & rx2; // expected-note {{declared here}} 203da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 213da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 2280c30dad6c6fca077293125a96f464b6c8857171Eli FriedmanX4 x4; // expected-note {{first required here}} 233da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 243da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 253da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanianstruct Y1 { // has no implicit default constructor 263da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian Y1(int); 273da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 283da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 293da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanianstruct Y2 : Y1 { 303da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian Y2(int); 313da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian Y2(); 323da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 333da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 343da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanianstruct Y3 : public Y2 { 353da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 363da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz JahanianY3 y3; 373da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 383da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanianstruct Y4 { 393da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian Y2 y2; 403da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 413da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 423da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz JahanianY4 y4; 433da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 443da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian// More tests 453da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 4649c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedmanstruct Z1 { // expected-error {{must explicitly initialize the reference member 'z'}} \ 4749c16da71b9c95cc53b4af6de2833a022cb69b6aEli Friedman // expected-error {{must explicitly initialize the const member 'c1'}} 48d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson int& z; // expected-note {{declared here}} 49d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson const int c1; // expected-note {{declared here}} 501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump volatile int v1; 513da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian}; 523da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 534e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth// Test default initialization which *requires* a constructor call for non-POD. 5480c30dad6c6fca077293125a96f464b6c8857171Eli FriedmanZ1 z1; // expected-note {{first required here}} 553da83eb7bcfa6bd476ab804ecb6cf755b39a6f92Fariborz Jahanian 564e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth// Ensure that value initialization doesn't use trivial implicit constructors. 574e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruthnamespace PR7948 { 584e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth // Note that this is also non-POD to ensure we don't just special case PODs. 594e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth struct S { const int x; ~S(); }; 604e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth const S arr[2] = { { 42 } }; 614e6fbce4277fbc7c574fb2393c7dfe06f014c21aChandler Carruth} 621f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt 631f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt// This is valid 641f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntunion U { 651f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt const int i; 661f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt float f; 671f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt}; 681f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean HuntU u; 69