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
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp
index 278c80f..71353d2 100644
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -427,7 +427,7 @@
// 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 @@
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 @@
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 a80e060..268de00 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -218,8 +218,7 @@
// 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 @@
// 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 b4b6fb5..09aea03 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 @@
/// 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 @@
Actions.ActOnCXXNestedNameSpecifier(CurScope, SS, IdLoc, CCLoc, *II) );
SS.setEndLoc(CCLoc);
}
+
+ return true;
}
/// ParseCXXIdExpression - Handle id-expression.
@@ -126,8 +135,7 @@
// '::' 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 f00eaeb..ec07b42 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -705,8 +705,8 @@
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 @@
/// 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.