diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2008-11-26 21:41:52 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2008-11-26 21:41:52 +0000 |
| commit | ace521a1e1bc8c3c00dd5c1d655a606753b6653e (patch) | |
| tree | 3aaa373255c12d6cca0f85b0fa2d9415466900ad /clang/lib | |
| parent | 041f958303ef302479bbd372ba8a044824851353 (diff) | |
| download | bcm5719-llvm-ace521a1e1bc8c3c00dd5c1d655a606753b6653e.tar.gz bcm5719-llvm-ace521a1e1bc8c3c00dd5c1d655a606753b6653e.zip | |
Implement some suggestions by Daniel:
-Change Parser::ParseCXXScopeSpecifier to MaybeParseCXXScopeSpecifier
-Remove Parser::isTokenCXXScopeSpecifier and fold it into MaybeParseCXXScopeSpecifier
-Rename Parser::TryAnnotateScopeToken to TryAnnotateCXXScopeToken and only allow it to be called when in C++
llvm-svn: 60117
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseExprCXX.cpp | 20 | ||||
| -rw-r--r-- | clang/lib/Parse/Parser.cpp | 14 |
4 files changed, 28 insertions, 21 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 278c80f72c3..71353d27b6c 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -427,7 +427,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) { // Only annotate C++ scope. Allow class-name as an identifier in case // it's a constructor. if (getLang().CPlusPlus) - TryAnnotateScopeToken(); + TryAnnotateCXXScopeToken(); switch (Tok.getKind()) { default: @@ -985,8 +985,7 @@ void Parser::ParseEnumSpecifier(DeclSpec &DS) { Attr = ParseAttributes(); CXXScopeSpec SS; - if (isTokenCXXScopeSpecifier()) { - ParseCXXScopeSpecifier(SS); + if (getLang().CPlusPlus && MaybeParseCXXScopeSpecifier(SS)) { if (Tok.isNot(tok::identifier)) { Diag(Tok, diag::err_expected_ident); if (Tok.isNot(tok::l_brace)) { @@ -1435,8 +1434,8 @@ void Parser::ParseDirectDeclarator(Declarator &D) { CXXScopeSpec &SS = D.getCXXScopeSpec(); DeclaratorScopeObj DeclScopeObj(*this, SS); - if (D.mayHaveIdentifier() && isTokenCXXScopeSpecifier()) { - ParseCXXScopeSpecifier(SS); + if (D.mayHaveIdentifier() && + getLang().CPlusPlus && MaybeParseCXXScopeSpecifier(SS)) { // Change the declaration context for name lookup, until this function is // exited (and the declarator has been parsed). DeclScopeObj.EnterDeclaratorScope(); diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index a80e06002a3..268de00bc36 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -218,8 +218,7 @@ void Parser::ParseClassSpecifier(DeclSpec &DS) { // Parse the (optional) nested-name-specifier. CXXScopeSpec SS; - if (isTokenCXXScopeSpecifier()) { - ParseCXXScopeSpecifier(SS); + if (getLang().CPlusPlus && MaybeParseCXXScopeSpecifier(SS)) { if (Tok.isNot(tok::identifier)) Diag(Tok, diag::err_expected_ident); } @@ -362,8 +361,7 @@ Parser::BaseResult Parser::ParseBaseSpecifier(DeclTy *ClassDecl) // Parse optional '::' and optional nested-name-specifier. CXXScopeSpec SS; - if (isTokenCXXScopeSpecifier()) - ParseCXXScopeSpecifier(SS); + MaybeParseCXXScopeSpecifier(SS); // The location of the base class itself. SourceLocation BaseLoc = Tok.getLocation(); diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index b4b6fb53302..09aea033827 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -17,7 +17,8 @@ #include "AstGuard.h" using namespace clang; -/// ParseCXXScopeSpecifier - Parse global scope or nested-name-specifier. +/// MaybeParseCXXScopeSpecifier - Parse global scope or nested-name-specifier. +/// Returns true if a nested-name-specifier was parsed from the token stream. /// /// '::'[opt] nested-name-specifier /// '::' @@ -28,14 +29,20 @@ using namespace clang; /// nested-name-specifier identifier '::' /// nested-name-specifier 'template'[opt] simple-template-id '::' [TODO] /// -void Parser::ParseCXXScopeSpecifier(CXXScopeSpec &SS) { - assert(isTokenCXXScopeSpecifier() && "Not scope specifier!"); +bool Parser::MaybeParseCXXScopeSpecifier(CXXScopeSpec &SS) { + assert(getLang().CPlusPlus && + "Call sites of this function should be guarded by checking for C++."); + + if (Tok.isNot(tok::coloncolon) && + Tok.isNot(tok::annot_cxxscope) && + (Tok.isNot(tok::identifier) || NextToken().isNot(tok::coloncolon))) + return false; if (Tok.is(tok::annot_cxxscope)) { SS.setScopeRep(Tok.getAnnotationValue()); SS.setRange(Tok.getAnnotationRange()); ConsumeToken(); - return; + return true; } SS.setBeginLoc(Tok.getLocation()); @@ -68,6 +75,8 @@ void Parser::ParseCXXScopeSpecifier(CXXScopeSpec &SS) { Actions.ActOnCXXNestedNameSpecifier(CurScope, SS, IdLoc, CCLoc, *II) ); SS.setEndLoc(CCLoc); } + + return true; } /// ParseCXXIdExpression - Handle id-expression. @@ -126,8 +135,7 @@ Parser::ExprResult Parser::ParseCXXIdExpression() { // '::' unqualified-id // CXXScopeSpec SS; - if (isTokenCXXScopeSpecifier()) - ParseCXXScopeSpecifier(SS); + MaybeParseCXXScopeSpecifier(SS); // unqualified-id: // identifier diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index f00eaeb17bc..ec07b423193 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -705,8 +705,8 @@ void Parser::TryAnnotateTypeOrScopeToken() { return; CXXScopeSpec SS; - if (isTokenCXXScopeSpecifier()) - ParseCXXScopeSpecifier(SS); + if (getLang().CPlusPlus) + MaybeParseCXXScopeSpecifier(SS); if (Tok.is(tok::identifier)) { TypeTy *Ty = Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope, &SS); @@ -746,13 +746,15 @@ void Parser::TryAnnotateTypeOrScopeToken() { /// TryAnnotateScopeToken - Like TryAnnotateTypeOrScopeToken but only /// annotates C++ scope specifiers. -void Parser::TryAnnotateScopeToken() { +void Parser::TryAnnotateCXXScopeToken() { + assert(getLang().CPlusPlus && + "Call sites of this function should be guarded by checking for C++."); + if (Tok.is(tok::annot_cxxscope)) return; - if (isTokenCXXScopeSpecifier()) { - CXXScopeSpec SS; - ParseCXXScopeSpecifier(SS); + CXXScopeSpec SS; + if (MaybeParseCXXScopeSpecifier(SS)) { // Push the current token back into the token stream (or revert it if it is // cached) and use an annotation scope token for current token. |

