mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-25 14:28:54 -04:00

Clang has a hack to accept definitions of structs with tag names which have the same name as intrinsics. However, this hack didn't guard against annotation tokens showing up in the token stream. llvm-svn: 224909
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
// This is a test for an egregious hack in Clang that works around
|
|
// issues with GCC's evolution. libstdc++ 4.2.x uses __is_pod as an
|
|
// identifier (to declare a struct template like the one below), while
|
|
// GCC 4.3 and newer make __is_pod a keyword. Clang treats __is_pod as
|
|
// a keyword *unless* it is introduced following the struct keyword.
|
|
|
|
template<typename T>
|
|
struct __is_pod { // expected-warning {{keyword '__is_pod' will be made available as an identifier}}
|
|
__is_pod() {}
|
|
};
|
|
|
|
__is_pod<int> ipi;
|
|
|
|
// Ditto for __is_same.
|
|
template<typename T>
|
|
struct __is_same { // expected-warning {{keyword '__is_same' will be made available as an identifier}}
|
|
};
|
|
|
|
__is_same<int> isi;
|
|
|
|
// Another, similar egregious hack for __is_signed, which is a type
|
|
// trait in Embarcadero's compiler but is used as an identifier in
|
|
// libstdc++.
|
|
struct test_is_signed {
|
|
static const bool __is_signed = true; // expected-warning {{keyword '__is_signed' will be made available as an identifier}}
|
|
};
|
|
|
|
bool check_signed = test_is_signed::__is_signed;
|
|
|
|
template<bool B> struct must_be_true {};
|
|
template<> struct must_be_true<false>;
|
|
|
|
void foo() {
|
|
bool b = __is_pod(int);
|
|
must_be_true<__is_pod(int)> mbt;
|
|
}
|
|
|
|
// expected-warning@+1 {{declaration does not declare anything}}
|
|
struct // expected-error {{declaration of anonymous struct must be a definition}}
|
|
#pragma pack(pop)
|
|
S {
|
|
};
|
|
|
|
#if !__has_feature(is_pod)
|
|
# error __is_pod should still be available.
|
|
#endif
|