forked from OSchip/llvm-project
Introduce an egregious hack to fix PR4828.
The problem this change addresses is that we treat __is_pod and __is_empty as keywords in C++, because they are built-in type traits in GCC >= 4.3. However, GNU libstdc++ 4.2 (and possibly earlier versions) define implementation-detail struct templates named __is_pod and __is_empty. This commit solves the problem by recognizing struct __is_pod and struct __is_empty as special token sequences. When one of these token sequences is encountered, the keyword (__is_pod or __is_empty) is implicitly downgraded to an identifier so that parsing can continue. This is an egregious hack, but it has the virtue of "just working" whether someone is using libstdc++ 4.2 or not, without the need for special flags. llvm-svn: 80988
This commit is contained in:
parent
30e30587eb
commit
119b0c7185
|
@ -536,6 +536,26 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
|
|||
if (Tok.is(tok::kw___declspec))
|
||||
Attr = ParseMicrosoftDeclSpec(Attr);
|
||||
|
||||
if (TagType == DeclSpec::TST_struct && Tok.is(tok::kw___is_pod)) {
|
||||
// GNU libstdc++ 4.2 uses __is_pod as the name of a struct template, but
|
||||
// __is_pod is a keyword in GCC >= 4.3. Therefore, when we see the
|
||||
// token sequence "struct __is_pod", make __is_pod into a normal
|
||||
// identifier rather than a keyword, to allow libstdc++ 4.2 to work
|
||||
// properly.
|
||||
Tok.getIdentifierInfo()->setTokenID(tok::identifier);
|
||||
Tok.setKind(tok::identifier);
|
||||
}
|
||||
|
||||
if (TagType == DeclSpec::TST_struct && Tok.is(tok::kw___is_empty)) {
|
||||
// GNU libstdc++ 4.2 uses __is_empty as the name of a struct template, but
|
||||
// __is_empty is a keyword in GCC >= 4.3. Therefore, when we see the
|
||||
// token sequence "struct __is_empty", make __is_empty into a normal
|
||||
// identifier rather than a keyword, to allow libstdc++ 4.2 to work
|
||||
// properly.
|
||||
Tok.getIdentifierInfo()->setTokenID(tok::identifier);
|
||||
Tok.setKind(tok::identifier);
|
||||
}
|
||||
|
||||
// Parse the (optional) nested-name-specifier.
|
||||
CXXScopeSpec SS;
|
||||
if (getLang().CPlusPlus &&
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: clang-cc -fsyntax-only %s
|
||||
|
||||
template<typename T>
|
||||
struct __is_pod {
|
||||
};
|
||||
|
||||
__is_pod<int> ipi;
|
Loading…
Reference in New Issue