// 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 {{.*}} '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: 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-NEXT: 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<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 |