diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 6 | ||||
-rw-r--r-- | lib/Parse/ParseExprCXX.cpp | 6 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 38 |
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() { |