From f990cefc7ee2b4946caf659c1b4cb474a97e8681 Mon Sep 17 00:00:00 2001 From: Alp Toker Date: Tue, 7 Jan 2014 02:35:33 +0000 Subject: [PATCH] Bring back magic constants in the digraph diagnostic This backs out changes in commit r198605 and part of r198604, replacing the original tok::kw_template with a slightly more obvious placeholder tok::unknown. llvm-svn: 198666 --- clang/include/clang/Basic/DiagnosticParseKinds.td | 4 +++- clang/lib/Basic/Diagnostic.cpp | 2 -- clang/lib/Parse/ParseExprCXX.cpp | 21 ++++++++++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 4ebc29e..fc6fca5 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -640,7 +640,9 @@ def err_ctor_init_missing_comma : Error< def err_friend_decl_defines_type : Error< "cannot define a type in a friend declaration">; def err_missing_whitespace_digraph : Error< - "found '<::' after a %0 which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?">; + "found '<::' after a " + "%select{template name|const_cast|dynamic_cast|reinterpret_cast|static_cast}0" + " which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?">; def ext_deleted_function : ExtWarn< "deleted function definitions are a C++11 extension">, InGroup; diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index a5242c9..f515965f 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -646,8 +646,6 @@ static const char *getTokenDescForDiagnostic(tok::TokenKind Kind) { switch (Kind) { case tok::identifier: return "identifier"; - case tok::annot_template_id: - return "template name"; default: return 0; } diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index f5d5454..9fd6d2a 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -24,6 +24,20 @@ using namespace clang; +static int SelectDigraphErrorMessage(tok::TokenKind Kind) { + switch (Kind) { + // template name + case tok::unknown: return 0; + // casts + case tok::kw_const_cast: return 1; + case tok::kw_dynamic_cast: return 2; + case tok::kw_reinterpret_cast: return 3; + case tok::kw_static_cast: return 4; + default: + llvm_unreachable("Unknown type for digraph error message."); + } +} + // Are the two tokens adjacent in the same source file? bool Parser::areTokensAdjacent(const Token &First, const Token &Second) { SourceManager &SM = PP.getSourceManager(); @@ -44,7 +58,8 @@ static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken, Range.setBegin(DigraphToken.getLocation()); Range.setEnd(ColonToken.getLocation()); P.Diag(DigraphToken.getLocation(), diag::err_missing_whitespace_digraph) - << Kind << FixItHint::CreateReplacement(Range, "< ::"); + << SelectDigraphErrorMessage(Kind) + << FixItHint::CreateReplacement(Range, "< ::"); // Update token information to reflect their change in token type. ColonToken.setKind(tok::coloncolon); @@ -80,8 +95,8 @@ void Parser::CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectType, Template, MemberOfUnknownSpecialization)) return; - FixDigraph(*this, PP, Next, SecondToken, tok::annot_template_id, - /*AtDigraph*/ false); + FixDigraph(*this, PP, Next, SecondToken, tok::unknown, + /*AtDigraph*/false); } /// \brief Emits an error for a left parentheses after a double colon. -- 2.7.4