| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s |
| |
| // An aggregate is an array or a class... |
| struct Aggr { |
| private: |
| static const int n; |
| void f(); |
| protected: |
| struct Inner { int m; }; |
| public: |
| bool &br; |
| }; |
| bool b; |
| Aggr ag = { b }; |
| |
| // with no user-provided constructors, ... |
| struct NonAggr1a { // expected-note 2 {{candidate constructor}} |
| NonAggr1a(int, int); // expected-note {{candidate constructor}} |
| int k; |
| }; |
| NonAggr1a na1a = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr1a'}} |
| |
| struct NonAggr1b { |
| NonAggr1b(const NonAggr1b &); // expected-note {{candidate constructor}} |
| int k; |
| }; |
| NonAggr1b na1b = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr1b'}} |
| |
| // no brace-or-equal-initializers for non-static data members, ... |
| // Note, this bullet was removed in C++1y. |
| struct NonAggr2 { |
| int m = { 123 }; |
| }; |
| NonAggr2 na2 = { 42 }; |
| #if __cplusplus < 201402L |
| // expected-error@-2 {{no matching constructor for initialization of 'NonAggr2'}} |
| // expected-note@-6 3 {{candidate constructor}} |
| #endif |
| |
| // no private... |
| struct NonAggr3 { // expected-note 3 {{candidate constructor}} |
| private: |
| int n; |
| }; |
| NonAggr3 na3 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr3'}} |
| |
| // or protected non-static data members, ... |
| struct NonAggr4 { // expected-note 3 {{candidate constructor}} |
| protected: |
| int n; |
| }; |
| NonAggr4 na4 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr4'}} |
| |
| // [pre-C++1z] no base classes, ... |
| struct NonAggr5 : Aggr { |
| }; |
| NonAggr5 na5 = { b }; |
| #if __cplusplus <= 201402L |
| // expected-error@-2 {{no matching constructor for initialization of 'NonAggr5'}} |
| // expected-note@-5 3 {{candidate constructor}} |
| #endif |
| template<typename...BaseList> |
| struct MaybeAggr5a : BaseList... {}; |
| MaybeAggr5a<> ma5a0 = {}; // ok |
| MaybeAggr5a<Aggr> ma5a1 = {}; // ok in C++17 |
| MaybeAggr5a<NonAggr2> m5a2 = {}; // ok, aggregate init in C++17, default ctor in C++11 and C++14 |
| MaybeAggr5a<NonAggr2> m5a3 = {0}; // ok in C++17, overrides default member initializer in base class |
| #if __cplusplus <= 201402L |
| // expected-error@-4 {{call to implicitly-deleted default constructor of 'MaybeAggr5a<Aggr>'}} |
| // expected-note@-7 {{default constructor of 'MaybeAggr5a<Aggr>' is implicitly deleted because base class 'Aggr' has a deleted default constructor}} |
| // expected-note@13 {{default constructor of 'Aggr' is implicitly deleted because field 'br' of reference type 'bool &' would not be initialized}} |
| // expected-error@-5 {{no matching constructor}} expected-note@-9 3{{candidate}} |
| #else |
| // expected-error@-9 {{reference member of type 'bool &' uninitialized}} |
| // expected-note@13 {{uninitialized reference member is here}} |
| #endif |
| |
| // [C++1z] no virtual, protected, or private base classes, ... |
| struct NonAggr5b : virtual Aggr {}; // expected-note 3{{candidate}} |
| NonAggr5b na5b = { b }; // expected-error {{no matching constructor}} |
| struct NonAggr5c : NonAggr5b {}; // expected-note 3{{candidate}} |
| NonAggr5c na5c = { b }; // expected-error {{no matching constructor}} |
| struct NonAggr5d : protected Aggr {}; // expected-note 3{{candidate}} |
| NonAggr5d na5d = { b }; // expected-error {{no matching constructor}} |
| struct NonAggr5e : private Aggr {}; // expected-note 3{{candidate}} |
| NonAggr5e na5e = { b }; // expected-error {{no matching constructor}} |
| class NonAggr5f : Aggr {}; // expected-note 3{{candidate}} |
| NonAggr5f na5f = { b }; // expected-error {{no matching constructor}} |
| |
| // [C++1z] (the base class need not itself be an aggregate) |
| struct MaybeAggr5g : NonAggr1a {}; |
| MaybeAggr5g ma5g1 = { 1 }; |
| MaybeAggr5g ma5g2 = { {1, 2} }; |
| MaybeAggr5g ma5g3 = {}; |
| #if __cplusplus <= 201402L |
| // expected-error@-4 {{no matching constructor}} // expected-note@-5 3{{candidate}} |
| // expected-error@-4 {{no matching constructor}} // expected-note@-6 3{{candidate}} |
| // expected-error@-4 {{implicitly-deleted default constructor}} expected-note@-7 {{no default constructor}} |
| #else |
| // expected-error@-8 {{no viable conversion from 'int' to 'NonAggr1a'}} expected-note@19 2{{candidate}} |
| // (ok) |
| // expected-error@-8 {{no matching constructor}} expected-note@19 2{{candidate}} expected-note@20 {{candidate}} |
| #endif |
| |
| // and no virtual functions. |
| struct NonAggr6 { // expected-note 3 {{candidate constructor}} |
| virtual void f(); |
| int n; |
| }; |
| NonAggr6 na6 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr6'}} |
| |
| struct NonAggr7 : NonAggr6 { // expected-note 3 {{candidate constructor}} |
| int n; |
| }; |
| NonAggr7 na7 = {{}, 42}; // expected-error {{no matching constructor for initialization of 'NonAggr7'}} |
| |
| struct DefaultedAggr { |
| int n; |
| |
| DefaultedAggr() = default; |
| DefaultedAggr(const DefaultedAggr &) = default; |
| DefaultedAggr(DefaultedAggr &&) = default; |
| DefaultedAggr &operator=(const DefaultedAggr &) = default; |
| DefaultedAggr &operator=(DefaultedAggr &&) = default; |
| ~DefaultedAggr() = default; |
| }; |
| DefaultedAggr da = { 42 } ; |
| |
| struct ExplicitDefaultedAggr { |
| int n; |
| explicit ExplicitDefaultedAggr() = default; // expected-note {{candidate}} |
| ExplicitDefaultedAggr(const ExplicitDefaultedAggr &) = default; // expected-note {{candidate}} |
| ExplicitDefaultedAggr(ExplicitDefaultedAggr &&) = default; // expected-note {{candidate}} |
| }; |
| ExplicitDefaultedAggr eda = { 42 }; // expected-error {{no matching constructor}} |
| ExplicitDefaultedAggr eda2{}; |
| |
| struct DefaultedBase { |
| int n; |
| DefaultedBase() = default; |
| DefaultedBase(DefaultedBase const&) = default; |
| DefaultedBase(DefaultedBase &&) = default; |
| }; |
| |
| struct InheritingConstructors : DefaultedBase { // expected-note 3 {{candidate}} |
| using DefaultedBase::DefaultedBase; |
| }; |
| InheritingConstructors ic = { 42 }; // expected-error {{no matching constructor}} |
| |
| struct NonInheritingConstructors : DefaultedBase {}; // expected-note 0+ {{candidate}} |
| NonInheritingConstructors nic = { 42 }; |
| #if __cplusplus <= 201402L |
| // expected-error@-2 {{no matching constructor}} |
| #endif |
| |
| struct NonAggrBase { |
| NonAggrBase(int) {} |
| }; |
| struct HasNonAggrBase : NonAggrBase {}; // expected-note 0+ {{candidate}} |
| HasNonAggrBase hnab = {42}; |
| #if __cplusplus <= 201402L |
| // expected-error@-2 {{no matching constructor}} |
| #endif |