From 4bdd91c09fd59e0c154d759288beff300e31e1d0 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 26 Nov 2008 21:41:52 +0000 Subject: [PATCH] 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++ git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60117 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Parse/Parser.h | 20 ++++++-------------- lib/Parse/ParseDecl.cpp | 9 ++++----- lib/Parse/ParseDeclCXX.cpp | 6 ++---- lib/Parse/ParseExprCXX.cpp | 20 ++++++++++++++------ lib/Parse/Parser.cpp | 14 ++++++++------ 5 files changed, 34 insertions(+), 35 deletions(-) diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index bfb198eea1..94e3d713d5 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -118,17 +118,6 @@ private: Tok.getKind() == tok::wide_string_literal; } - /// isTokenCXXScopeSpecifier - True if this token is '::', or identifier with - /// '::' as next token, or a 'C++ scope annotation' token. - /// When not in C++, always returns false. - /// - bool isTokenCXXScopeSpecifier() { - return getLang().CPlusPlus && - (Tok.is(tok::coloncolon) || - Tok.is(tok::annot_cxxscope) || - (Tok.is(tok::identifier) && NextToken().is(tok::coloncolon))); - } - /// ConsumeToken - Consume the current 'peek token' and lex the next one. /// This does not work with all kinds of tokens: strings and specific other /// tokens must be consumed with custom methods below. This returns the @@ -239,9 +228,9 @@ private: /// typenames. void TryAnnotateTypeOrScopeToken(); - /// TryAnnotateScopeToken - Like TryAnnotateTypeOrScopeToken but only + /// TryAnnotateCXXScopeToken - Like TryAnnotateTypeOrScopeToken but only /// annotates C++ scope specifiers. - void TryAnnotateScopeToken(); + void TryAnnotateCXXScopeToken(); /// TentativeParsingAction - An object that is used as a kind of "tentative /// parsing transaction". It gets instantiated to mark the token position and @@ -476,7 +465,10 @@ private: //===--------------------------------------------------------------------===// // C++ Expressions ExprResult ParseCXXIdExpression(); - void ParseCXXScopeSpecifier(CXXScopeSpec &SS); + + /// MaybeParseCXXScopeSpecifier - Parse global scope or nested-name-specifier. + /// Returns true if a nested-name-specifier was parsed from the token stream. + bool MaybeParseCXXScopeSpecifier(CXXScopeSpec &SS); //===--------------------------------------------------------------------===// // C++ 5.2p1: C++ Casts diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 278c80f72c..71353d27b6 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/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/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index a80e06002a..268de00bc3 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/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/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index b4b6fb5330..09aea03382 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/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/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index f00eaeb17b..ec07b42319 100644 --- a/lib/Parse/Parser.cpp +++ b/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. -- 2.40.0