1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li struct non_trivial { 4*67e74705SXin Li non_trivial(); 5*67e74705SXin Li non_trivial(const non_trivial&); 6*67e74705SXin Li non_trivial& operator = (const non_trivial&); 7*67e74705SXin Li ~non_trivial(); 8*67e74705SXin Li }; 9*67e74705SXin Li 10*67e74705SXin Li union bad_union { 11*67e74705SXin Li non_trivial nt; // expected-note {{non-trivial default constructor}} 12*67e74705SXin Li }; 13*67e74705SXin Li bad_union u; // expected-error {{call to implicitly-deleted default constructor}} 14*67e74705SXin Li union bad_union2 { // expected-note {{all data members are const-qualified}} 15*67e74705SXin Li const int i; 16*67e74705SXin Li }; 17*67e74705SXin Li bad_union2 u2; // expected-error {{call to implicitly-deleted default constructor}} 18*67e74705SXin Li 19*67e74705SXin Li struct bad_anon { 20*67e74705SXin Li union { 21*67e74705SXin Li non_trivial nt; // expected-note {{non-trivial default constructor}} 22*67e74705SXin Li }; 23*67e74705SXin Li }; 24*67e74705SXin Li bad_anon a; // expected-error {{call to implicitly-deleted default constructor}} 25*67e74705SXin Li struct bad_anon2 { 26*67e74705SXin Li union { // expected-note {{all data members of an anonymous union member are const-qualified}} 27*67e74705SXin Li const int i; 28*67e74705SXin Li }; 29*67e74705SXin Li }; 30*67e74705SXin Li bad_anon2 a2; // expected-error {{call to implicitly-deleted default constructor}} 31*67e74705SXin Li 32*67e74705SXin Li // This would be great except that we implement 33*67e74705SXin Li union good_union { 34*67e74705SXin Li const int i; 35*67e74705SXin Li float f; 36*67e74705SXin Li }; 37*67e74705SXin Li good_union gu; 38*67e74705SXin Li struct good_anon { 39*67e74705SXin Li union { 40*67e74705SXin Li const int i; 41*67e74705SXin Li float f; 42*67e74705SXin Li }; 43*67e74705SXin Li }; 44*67e74705SXin Li good_anon ga; 45*67e74705SXin Li 46*67e74705SXin Li struct good : non_trivial { 47*67e74705SXin Li non_trivial nt; 48*67e74705SXin Li }; 49*67e74705SXin Li good g; 50*67e74705SXin Li 51*67e74705SXin Li struct bad_const { 52*67e74705SXin Li const good g; // expected-note {{field 'g' of const-qualified type 'const good' would not be initialized}} 53*67e74705SXin Li }; 54*67e74705SXin Li bad_const bc; // expected-error {{call to implicitly-deleted default constructor}} 55*67e74705SXin Li 56*67e74705SXin Li struct good_const { 57*67e74705SXin Li const non_trivial nt; 58*67e74705SXin Li }; 59*67e74705SXin Li good_const gc; 60*67e74705SXin Li 61*67e74705SXin Li struct no_default { 62*67e74705SXin Li no_default() = delete; // expected-note 4{{deleted here}} 63*67e74705SXin Li }; 64*67e74705SXin Li struct no_dtor { 65*67e74705SXin Li ~no_dtor() = delete; // expected-note 2{{deleted here}} 66*67e74705SXin Li }; 67*67e74705SXin Li 68*67e74705SXin Li struct bad_field_default { 69*67e74705SXin Li no_default nd; // expected-note {{field 'nd' has a deleted default constructor}} 70*67e74705SXin Li }; 71*67e74705SXin Li bad_field_default bfd; // expected-error {{call to implicitly-deleted default constructor}} 72*67e74705SXin Li struct bad_base_default : no_default { // expected-note {{base class 'no_default' has a deleted default constructor}} 73*67e74705SXin Li }; 74*67e74705SXin Li bad_base_default bbd; // expected-error {{call to implicitly-deleted default constructor}} 75*67e74705SXin Li 76*67e74705SXin Li struct bad_field_dtor { 77*67e74705SXin Li no_dtor nd; // expected-note {{field 'nd' has a deleted destructor}} 78*67e74705SXin Li }; 79*67e74705SXin Li bad_field_dtor bfx; // expected-error {{call to implicitly-deleted default constructor}} 80*67e74705SXin Li struct bad_base_dtor : no_dtor { // expected-note {{base class 'no_dtor' has a deleted destructor}} 81*67e74705SXin Li }; 82*67e74705SXin Li bad_base_dtor bbx; // expected-error {{call to implicitly-deleted default constructor}} 83*67e74705SXin Li 84*67e74705SXin Li struct ambiguous_default { 85*67e74705SXin Li ambiguous_default(); 86*67e74705SXin Li ambiguous_default(int = 2); 87*67e74705SXin Li }; 88*67e74705SXin Li struct has_amb_field { 89*67e74705SXin Li ambiguous_default ad; // expected-note {{field 'ad' has multiple default constructors}} 90*67e74705SXin Li }; 91*67e74705SXin Li has_amb_field haf; // expected-error {{call to implicitly-deleted default constructor}} 92*67e74705SXin Li 93*67e74705SXin Li class inaccessible_default { 94*67e74705SXin Li inaccessible_default(); 95*67e74705SXin Li }; 96*67e74705SXin Li struct has_inacc_field { 97*67e74705SXin Li inaccessible_default id; // expected-note {{field 'id' has an inaccessible default constructor}} 98*67e74705SXin Li }; 99*67e74705SXin Li has_inacc_field hif; // expected-error {{call to implicitly-deleted default constructor}} 100*67e74705SXin Li 101*67e74705SXin Li class friend_default { 102*67e74705SXin Li friend struct has_friend; 103*67e74705SXin Li friend_default(); 104*67e74705SXin Li }; 105*67e74705SXin Li struct has_friend { 106*67e74705SXin Li friend_default fd; 107*67e74705SXin Li }; 108*67e74705SXin Li has_friend hf; 109*67e74705SXin Li 110*67e74705SXin Li struct defaulted_delete { 111*67e74705SXin Li no_default nd; // expected-note {{because field 'nd' has a deleted default constructor}} 112*67e74705SXin Li defaulted_delete() = default; // expected-note{{implicitly deleted here}} 113*67e74705SXin Li }; 114*67e74705SXin Li defaulted_delete dd; // expected-error {{call to implicitly-deleted default constructor}} 115*67e74705SXin Li 116*67e74705SXin Li struct late_delete { 117*67e74705SXin Li no_default nd; // expected-note {{because field 'nd' has a deleted default constructor}} 118*67e74705SXin Li late_delete(); 119*67e74705SXin Li }; 120*67e74705SXin Li late_delete::late_delete() = default; // expected-error {{would delete it}} 121*67e74705SXin Li 122*67e74705SXin Li // See also rdar://problem/8125400. 123*67e74705SXin Li namespace empty { 124*67e74705SXin Li static union {}; 125*67e74705SXin Li static union { union {}; }; 126*67e74705SXin Li static union { struct {}; }; 127*67e74705SXin Li static union { union { union {}; }; }; 128*67e74705SXin Li static union { union { struct {}; }; }; 129*67e74705SXin Li static union { struct { union {}; }; }; 130*67e74705SXin Li static union { struct { struct {}; }; }; 131*67e74705SXin Li } 132