// 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 struct M { T m; }; void foo2() { (void)(M []) {{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(); }; POD p = (POD){1, 2}; // CHECK-NOT: CXXBindTemporaryExpr {{.*}} 'brace_initializers::POD' // CHECK: CompoundLiteralExpr {{.*}} 'brace_initializers::POD' // CHECK-NEXT: InitListExpr {{.*}} 'brace_initializers::POD' // CHECK-NEXT: ConstantExpr {{.*}} // CHECK-NEXT: IntegerLiteral {{.*}} 1{{$}} // CHECK-NEXT: ConstantExpr {{.*}} // CHECK-NEXT: IntegerLiteral {{.*}} 2{{$}} void test() { (void)(POD){1, 2}; // CHECK-NOT: CXXBindTemporaryExpr {{.*}} 'brace_initializers::POD' // CHECK-NOT: ConstantExpr {{.*}} 'brace_initializers::POD' // CHECK: CompoundLiteralExpr {{.*}} 'brace_initializers::POD' // CHECK-NEXT: InitListExpr {{.*}} 'brace_initializers::POD' // CHECK-NEXT: IntegerLiteral {{.*}} 1{{$}} // CHECK-NEXT: IntegerLiteral {{.*}} 2{{$}} (void)(HasDtor){1, 2}; // CHECK: CXXBindTemporaryExpr {{.*}} 'brace_initializers::HasDtor' // CHECK-NEXT: CompoundLiteralExpr {{.*}} 'brace_initializers::HasDtor' // CHECK-NEXT: InitListExpr {{.*}} 'brace_initializers::HasDtor' // CHECK-NEXT: IntegerLiteral {{.*}} 1{{$}} // CHECK-NEXT: IntegerLiteral {{.*}} 2{{$}} #if __cplusplus >= 201103L (void)(HasCtor){1, 2}; // CHECK-CXX11-NOT: CXXBindTemporaryExpr {{.*}} 'brace_initializers::HasCtor' // CHECK-CXX11-NOT: ConstantExpr {{.*}} 'brace_initializers::HasCtor' // CHECK-CXX11: CompoundLiteralExpr {{.*}} 'brace_initializers::HasCtor' // CHECK-CXX11-NEXT: CXXTemporaryObjectExpr {{.*}} 'brace_initializers::HasCtor' // CHECK-CXX11-NEXT: IntegerLiteral {{.*}} 1{{$}} // CHECK-CXX11-NEXT: IntegerLiteral {{.*}} 2{{$}} (void)(HasCtorDtor){1, 2}; // CHECK-CXX11: CXXBindTemporaryExpr {{.*}} 'brace_initializers::HasCtorDtor' // CHECK-CXX11-NOT: ConstantExpr {{.*}} 'brace_initializers::HasCtorDtor' // CHECK-CXX11: CompoundLiteralExpr {{.*}} 'brace_initializers::HasCtorDtor' // CHECK-CXX11-NEXT: CXXTemporaryObjectExpr {{.*}} '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 struct Value { }; template int &check_narrowed(Value); #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