1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s 3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s 4 5 // An aggregate is an array or a class... 6 struct Aggr { 7 private: 8 static const int n; 9 void f(); 10 protected: 11 struct Inner { int m; }; 12 public: 13 bool &br; 14 }; 15 bool b; 16 Aggr ag = { b }; 17 18 // with no user-provided constructors, ... 19 struct NonAggr1a { // expected-note 2 {{candidate constructor}} 20 NonAggr1a(int, int); // expected-note {{candidate constructor}} 21 int k; 22 }; 23 NonAggr1a na1a = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr1a'}} 24 25 struct NonAggr1b { 26 NonAggr1b(const NonAggr1b &); // expected-note {{candidate constructor}} 27 int k; 28 }; 29 NonAggr1b na1b = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr1b'}} 30 31 // no brace-or-equal-initializers for non-static data members, ... 32 // Note, this bullet was removed in C++1y. 33 struct NonAggr2 { 34 int m = { 123 }; 35 }; 36 NonAggr2 na2 = { 42 }; 37 #if __cplusplus < 201402L 38 // expected-error@-2 {{no matching constructor for initialization of 'NonAggr2'}} 39 // expected-note@-6 3 {{candidate constructor}} 40 #endif 41 42 // no private... 43 struct NonAggr3 { // expected-note 3 {{candidate constructor}} 44 private: 45 int n; 46 }; 47 NonAggr3 na3 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr3'}} 48 49 // or protected non-static data members, ... 50 struct NonAggr4 { // expected-note 3 {{candidate constructor}} 51 protected: 52 int n; 53 }; 54 NonAggr4 na4 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr4'}} 55 56 // [pre-C++1z] no base classes, ... 57 struct NonAggr5 : Aggr { 58 }; 59 NonAggr5 na5 = { b }; 60 #if __cplusplus <= 201402L 61 // expected-error@-2 {{no matching constructor for initialization of 'NonAggr5'}} 62 // expected-note@-5 3 {{candidate constructor}} 63 #endif 64 template<typename...BaseList> 65 struct MaybeAggr5a : BaseList... {}; 66 MaybeAggr5a<> ma5a0 = {}; // ok 67 MaybeAggr5a<Aggr> ma5a1 = {}; // ok in C++17 68 MaybeAggr5a<NonAggr2> m5a2 = {}; // ok, aggregate init in C++17, default ctor in C++11 and C++14 69 MaybeAggr5a<NonAggr2> m5a3 = {0}; // ok in C++17, overrides default member initializer in base class 70 #if __cplusplus <= 201402L 71 // expected-error@-4 {{call to implicitly-deleted default constructor of 'MaybeAggr5a<Aggr>'}} 72 // expected-note@-7 {{default constructor of 'MaybeAggr5a<Aggr>' is implicitly deleted because base class 'Aggr' has a deleted default constructor}} 73 // expected-note@13 {{default constructor of 'Aggr' is implicitly deleted because field 'br' of reference type 'bool &' would not be initialized}} 74 // expected-error@-5 {{no matching constructor}} expected-note@-9 3{{candidate}} 75 #else 76 // expected-error@-9 {{reference member of type 'bool &' uninitialized}} 77 // expected-note@13 {{uninitialized reference member is here}} 78 #endif 79 80 // [C++1z] no virtual, protected, or private base classes, ... 81 struct NonAggr5b : virtual Aggr {}; // expected-note 3{{candidate}} 82 NonAggr5b na5b = { b }; // expected-error {{no matching constructor}} 83 struct NonAggr5c : NonAggr5b {}; // expected-note 3{{candidate}} 84 NonAggr5c na5c = { b }; // expected-error {{no matching constructor}} 85 struct NonAggr5d : protected Aggr {}; // expected-note 3{{candidate}} 86 NonAggr5d na5d = { b }; // expected-error {{no matching constructor}} 87 struct NonAggr5e : private Aggr {}; // expected-note 3{{candidate}} 88 NonAggr5e na5e = { b }; // expected-error {{no matching constructor}} 89 class NonAggr5f : Aggr {}; // expected-note 3{{candidate}} 90 NonAggr5f na5f = { b }; // expected-error {{no matching constructor}} 91 92 // [C++1z] (the base class need not itself be an aggregate) 93 struct MaybeAggr5g : NonAggr1a {}; 94 MaybeAggr5g ma5g1 = { 1 }; 95 MaybeAggr5g ma5g2 = { {1, 2} }; 96 MaybeAggr5g ma5g3 = {}; 97 #if __cplusplus <= 201402L 98 // expected-error@-4 {{no matching constructor}} // expected-note@-5 3{{candidate}} 99 // expected-error@-4 {{no matching constructor}} // expected-note@-6 3{{candidate}} 100 // expected-error@-4 {{implicitly-deleted default constructor}} expected-note@-7 {{no default constructor}} 101 #else 102 // expected-error@-8 {{no viable conversion from 'int' to 'NonAggr1a'}} expected-note@19 2{{candidate}} 103 // (ok) 104 // expected-error@-8 {{no matching constructor}} expected-note@19 2{{candidate}} expected-note@20 {{candidate}} 105 #endif 106 107 // and no virtual functions. 108 struct NonAggr6 { // expected-note 3 {{candidate constructor}} 109 virtual void f(); 110 int n; 111 }; 112 NonAggr6 na6 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr6'}} 113 114 struct NonAggr7 : NonAggr6 { // expected-note 3 {{candidate constructor}} 115 int n; 116 }; 117 NonAggr7 na7 = {{}, 42}; // expected-error {{no matching constructor for initialization of 'NonAggr7'}} 118 119 struct DefaultedAggr { 120 int n; 121 122 DefaultedAggr() = default; 123 DefaultedAggr(const DefaultedAggr &) = default; 124 DefaultedAggr(DefaultedAggr &&) = default; 125 DefaultedAggr &operator=(const DefaultedAggr &) = default; 126 DefaultedAggr &operator=(DefaultedAggr &&) = default; 127 ~DefaultedAggr() = default; 128 }; 129 DefaultedAggr da = { 42 } ; 130 131 struct ExplicitDefaultedAggr { 132 int n; 133 explicit ExplicitDefaultedAggr() = default; // expected-note {{candidate}} 134 ExplicitDefaultedAggr(const ExplicitDefaultedAggr &) = default; // expected-note {{candidate}} 135 ExplicitDefaultedAggr(ExplicitDefaultedAggr &&) = default; // expected-note {{candidate}} 136 }; 137 ExplicitDefaultedAggr eda = { 42 }; // expected-error {{no matching constructor}} 138 ExplicitDefaultedAggr eda2{}; 139 140 struct DefaultedBase { 141 int n; 142 DefaultedBase() = default; 143 DefaultedBase(DefaultedBase const&) = default; 144 DefaultedBase(DefaultedBase &&) = default; 145 }; 146 147 struct InheritingConstructors : DefaultedBase { // expected-note 3 {{candidate}} 148 using DefaultedBase::DefaultedBase; 149 }; 150 InheritingConstructors ic = { 42 }; // expected-error {{no matching constructor}} 151 152 struct NonInheritingConstructors : DefaultedBase {}; // expected-note 0+ {{candidate}} 153 NonInheritingConstructors nic = { 42 }; 154 #if __cplusplus <= 201402L 155 // expected-error@-2 {{no matching constructor}} 156 #endif 157 158 struct NonAggrBase { NonAggrBaseNonAggrBase159 NonAggrBase(int) {} 160 }; 161 struct HasNonAggrBase : NonAggrBase {}; // expected-note 0+ {{candidate}} 162 HasNonAggrBase hnab = {42}; 163 #if __cplusplus <= 201402L 164 // expected-error@-2 {{no matching constructor}} 165 #endif 166