From d19902c37b37ad122e0913055fd751231f16ea25 Mon Sep 17 00:00:00 2001 From: Kaelyn Takata Date: Sat, 2 May 2015 00:49:18 +0000 Subject: [PATCH] Diagnose delayed typos when parsing a postfix expression with an unmatched l_paren before setting the LHS to ExprError(). Fixes PR23285. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236371 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseExpr.cpp | 14 +++++++++++++- test/SemaCXX/typo-correction-delayed.cpp | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 9e0060be57..527351012d 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -1479,7 +1479,19 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { if (LHS.isInvalid()) { SkipUntil(tok::r_paren, StopAtSemi); } else if (Tok.isNot(tok::r_paren)) { - PT.consumeClose(); + bool HadDelayedTypo = false; + if (Actions.CorrectDelayedTyposInExpr(LHS).get() != LHS.get()) + HadDelayedTypo = true; + for (auto &E : ArgExprs) + if (Actions.CorrectDelayedTyposInExpr(E).get() != E) + HadDelayedTypo = true; + // If there were delayed typos in the LHS or ArgExprs, call SkipUntil + // instead of PT.consumeClose() to avoid emitting extra diagnostics for + // the unmatched l_paren. + if (HadDelayedTypo) + SkipUntil(tok::r_paren, StopAtSemi); + else + PT.consumeClose(); LHS = ExprError(); } else { assert((ArgExprs.size() == 0 || diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp index dfdd9af811..121863d172 100644 --- a/test/SemaCXX/typo-correction-delayed.cpp +++ b/test/SemaCXX/typo-correction-delayed.cpp @@ -203,3 +203,9 @@ namespace PR23350 { int z = 1 ? N : ; // expected-error {{expected expression}} // expected-error-re@-1 {{use of undeclared identifier 'N'{{$}}}} } + +// PR 23285. This test must be at the end of the file to avoid additional, +// unwanted diagnostics. +// expected-error-re@+2 {{use of undeclared identifier 'uintmax_t'{{$}}}} +// expected-error@+1 {{expected ';' after top level declarator}} +unsigned int a = 0(uintmax_t -- 2.40.0