forked from OSchip/llvm-project
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2>&1 | FileCheck %s
|
|
// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2>&1 | FileCheck %s
|
|
// RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2>&1 | FileCheck %s
|
|
// RUN: %clang_cc1 -std=c++17 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2>&1 | FileCheck %s
|
|
// RUN: %clang_cc1 -std=c++2a %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2>&1 | FileCheck %s
|
|
|
|
#if __cplusplus <= 201103L
|
|
// expected-no-diagnostics
|
|
#endif
|
|
|
|
namespace dr2353 { // dr2353: 9
|
|
struct X {
|
|
static const int n = 0;
|
|
};
|
|
|
|
// CHECK: FunctionDecl {{.*}} use
|
|
int use(X x) {
|
|
// CHECK: MemberExpr {{.*}} .n
|
|
// CHECK-NOT: non_odr_use
|
|
// CHECK: DeclRefExpr {{.*}} 'x'
|
|
// CHECK-NOT: non_odr_use
|
|
return *&x.n;
|
|
}
|
|
#pragma clang __debug dump use
|
|
|
|
// CHECK: FunctionDecl {{.*}} not_use
|
|
int not_use(X x) {
|
|
// CHECK: MemberExpr {{.*}} .n {{.*}} non_odr_use_constant
|
|
// CHECK: DeclRefExpr {{.*}} 'x'
|
|
return x.n;
|
|
}
|
|
#pragma clang __debug dump not_use
|
|
|
|
// CHECK: FunctionDecl {{.*}} not_use_2
|
|
int not_use_2(X *x) {
|
|
// CHECK: MemberExpr {{.*}} ->n {{.*}} non_odr_use_constant
|
|
// CHECK: DeclRefExpr {{.*}} 'x'
|
|
return x->n;
|
|
}
|
|
#pragma clang __debug dump not_use_2
|
|
}
|
|
|
|
#if __cplusplus >= 201707L
|
|
// Otherwise, if the qualified-id std::tuple_size<E> names a complete class
|
|
// type **with a member value**, the expression std::tuple_size<E>::value shall
|
|
// be a well-formed integral constant expression
|
|
namespace dr2386 { // dr2386: 9
|
|
struct Bad1 { int a, b; };
|
|
struct Bad2 { int a, b; };
|
|
} // namespace dr2386
|
|
namespace std {
|
|
template <typename T> struct tuple_size;
|
|
template <> struct std::tuple_size<dr2386::Bad1> {};
|
|
template <> struct std::tuple_size<dr2386::Bad2> {
|
|
static const int value = 42;
|
|
};
|
|
} // namespace std
|
|
namespace dr2386 {
|
|
void no_value() { auto [x, y] = Bad1(); }
|
|
void wrong_value() { auto [x, y] = Bad2(); } // expected-error {{decomposes into 42 elements}}
|
|
} // namespace dr2386
|
|
#endif
|
|
|
|
namespace dr2387 { // dr2387: 9
|
|
#if __cplusplus >= 201402L
|
|
template<int> int a = 0;
|
|
extern template int a<0>; // ok
|
|
|
|
template<int> static int b = 0;
|
|
extern template int b<0>; // expected-error {{internal linkage}}
|
|
|
|
template<int> const int c = 0;
|
|
extern template const int c<0>; // ok, has external linkage despite 'const'
|
|
|
|
template<typename T> T d = 0;
|
|
extern template int d<int>;
|
|
extern template const int d<const int>;
|
|
#endif
|
|
}
|