1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
21f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt
31f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntstruct non_trivial {
41f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  non_trivial();
51f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  non_trivial(const non_trivial&);
61f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  non_trivial& operator = (const non_trivial&);
71f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  ~non_trivial();
81f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
91f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt
106c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion bad_union {
116c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  non_trivial nt; // expected-note {{non-trivial default constructor}}
121f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
13e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_union u; // expected-error {{call to implicitly-deleted default constructor}}
146c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion bad_union2 { // expected-note {{all data members are const-qualified}}
151f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  const int i;
161f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
17e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_union2 u2; // expected-error {{call to implicitly-deleted default constructor}}
181f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt
196c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_anon {
201f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  union {
216c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith    non_trivial nt; // expected-note {{non-trivial default constructor}}
221f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  };
231f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
24e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_anon a; // expected-error {{call to implicitly-deleted default constructor}}
256c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_anon2 {
266c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  union { // expected-note {{all data members of an anonymous union member are const-qualified}}
271f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt    const int i;
281f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  };
291f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
30e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_anon2 a2; // expected-error {{call to implicitly-deleted default constructor}}
311f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt
321f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt// This would be great except that we implement
331f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntunion good_union {
341f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  const int i;
351f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  float f;
361f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
371f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntgood_union gu;
381f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntstruct good_anon {
391f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  union {
401f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt    const int i;
411f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt    float f;
421f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  };
431f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
441f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntgood_anon ga;
451f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt
461f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntstruct good : non_trivial {
471f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt  non_trivial nt;
481f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Hunt};
491f2f384eb7d0ea368819fe9cc4cc20a4b337ebeaSean Huntgood g;
50f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
516c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_const {
526c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  const good g; // expected-note {{field 'g' of const-qualified type 'const good' would not be initialized}}
53f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
54e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_const bc; // expected-error {{call to implicitly-deleted default constructor}}
55f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
56f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntstruct good_const {
57f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  const non_trivial nt;
58f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
59f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntgood_const gc;
60f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
61f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntstruct no_default {
625bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smith  no_default() = delete; // expected-note 3{{deleted here}}
63f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
64f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntstruct no_dtor {
656c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  ~no_dtor() = delete; // expected-note 2{{deleted here}}
66f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
67f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
686c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_field_default {
696c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  no_default nd; // expected-note {{field 'nd' has a deleted default constructor}}
70f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
71e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_field_default bfd; // expected-error {{call to implicitly-deleted default constructor}}
726c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_base_default : no_default { // expected-note {{base class 'no_default' has a deleted default constructor}}
73f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
74e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_base_default bbd; // expected-error {{call to implicitly-deleted default constructor}}
75f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
766c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_field_dtor {
776c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  no_dtor nd; // expected-note {{field 'nd' has a deleted destructor}}
78f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
79e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_field_dtor bfx; // expected-error {{call to implicitly-deleted default constructor}}
806c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct bad_base_dtor : no_dtor { // expected-note {{base class 'no_dtor' has a deleted destructor}}
81f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
82e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorbad_base_dtor bbx; // expected-error {{call to implicitly-deleted default constructor}}
83f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
84f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntstruct ambiguous_default {
85f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  ambiguous_default();
86f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  ambiguous_default(int = 2);
87f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
886c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct has_amb_field {
896c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  ambiguous_default ad; // expected-note {{field 'ad' has multiple default constructors}}
90f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
91e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorhas_amb_field haf; // expected-error {{call to implicitly-deleted default constructor}}
92f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
93f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntclass inaccessible_default {
94f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  inaccessible_default();
95f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
966c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct has_inacc_field {
976c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  inaccessible_default id; // expected-note {{field 'id' has an inaccessible default constructor}}
98f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
99e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregorhas_inacc_field hif; // expected-error {{call to implicitly-deleted default constructor}}
100f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
101f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntclass friend_default {
102f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  friend struct has_friend;
103f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  friend_default();
104f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
105f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntstruct has_friend {
106f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  friend_default fd;
107f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
108f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunthas_friend hf;
109f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
1106c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct defaulted_delete {
1115bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smith  no_default nd; // expected-note {{because field 'nd' has a deleted default constructor}}
1125bdaac5454d93d1dcdc2319818497b685be56fcfRichard Smith  defaulted_delete() = default; // expected-note{{implicitly deleted here}}
113f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
114e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas Gregordefaulted_delete dd; // expected-error {{call to implicitly-deleted default constructor}}
115f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt
116f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntstruct late_delete {
117f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  no_default nd;
118f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt  late_delete();
119f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Hunt};
120f1922d299be143f65b9c349e7f7b4ed5d0a90965Sean Huntlate_delete::late_delete() = default; // expected-error {{would delete it}}
12116ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smith
12216ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smith// See also rdar://problem/8125400.
12316ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smithnamespace empty {
124221c27f0d34c5938d84bbb8fafe1c3e3f1f87f2eDouglas Gregor  static union {};
125221c27f0d34c5938d84bbb8fafe1c3e3f1f87f2eDouglas Gregor  static union { union {}; };
12616ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smith  static union { struct {}; };
127221c27f0d34c5938d84bbb8fafe1c3e3f1f87f2eDouglas Gregor  static union { union { union {}; }; };
12816ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smith  static union { union { struct {}; }; };
129221c27f0d34c5938d84bbb8fafe1c3e3f1f87f2eDouglas Gregor  static union { struct { union {}; }; };
13016ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smith  static union { struct { struct {}; }; };
13116ee8191ca6953e173c983e3175a8d7504b5baaeRichard Smith}
132