This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG684e416ef136: [AST][RecoveryExpr] Preserve the AST for invalid conditions. (authored by hokein).
Changed prior to commit: https://reviews.llvm.org/D81163?vs=270413&id=279011#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81163/new/ https://reviews.llvm.org/D81163 Files: clang/lib/Sema/SemaExpr.cpp clang/test/AST/ast-dump-recovery.cpp clang/test/SemaTemplate/instantiate-expr-3.cpp Index: clang/test/SemaTemplate/instantiate-expr-3.cpp =================================================================== --- clang/test/SemaTemplate/instantiate-expr-3.cpp +++ clang/test/SemaTemplate/instantiate-expr-3.cpp @@ -65,7 +65,7 @@ void f(T t) { (void)({ if (t) // expected-error{{contextually convertible}} - t = t + 17; + t = t + 17; // expected-error {{invalid operands to binary expression ('N1::X' and 'int')}} t + 12; // expected-error{{invalid operands}} }); } Index: clang/test/AST/ast-dump-recovery.cpp =================================================================== --- clang/test/AST/ast-dump-recovery.cpp +++ clang/test/AST/ast-dump-recovery.cpp @@ -229,3 +229,30 @@ // CHECK: RecoveryExpr {{.*}} 'int' contains-errors xvalue xvalue(); // call to a function (rvalue reference return type) yields an xvalue. } + +void InvalidCondition() { + // CHECK: IfStmt {{.*}} + // CHECK-NEXT: |-RecoveryExpr {{.*}} <col:7, col:15> '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} <col:7> + if (invalid()) {} + + // CHECK: WhileStmt {{.*}} + // CHECK-NEXT: |-RecoveryExpr {{.*}} <col:10, col:18> '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} <col:10> + while (invalid()) {} + + // CHECK: SwitchStmt {{.*}} + // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} <col:10> + switch(invalid()) { + case 1: + break; + } + // FIXME: figure out why the type of ConditionalOperator is not int. + // CHECK: ConditionalOperator {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} + // CHECK-NEXT: |-IntegerLiteral {{.*}} 'int' 1 + // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 2 + invalid() ? 1 : 2; +} Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -18458,9 +18458,12 @@ Cond = CheckSwitchCondition(Loc, SubExpr); break; } - if (Cond.isInvalid()) - return ConditionError(); - + if (Cond.isInvalid()) { + Cond = CreateRecoveryExpr(SubExpr->getBeginLoc(), SubExpr->getEndLoc(), + {SubExpr}); + if (!Cond.get()) + return ConditionError(); + } // FIXME: FullExprArg doesn't have an invalid bit, so check nullness instead. FullExprArg FullExpr = MakeFullExpr(Cond.get(), Loc); if (!FullExpr.get())
Index: clang/test/SemaTemplate/instantiate-expr-3.cpp =================================================================== --- clang/test/SemaTemplate/instantiate-expr-3.cpp +++ clang/test/SemaTemplate/instantiate-expr-3.cpp @@ -65,7 +65,7 @@ void f(T t) { (void)({ if (t) // expected-error{{contextually convertible}} - t = t + 17; + t = t + 17; // expected-error {{invalid operands to binary expression ('N1::X' and 'int')}} t + 12; // expected-error{{invalid operands}} }); } Index: clang/test/AST/ast-dump-recovery.cpp =================================================================== --- clang/test/AST/ast-dump-recovery.cpp +++ clang/test/AST/ast-dump-recovery.cpp @@ -229,3 +229,30 @@ // CHECK: RecoveryExpr {{.*}} 'int' contains-errors xvalue xvalue(); // call to a function (rvalue reference return type) yields an xvalue. } + +void InvalidCondition() { + // CHECK: IfStmt {{.*}} + // CHECK-NEXT: |-RecoveryExpr {{.*}} <col:7, col:15> '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} <col:7> + if (invalid()) {} + + // CHECK: WhileStmt {{.*}} + // CHECK-NEXT: |-RecoveryExpr {{.*}} <col:10, col:18> '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} <col:10> + while (invalid()) {} + + // CHECK: SwitchStmt {{.*}} + // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} <col:10> + switch(invalid()) { + case 1: + break; + } + // FIXME: figure out why the type of ConditionalOperator is not int. + // CHECK: ConditionalOperator {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: |-RecoveryExpr {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: | `-UnresolvedLookupExpr {{.*}} + // CHECK-NEXT: |-IntegerLiteral {{.*}} 'int' 1 + // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 2 + invalid() ? 1 : 2; +} Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -18458,9 +18458,12 @@ Cond = CheckSwitchCondition(Loc, SubExpr); break; } - if (Cond.isInvalid()) - return ConditionError(); - + if (Cond.isInvalid()) { + Cond = CreateRecoveryExpr(SubExpr->getBeginLoc(), SubExpr->getEndLoc(), + {SubExpr}); + if (!Cond.get()) + return ConditionError(); + } // FIXME: FullExprArg doesn't have an invalid bit, so check nullness instead. FullExprArg FullExpr = MakeFullExpr(Cond.get(), Loc); if (!FullExpr.get())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits