diff options
author | Chris Lattner <sabre@nondot.org> | 2009-01-04 23:33:56 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-01-04 23:33:56 +0000 |
commit | e584926b8602c26d442f34090dfd5293695f4af5 (patch) | |
tree | e0555f38eb1f2885499e8e00ee02855747093de7 /lib/Parse/ParseTentative.cpp | |
parent | a7bc7c880f86bc180684ef032d06df51bcae7a23 (diff) |
push the call in isCXXDeclarationSpecifier to TryAnnotateTypeOrScopeToken
down into the two cases that it can possibly affect. This avoids calls
to it that obviously can't do anything.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61651 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseTentative.cpp')
-rw-r--r-- | lib/Parse/ParseTentative.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/Parse/ParseTentative.cpp b/lib/Parse/ParseTentative.cpp index f352efa872..a76c5c66f2 100644 --- a/lib/Parse/ParseTentative.cpp +++ b/lib/Parse/ParseTentative.cpp @@ -558,10 +558,27 @@ Parser::TPResult Parser::TryParseDeclarator(bool mayBeAbstract, /// [GNU] restrict /// Parser::TPResult Parser::isCXXDeclarationSpecifier() { - // Annotate typenames and C++ scope specifiers. - TryAnnotateTypeOrScopeToken(); - switch (Tok.getKind()) { + case tok::identifier: // foo::bar + // Annotate typenames and C++ scope specifiers. If we get one, just + // recurse to handle whatever we get. + if (TryAnnotateTypeOrScopeToken()) + return isCXXDeclarationSpecifier(); + // Otherwise, not a typename. + return TPResult::False(); + + case tok::coloncolon: // ::foo::bar + if (NextToken().is(tok::kw_new) || // ::new + NextToken().is(tok::kw_delete)) // ::delete + return TPResult::False(); + + // Annotate typenames and C++ scope specifiers. If we get one, just + // recurse to handle whatever we get. + if (TryAnnotateTypeOrScopeToken()) + return isCXXDeclarationSpecifier(); + // Otherwise, not a typename. + return TPResult::False(); + // decl-specifier: // storage-class-specifier // type-specifier |