1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 3 // RUN: %clang_cc1 -fsyntax-only -verify %s 4 5 // A program that calls for default-initialization or value-initialization of 6 // an entity of reference type is illformed. If T is a cv-qualified type, the 7 // cv-unqualified version of T is used for these definitions of 8 // zero-initialization, default-initialization, and value-initialization. 9 10 typedef int &IR; 11 IR r; // expected-error {{declaration of reference variable 'r' requires an initializer}} 12 int n = IR(); // expected-error {{reference to type 'int' requires an initializer}} 13 14 #if __cplusplus < 201103L 15 struct S { // expected-error {{implicit default constructor for 'S' must explicitly initialize the reference member}} 16 int &x; // expected-note {{declared here}} expected-error 3{{reference to type 'int' requires an initializer}} 17 }; 18 S s; // expected-note {{implicit default constructor for 'S' first required here}} 19 S f() { 20 return S(); // expected-note {{in value-initialization of type 'S' here}} 21 } 22 23 struct T 24 : S { // expected-note 2{{in value-initialization of type 'S' here}} 25 }; 26 T t = T(); // expected-note {{in value-initialization of type 'T' here}} 27 28 struct U { 29 T t[3]; // expected-note {{in value-initialization of type 'T' here}} 30 }; 31 U u = U(); // expected-note {{in value-initialization of type 'U' here}} 32 #else 33 struct S { 34 int &x; // expected-note 4{{because field 'x' of reference type 'int &' would not be initialized}} 35 }; 36 S s; // expected-error {{deleted default constructor}} 37 S f() { 38 return S(); // expected-error {{deleted default constructor}} 39 } 40 41 struct T 42 : S { // expected-note 2{{because base class 'S' has a deleted default constructor}} 43 }; 44 T t = T(); // expected-error {{deleted default constructor}} 45 46 struct U { 47 T t[3]; // expected-note {{because field 't' has a deleted default constructor}} 48 }; 49 U u = U(); // expected-error {{deleted default constructor}} 50 #endif 51 52 // Ensure that we handle C++11 in-class initializers properly as an extension. 53 // In this case, there is no user-declared default constructor, so we 54 // recursively apply the value-initialization checks, but we will emit a 55 // constructor call anyway, because the default constructor is not trivial. 56 struct V { 57 int n; 58 int &r = n; // expected-warning 0-1{{C++11}} 59 }; 60 V v = V(); // ok 61 struct W { 62 int n; 63 S s = { n }; // expected-warning 0-1{{C++11}} 64 }; 65 W w = W(); // ok 66 67 // Ensure we're not faking this up by making the default constructor 68 // non-trivial. 69 _Static_assert(__has_trivial_constructor(S), ""); 70 _Static_assert(__has_trivial_constructor(T), ""); 71 _Static_assert(__has_trivial_constructor(U), ""); 72 _Static_assert(!__has_trivial_constructor(V), ""); 73 _Static_assert(!__has_trivial_constructor(W), ""); 74