[AST][RecoveryExpr] Don't perform early typo correction in C.

The dependent mechanism for C error-recovery is mostly finished,
this is the only place we have missed.

Differential Revision: https://reviews.llvm.org/D89045
This commit is contained in:
Haojian Wu 2020-10-12 11:24:45 +02:00
parent bb406f36dc
commit 8852d30b1c
2 changed files with 3 additions and 7 deletions

View File

@ -8494,7 +8494,7 @@ ExprResult Sema::ActOnConditionalOp(SourceLocation QuestionLoc,
SourceLocation ColonLoc,
Expr *CondExpr, Expr *LHSExpr,
Expr *RHSExpr) {
if (!getLangOpts().CPlusPlus) {
if (!Context.isDependenceAllowed()) {
// C cannot handle TypoExpr nodes in the condition because it
// doesn't handle dependent types properly, so make sure any TypoExprs have
// been dealt with before checking the operands.

View File

@ -24,14 +24,10 @@ int postfix_inc = a++;
int unary_address = &(a + 1);
// CHECK: VarDecl {{.*}} ternary 'int' cinit
// CHECK-NEXT: `-RecoveryExpr {{.*}}
// CHECK-NEXT: `-ConditionalOperator {{.*}}
// CHECK-NEXT: |-DeclRefExpr {{.*}} 'a'
// CHECK-NEXT: |-TypoExpr {{.*}}
// CHECK-NEXT: |-RecoveryExpr {{.*}}
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'a'
// FIXME: The TypoExpr should never be print, and should be downgraded to
// RecoveryExpr -- typo correction is performed too early in C-only codepath,
// which makes no correction when clang finishes the full expr (Sema::Sema::ActOnFinishFullExpr).
// this will be fixed when we support dependent mechanism and delayed typo correction for C.
int ternary = a ? undef : a;
void test1() {