1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
3 struct one
{ char c
; };
4 struct two
{ char c
[2]; };
12 const int &cri1a
= {1};
19 int &ri2
= {1}; // expected-error {{cannot bind to an initializer list temporary}}
26 void reference_to_aggregate() {
28 A
&ra2
{1, 2}; // expected-error {{cannot bind to an initializer list temporary}}
30 const int (&arrayRef
)[] = {1, 2, 3};
31 static_assert(sizeof(arrayRef
) == 3 * sizeof(int), "bad array size");
42 one
g(int&); // expected-note {{passing argument}}
43 g({1}); // expected-error {{cannot bind to an initializer list temporary}}
50 void a(B
&); // expected-note {{passing argument}}
51 a({1}); // expected-error {{cannot bind to an initializer list temporary}}
60 // First is identity conversion, second is user-defined conversion.
61 static_assert(sizeof(f({1})) == sizeof(one
), "bad overload resolution");
66 static_assert(sizeof(g({1})) == sizeof(two
), "bad overload resolution");
71 static_assert(sizeof(h({1, 2})) == sizeof(two
), "bad overload resolution");
77 int const &b({0}); // expected-error {{cannot initialize reference type 'const int &' with a parenthesized initializer list}}
78 const int (&arr
)[3] ({1, 2, 3}); // expected-error {{cannot initialize reference type 'const int (&)[3]' with a parenthesized initializer list}}
79 const X
&x({}); // expected-error {{cannot initialize reference type 'const X &' with a parenthesized initializer list}}
82 template<typename T
> void dependent_edge_cases() {
83 T
b({}); // expected-error-re 3{{cannot initialize reference type {{.*}} with a parenthesized init}}
84 T({}); // expected-error-re 3{{cannot initialize reference type {{.*}} with a parenthesized init}}
86 template void dependent_edge_cases
<X
>(); // ok
87 template void dependent_edge_cases
<const int&>(); // expected-note {{instantiation of}}
88 template void dependent_edge_cases
<const int(&)[1]>(); // expected-note {{instantiation of}}
89 template void dependent_edge_cases
<const X
&>(); // expected-note {{instantiation of}}
93 void f(int const(&)[3]);
102 struct S
{ S(int); } const &s
{ 2 };
106 typedef void (*ptr
)();
107 template <class T
> void f();
109 int k
= g({ f
<int> });
112 namespace inner_init
{
115 B b1
{ 0 }; // expected-error {{reference to type 'A' could not bind to an rvalue of type 'int'}}
117 B b3
{ { { 0 } } }; // expected-warning {{braces around scalar init}}
119 struct C
{ C(int); }; // expected-note 2{{candidate constructor (the implicit}} \
120 // expected-note {{candidate constructor not viable: cannot convert initializer list argument to 'int'}}
122 D d1
{ 0 }; // ok, 0 implicitly converts to C
123 D d2
{ { 0 } }; // ok, { 0 } calls C(0)
124 D d3
{ { { 0 } } }; // ok, { { 0 } } calls C({ 0 }), expected-warning {{braces around scalar init}}
125 D d4
{ { { { 0 } } } }; // expected-error {{no matching constructor for initialization of 'C &&'}}
127 struct E
{ explicit E(int); }; // expected-note 2{{here}}
129 F f1
{ 0 }; // expected-error {{could not bind to an rvalue of type 'int'}}
130 F f2
{ { 0 } }; // expected-error {{chosen constructor is explicit}}
131 F f3
{ { { 0 } } }; // expected-error {{chosen constructor is explicit}}
136 struct B
{ operator A
&(); } b
;
137 A
&a
{b
}; // expected-error {{excess elements}} expected-note {{in initialization of temporary of type 'A'}}
141 const int &a
= (const int &){0}; // expected-error {{cannot bind to an initializer list}}