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