llvm-project/clang/test/Lexer/cxx2a-spaceship.cpp
Richard Smith 24ad121582 Add -std=c++20 flag, replace C++2a with C++20 throughout the Clang
user interface and documentation, and update __cplusplus for C++20.

WG21 considers the C++20 standard to be finished (even though it still
has some more steps to pass through in the ISO process).

The old flag names are accepted for compatibility, as usual, and we
still have lots of references to C++2a in comments and identifiers;
those can be cleaned up separately.
2020-02-18 16:16:37 -08:00

74 lines
2.0 KiB
C++

// RUN: %clang_cc1 -std=c++17 %s -verify
// RUN: %clang_cc1 -std=c++20 %s -verify
// RUN: %clang_cc1 -std=c++20 %s -verify -Wc++17-compat -DCOMPAT
//
// RUN: %clang_cc1 -std=c++17 %s -E -o - | FileCheck %s --check-prefix=CXX17
// RUN: %clang_cc1 -std=c++20 %s -E -o - | FileCheck %s --check-prefix=CXX20
namespace N {
struct A {};
void operator<=(A, A);
#if __cplusplus > 201703L
void operator<=>(A, A);
#ifdef COMPAT
// expected-warning@-2 {{'<=>' operator is incompatible with C++ standards before C++20}}
#endif
#endif
template<auto> struct X {};
X<operator<=>
#if __cplusplus <= 201703L
// expected-warning@-2 {{'<=>' is a single token in C++20; add a space to avoid a change in behavior}}
#else
>
#endif
#ifdef COMPAT
// expected-warning@-7 {{'<=>' operator is incompatible with C++ standards before C++20}}
#endif
x;
}
// <=> can be formed by pasting other comparison operators.
#if __cplusplus > 201703L
#define STR(x) #x
#define STR_EXPANDED(x) STR(x)
#define PASTE(x, y) x ## y
constexpr char a[] = STR_EXPANDED(PASTE(<, =>));
constexpr char b[] = STR_EXPANDED(PASTE(<=, >));
static_assert(__builtin_strcmp(a, "<=>") == 0);
static_assert(__builtin_strcmp(b, "<=>") == 0);
#endif
// -E must not accidentally form a <=> token.
// CXX17: preprocess1: < =>
// CXX17: preprocess2: <=>
// CXX17: preprocess3: < =>
// CXX17: preprocess4: <=>=
// CXX17: preprocess5: <=>>
// CXX17: preprocess6: <=>>=
// CXX17: preprocess7: <=>
// CXX17: preprocess8: <=>=
//
// CXX20: preprocess1: < =>
// CXX20: preprocess2: <= >
// CXX20: preprocess3: < =>
// CXX20: preprocess4: <= >=
// CXX20: preprocess5: <= >>
// CXX20: preprocess6: <= >>=
// CXX20: preprocess7: <=>
// CXX20: preprocess8: <=>=
#define ID(x) x
[[some_vendor::some_attribute( // expected-warning {{unknown attribute}}
preprocess1: ID(<)ID(=>),
preprocess2: ID(<=)ID(>),
preprocess3: ID(<)ID(=)ID(>),
preprocess4: ID(<=)ID(>=),
preprocess5: ID(<=)ID(>>),
preprocess6: ID(<=)ID(>>=),
preprocess7: ID(<=>) // expected-warning 0-1{{'<=>'}}
preprocess8: ID(<=>=) // expected-warning 0-1{{'<=>'}}
)]];