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