121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
 | |
| 
 | |
| struct one { char c; };
 | |
| struct two { char c[2]; };
 | |
| 
 | |
| namespace reference {
 | |
|   struct A {
 | |
|     int i1, i2;
 | |
|   };
 | |
| 
 | |
|   void single_init() {
 | |
|     const int &cri1a = {1};
 | |
|     const int &cri1b{1};
 | |
| 
 | |
|     int i = 1;
 | |
|     int &ri1a = {i};
 | |
|     int &ri1b{i};
 | |
| 
 | |
|     int &ri2 = {1}; // expected-error {{cannot bind to an initializer list temporary}}
 | |
| 
 | |
|     A a{1, 2};
 | |
|     A &ra1a = {a};
 | |
|     A &ra1b{a};
 | |
|   }
 | |
| 
 | |
|   void reference_to_aggregate() {
 | |
|     const A &ra1{1, 2};
 | |
|     A &ra2{1, 2}; // expected-error {{cannot bind to an initializer list temporary}}
 | |
| 
 | |
|     const int (&arrayRef)[] = {1, 2, 3};
 | |
|     static_assert(sizeof(arrayRef) == 3 * sizeof(int), "bad array size");
 | |
|   }
 | |
| 
 | |
|   struct B {
 | |
|     int i1;
 | |
|   };
 | |
| 
 | |
|   void call() {
 | |
|     one f(const int&);
 | |
|     f({1});
 | |
| 
 | |
|     one g(int&); // expected-note {{passing argument}}
 | |
|     g({1}); // expected-error {{cannot bind to an initializer list temporary}}
 | |
|     int i = 0;
 | |
|     g({i});
 | |
| 
 | |
|     void h(const B&);
 | |
|     h({1});
 | |
| 
 | |
|     void a(B&); // expected-note {{passing argument}}
 | |
|     a({1}); // expected-error {{cannot bind to an initializer list temporary}}
 | |
|     B b{1};
 | |
|     a({b});
 | |
|   }
 | |
| 
 | |
|   void overloading() {
 | |
|     one f(const int&);
 | |
|     two f(const B&);
 | |
| 
 | |
|     // First is identity conversion, second is user-defined conversion.
 | |
|     static_assert(sizeof(f({1})) == sizeof(one), "bad overload resolution");
 | |
| 
 | |
|     one g(int&);
 | |
|     two g(const B&);
 | |
| 
 | |
|     static_assert(sizeof(g({1})) == sizeof(two), "bad overload resolution");
 | |
| 
 | |
|     one h(const int&);
 | |
|     two h(const A&);
 | |
| 
 | |
|     static_assert(sizeof(h({1, 2})) == sizeof(two), "bad overload resolution");
 | |
|   }
 | |
| 
 | |
|   void edge_cases() {
 | |
|     // FIXME: very poor error message
 | |
|     int const &b({0}); // expected-error {{could not bind}}
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| namespace PR12182 {
 | |
|   void f(int const(&)[3]);
 | |
| 
 | |
|   void g() {
 | |
|       f({1, 2});
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace PR12660 {
 | |
|   const int &i { 1 };
 | |
|   struct S { S(int); } const &s { 2 };
 | |
| }
 | |
| 
 | |
| namespace b7891773 {
 | |
|   typedef void (*ptr)();
 | |
|   template <class T> void f();
 | |
|   int g(const ptr &);
 | |
|   int k = g({ f<int> });
 | |
| }
 | |
| 
 | |
| namespace inner_init {
 | |
|   struct A { int n; };
 | |
|   struct B { A &&r; };
 | |
|   B b1 { 0 }; // expected-error {{reference to type 'inner_init::A' could not bind to an rvalue of type 'int'}}
 | |
|   B b2 { { 0 } };
 | |
|   B b3 { { { 0 } } }; // expected-warning {{braces around scalar init}}
 | |
| 
 | |
|   struct C { C(int); };
 | |
|   struct D { C &&r; };
 | |
|   D d1 { 0 }; // ok, 0 implicitly converts to C
 | |
|   D d2 { { 0 } }; // ok, { 0 } calls C(0)
 | |
|   D d3 { { { 0 } } }; // ok, { { 0 } } calls C({ 0 })
 | |
|   D d4 { { { { 0 } } } }; // expected-warning {{braces around scalar init}}
 | |
| 
 | |
|   struct E { explicit E(int); }; // expected-note 2{{here}}
 | |
|   struct F { E &&r; };
 | |
|   F f1 { 0 }; // expected-error {{could not bind to an rvalue of type 'int'}}
 | |
|   F f2 { { 0 } }; // expected-error {{chosen constructor is explicit}}
 | |
|   F f3 { { { 0 } } }; // expected-error {{chosen constructor is explicit}}
 | |
| }
 | 
