89 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -std=c++03 -verify -ast-dump %s > %t-03
 | |
| // RUN: FileCheck --input-file=%t-03 %s
 | |
| // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify -ast-dump %s > %t-11
 | |
| // RUN: FileCheck --input-file=%t-11 %s
 | |
| // RUN: FileCheck --input-file=%t-11 %s --check-prefix=CHECK-CXX11
 | |
| 
 | |
| // http://llvm.org/PR7905
 | |
| namespace PR7905 {
 | |
| struct S; // expected-note {{forward declaration}}
 | |
| void foo1() {
 | |
|   (void)(S[]) {{3}}; // expected-error {{array has incomplete element type}}
 | |
| }
 | |
| 
 | |
| template <typename T> struct M { T m; };
 | |
| void foo2() {
 | |
|   (void)(M<short> []) {{3}};
 | |
| }
 | |
| }
 | |
| 
 | |
| // Check compound literals mixed with C++11 list-initialization.
 | |
| namespace brace_initializers {
 | |
|   struct POD {
 | |
|     int x, y;
 | |
|   };
 | |
|   struct HasCtor {
 | |
|     HasCtor(int x, int y);
 | |
|   };
 | |
|   struct HasDtor {
 | |
|     int x, y;
 | |
|     ~HasDtor();
 | |
|   };
 | |
|   struct HasCtorDtor {
 | |
|     HasCtorDtor(int x, int y);
 | |
|     ~HasCtorDtor();
 | |
|   };
 | |
| 
 | |
|   void test() {
 | |
|     (void)(POD){1, 2};
 | |
|     // CHECK-NOT: CXXBindTemporaryExpr {{.*}} 'struct brace_initializers::POD'
 | |
|     // CHECK: CompoundLiteralExpr {{.*}} 'struct brace_initializers::POD'
 | |
|     // CHECK-NEXT: InitListExpr {{.*}} 'struct brace_initializers::POD'
 | |
|     // CHECK-NEXT: IntegerLiteral {{.*}} 1{{$}}
 | |
|     // CHECK-NEXT: IntegerLiteral {{.*}} 2{{$}}
 | |
| 
 | |
|     (void)(HasDtor){1, 2};
 | |
|     // CHECK: CXXBindTemporaryExpr {{.*}} 'struct brace_initializers::HasDtor'
 | |
|     // CHECK-NEXT: CompoundLiteralExpr {{.*}} 'struct brace_initializers::HasDtor'
 | |
|     // CHECK-NEXT: InitListExpr {{.*}} 'struct brace_initializers::HasDtor'
 | |
|     // CHECK-NEXT: IntegerLiteral {{.*}} 1{{$}}
 | |
|     // CHECK-NEXT: IntegerLiteral {{.*}} 2{{$}}
 | |
| 
 | |
| #if __cplusplus >= 201103L
 | |
|     (void)(HasCtor){1, 2};
 | |
|     // CHECK-CXX11-NOT: CXXBindTemporaryExpr {{.*}} 'struct brace_initializers::HasCtor'
 | |
|     // CHECK-CXX11: CompoundLiteralExpr {{.*}} 'struct brace_initializers::HasCtor'
 | |
|     // CHECK-CXX11-NEXT: CXXTemporaryObjectExpr {{.*}} 'struct brace_initializers::HasCtor'
 | |
|     // CHECK-CXX11-NEXT: IntegerLiteral {{.*}} 1{{$}}
 | |
|     // CHECK-CXX11-NEXT: IntegerLiteral {{.*}} 2{{$}}
 | |
| 
 | |
|     (void)(HasCtorDtor){1, 2};
 | |
|     // CHECK-CXX11: CXXBindTemporaryExpr {{.*}} 'struct brace_initializers::HasCtorDtor'
 | |
|     // CHECK-CXX11-NEXT: CompoundLiteralExpr {{.*}} 'struct brace_initializers::HasCtorDtor'
 | |
|     // CHECK-CXX11-NEXT: CXXTemporaryObjectExpr {{.*}} 'struct brace_initializers::HasCtorDtor'
 | |
|     // CHECK-CXX11-NEXT: IntegerLiteral {{.*}} 1{{$}}
 | |
|     // CHECK-CXX11-NEXT: IntegerLiteral {{.*}} 2{{$}}
 | |
| #endif
 | |
|   }
 | |
| 
 | |
|   struct PrivateDtor {
 | |
|     int x, y;
 | |
|   private:
 | |
|     ~PrivateDtor(); // expected-note {{declared private here}}
 | |
|   };
 | |
| 
 | |
|   void testPrivateDtor() {
 | |
|     (void)(PrivateDtor){1, 2}; // expected-error {{temporary of type 'brace_initializers::PrivateDtor' has private destructor}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| // This doesn't necessarily need to be an error, but CodeGen can't handle it
 | |
| // at the moment.
 | |
| int PR17415 = (int){PR17415}; // expected-error {{initializer element is not a compile-time constant}}
 | |
| 
 | |
| // Make sure we accept this.  (Not sure if we actually should... but we do
 | |
| // at the moment.)
 | |
| template<unsigned> struct Value { };
 | |
| template<typename T>
 | |
| int &check_narrowed(Value<sizeof((T){1.1})>);
 |