aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Parse/ParseDecl.cpp6
-rw-r--r--lib/Parse/ParseExprCXX.cpp6
-rw-r--r--lib/Parse/Parser.cpp38
3 files changed, 26 insertions, 24 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp
index 0de8c53d90..00a03390da 100644
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -1270,11 +1270,7 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D,
// Parse declarator '=' initializer.
// If a '==' or '+=' is found, suggest a fixit to '='.
- if (Tok.is(tok::equal) ||
- CreateTokenReplacement(tok::equal, tok::equalequal,
- diag::err_invalid_equalequal_after_declarator) ||
- CreateTokenReplacement(tok::equal, tok::plusequal,
- diag::err_invalid_plusequal_after_declarator)) {
+ if (isTokenEqualOrEqualTypo()) {
ConsumeToken();
if (Tok.is(tok::kw_delete)) {
if (D.isFunctionDeclarator())
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp
index 831c446fbb..a115f185de 100644
--- a/lib/Parse/ParseExprCXX.cpp
+++ b/lib/Parse/ParseExprCXX.cpp
@@ -1260,11 +1260,7 @@ bool Parser::ParseCXXCondition(ExprResult &ExprOut,
// '=' assignment-expression
// If a '==' or '+=' is found, suggest a fixit to '='.
- if (Tok.is(tok::equal) ||
- CreateTokenReplacement(tok::equal, tok::equalequal,
- diag::err_invalid_equalequal_after_declarator) ||
- CreateTokenReplacement(tok::equal, tok::plusequal,
- diag::err_invalid_plusequal_after_declarator)) {
+ if (isTokenEqualOrEqualTypo()) {
ConsumeToken();
ExprResult AssignExpr(ParseAssignmentExpression());
if (!AssignExpr.isInvalid())
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index 6342b10568..45b4a74583 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -1401,21 +1401,31 @@ bool Parser::TryAnnotateCXXScopeToken(bool EnteringContext) {
return false;
}
-bool Parser::CreateTokenReplacement(tok::TokenKind ExpectedToken,
- tok::TokenKind FoundToken,
- unsigned DiagID) {
- if (Tok.isNot(FoundToken))
+bool Parser::isTokenEqualOrEqualTypo() {
+ tok::TokenKind Kind = Tok.getKind();
+ switch (Kind) {
+ default:
return false;
-
- // We have FoundToken in a context that we would expect an ExpectedToken.
- // The user probably made a typo, intending to type ExpectedToken.
- // Emit diagnostic, fixit hint to turn ReplaceToken -> ExpectedToken
- // and continue as if the user typed ExpectedToken.
- Tok.setKind(ExpectedToken);
- Diag(Tok, DiagID)
- << FixItHint::CreateReplacement(SourceRange(Tok.getLocation()),
- getTokenSimpleSpelling(ExpectedToken));
- return true;
+ case tok::ampequal: // &=
+ case tok::starequal: // *=
+ case tok::plusequal: // +=
+ case tok::minusequal: // -=
+ case tok::exclaimequal: // !=
+ case tok::slashequal: // /=
+ case tok::percentequal: // %=
+ case tok::lessequal: // <=
+ case tok::lesslessequal: // <<=
+ case tok::greaterequal: // >=
+ case tok::greatergreaterequal: // >>=
+ case tok::caretequal: // ^=
+ case tok::pipeequal: // |=
+ case tok::equalequal: // ==
+ Diag(Tok, diag::err_invalid_token_after_declarator_suggest_equal)
+ << getTokenSimpleSpelling(Kind)
+ << FixItHint::CreateReplacement(SourceRange(Tok.getLocation()), "=");
+ case tok::equal:
+ return true;
+ }
}
SourceLocation Parser::handleUnexpectedCodeCompletionToken() {