hokein created this revision. hokein added a reviewer: sammccall. Herald added a project: clang. hokein marked an inline comment as done. hokein added inline comments.
================ Comment at: clang/include/clang/Sema/Sema.h:3900 + /// Rebuild the given Expr with the TypoExpr degraded to RecoveryExpr. + ExprResult rebuildTypoExprs(Expr *TypoExpr); /// Attempts to produce a RecoveryExpr after some AST node cannot be created. ---------------- not quite happy with the naming, open for suggestions. And don't invalidate the VarDecl if the type is known. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D81395 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaExprCXX.cpp clang/test/AST/ast-dump-recovery.cpp
Index: clang/test/AST/ast-dump-recovery.cpp =================================================================== --- clang/test/AST/ast-dump-recovery.cpp +++ clang/test/AST/ast-dump-recovery.cpp @@ -25,8 +25,11 @@ // CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func' // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors s = some_func(undef1); - // CHECK: `-VarDecl {{.*}} invalid var 'int' - // FIXME: preserve the broken call. + + // CHECK: VarDecl {{.*}} var 'int' + // CHECK-NEXT: `-CallExpr {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: |-UnresolvedLookupExpr {{.*}} 'some_func' + // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors int var = some_func(undef1); } @@ -176,6 +179,12 @@ // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors // CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid' Bar b6 = Bar{invalid()}; + + // CHECK: `-VarDecl {{.*}} var1 + // CHECK-NEXT: `-BinaryOperator {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 + int var1 = undef + 1; } void InitializerForAuto() { // CHECK: `-VarDecl {{.*}} invalid a 'auto' Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -8305,17 +8305,7 @@ FullExpr = CorrectDelayedTyposInExpr(FullExpr.get()); if (FullExpr.isInvalid()) { - // Typo-correction fails, we rebuild the broken AST with the typos degraded - // to RecoveryExpr. - struct TyposReplace : TreeTransform<TyposReplace> { - TyposReplace(Sema &SemaRef) : TreeTransform(SemaRef) {} - ExprResult TransformTypoExpr(TypoExpr *E) { - return this->SemaRef.CreateRecoveryExpr(E->getBeginLoc(), - E->getEndLoc(), {}); - } - } TT(*this); - - return TT.TransformExpr(FE); + return rebuildTypoExprs(FE); } CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr); Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -19175,6 +19175,17 @@ ObjCAvailabilityCheckExpr(Version, AtLoc, RParen, Context.BoolTy); } +ExprResult Sema::rebuildTypoExprs(Expr *TypoExpr) { + struct TyposReplace : TreeTransform<TyposReplace> { + TyposReplace(Sema &SemaRef) : TreeTransform(SemaRef) {} + ExprResult TransformTypoExpr(clang::TypoExpr *E) { + return this->SemaRef.CreateRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), + {}); + } + } TT(*this); + return TT.TransformExpr(TypoExpr); +} + ExprResult Sema::CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef<Expr *> SubExprs, QualType T) { // FIXME: enable it for C++, RecoveryExpr is type-dependent to suppress Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -12015,6 +12015,9 @@ InitializationSequence Init(*this, Entity, Kind, MultiExprArg(E)); return Init.Failed() ? ExprError() : E; }); + if (Res.isInvalid()) + Res = rebuildTypoExprs(Args[Idx]); + if (Res.isInvalid()) { VDecl->setInvalidDecl(); } else if (Res.get() != Args[Idx]) { Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -3896,6 +3896,8 @@ void DiagnoseAmbiguousLookup(LookupResult &Result); //@} + /// Rebuild the given Expr with the TypoExpr degraded to RecoveryExpr. + ExprResult rebuildTypoExprs(Expr *TypoExpr); /// Attempts to produce a RecoveryExpr after some AST node cannot be created. ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef<Expr *> SubExprs,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits