From: Kaelyn Takata Date: Fri, 10 Apr 2015 19:16:46 +0000 (+0000) Subject: Don't eagerly typo-correct to a keyword if the next token is a right paren. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ff7b692c11c51243e4663dd9b237c37ce966f6d1;p=clang Don't eagerly typo-correct to a keyword if the next token is a right paren. Take advantage of the delayed typo no longer being eagerly corrected to a keyword to filter out keyword corrections (and other things like unresolved & overloaded expressions, which have placeholder types) when correcting typos inside of a decltype(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234623 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 5c1a7bb3cf..c74b02877c 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -799,7 +799,10 @@ SourceLocation Parser::ParseDecltypeSpecifier(DeclSpec &DS) { // The operand of the decltype specifier is an unevaluated operand. EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated, nullptr,/*IsDecltype=*/true); - Result = Actions.CorrectDelayedTyposInExpr(ParseExpression()); + Result = + Actions.CorrectDelayedTyposInExpr(ParseExpression(), [](Expr *E) { + return E->hasPlaceholderType() ? ExprError() : E; + }); if (Result.isInvalid()) { DS.SetTypeSpecError(); if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch)) { diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 72af14d068..315c9574e9 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -928,7 +928,8 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, Res = Actions.ActOnIdExpression( getCurScope(), ScopeSpec, TemplateKWLoc, Name, Tok.is(tok::l_paren), isAddressOfOperand, std::move(Validator), - /*IsInlineAsmIdentifier=*/false, &Replacement); + /*IsInlineAsmIdentifier=*/false, + Tok.is(tok::r_paren) ? nullptr : &Replacement); if (!Res.isInvalid() && !Res.get()) { UnconsumeToken(Replacement); return ParseCastExpression(isUnaryExpression, isAddressOfOperand, diff --git a/test/SemaCXX/typo-correction-cxx11.cpp b/test/SemaCXX/typo-correction-cxx11.cpp new file mode 100644 index 0000000000..573c6aa117 --- /dev/null +++ b/test/SemaCXX/typo-correction-cxx11.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s + +namespace PR23186 { +decltype(ned); // expected-error-re {{use of undeclared identifier 'ned'{{$}}}} +// The code below was triggering an UNREACHABLE in ASTContext::getTypeInfoImpl +// once the above code failed to recover properly after making the bogus +// correction of 'ned' to 'new'. +template +struct S { + enum { V }; + void f() { + switch (0) + case V: + ; + } +}; +}