| // 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})>); |
| |
| #if __cplusplus >= 201103L |
| // Compound literals in global lambdas have automatic storage duration |
| // and are not subject to the constant-initialization rules. |
| int computed_with_lambda = [] { |
| int x = 5; |
| int result = ((int[]) { x, x + 2, x + 4, x + 6 })[0]; |
| return result; |
| }(); |
| #endif |