1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter
4 struct one
{ char c
; };
5 struct two
{ char c
[2]; };
13 const int &cri1a
= {1};
20 int &ri2
= {1}; // expected-error {{cannot bind to an initializer list temporary}}
27 void reference_to_aggregate() {
29 A
&ra2
{1, 2}; // expected-error {{cannot bind to an initializer list temporary}}
31 const int (&arrayRef
)[] = {1, 2, 3};
32 static_assert(sizeof(arrayRef
) == 3 * sizeof(int), "bad array size");
43 one
g(int&); // expected-note {{passing argument}}
44 g({1}); // expected-error {{cannot bind to an initializer list temporary}}
51 void a(B
&); // expected-note {{passing argument}}
52 a({1}); // expected-error {{cannot bind to an initializer list temporary}}
61 // First is identity conversion, second is user-defined conversion.
62 static_assert(sizeof(f({1})) == sizeof(one
), "bad overload resolution");
67 static_assert(sizeof(g({1})) == sizeof(two
), "bad overload resolution");
72 static_assert(sizeof(h({1, 2})) == sizeof(two
), "bad overload resolution");
78 int const &b({0}); // expected-error {{cannot initialize reference type 'const int &' with a parenthesized initializer list}}
79 const int (&arr
)[3] ({1, 2, 3}); // expected-error {{cannot initialize reference type 'const int (&)[3]' with a parenthesized initializer list}}
80 const X
&x({}); // expected-error {{cannot initialize reference type 'const X &' with a parenthesized initializer list}}
83 template<typename T
> void dependent_edge_cases() {
84 T
b({}); // expected-error-re 3{{cannot initialize reference type {{.*}} with a parenthesized init}}
85 T({}); // expected-error-re 3{{cannot initialize reference type {{.*}} with a parenthesized init}}
87 template void dependent_edge_cases
<X
>(); // ok
88 template void dependent_edge_cases
<const int&>(); // expected-note {{instantiation of}}
89 template void dependent_edge_cases
<const int(&)[1]>(); // expected-note {{instantiation of}}
90 template void dependent_edge_cases
<const X
&>(); // expected-note {{instantiation of}}
94 void f(int const(&)[3]);
103 struct S
{ S(int); } const &s
{ 2 };
107 typedef void (*ptr
)();
108 template <class T
> void f();
110 int k
= g({ f
<int> });
113 namespace inner_init
{
116 B b1
{ 0 }; // expected-error {{reference to type 'A' could not bind to an rvalue of type 'int'}}
118 B b3
{ { { 0 } } }; // expected-warning {{braces around scalar init}}
120 struct C
{ C(int); }; // expected-note 2{{candidate constructor (the implicit}} \
121 // expected-note {{candidate constructor not viable: cannot convert initializer list argument to 'int'}}
123 D d1
{ 0 }; // ok, 0 implicitly converts to C
124 D d2
{ { 0 } }; // ok, { 0 } calls C(0)
125 D d3
{ { { 0 } } }; // ok, { { 0 } } calls C({ 0 }), expected-warning {{braces around scalar init}}
126 D d4
{ { { { 0 } } } }; // expected-error {{no matching constructor for initialization of 'C &&'}}
128 struct E
{ explicit E(int); }; // expected-note 2{{here}}
130 F f1
{ 0 }; // expected-error {{could not bind to an rvalue of type 'int'}}
131 F f2
{ { 0 } }; // expected-error {{chosen constructor is explicit}}
132 F f3
{ { { 0 } } }; // expected-error {{chosen constructor is explicit}}
137 struct B
{ operator A
&(); } b
;
138 A
&a
{b
}; // expected-error {{excess elements}} expected-note {{in initialization of temporary of type 'A'}}
142 const int &a
= (const int &){0}; // expected-error {{cannot bind to an initializer list}}
148 template <typename T
>
149 class V
: public v
{};
151 using T
= const V
<int> &;