Author: Haojian Wu Date: 2020-07-22T10:03:51+02:00 New Revision: 706a4353e87b1127446db7daf5e3e95fcb408924
URL: https://github.com/llvm/llvm-project/commit/706a4353e87b1127446db7daf5e3e95fcb408924 DIFF: https://github.com/llvm/llvm-project/commit/706a4353e87b1127446db7daf5e3e95fcb408924.diff LOG: [AST][RecoveryExpr] Error-dependent expression should not be treat as a nullptr pointer constant. If an expression is contains-error and its type is unknown (dependent), we don't treat it as a null pointer constant. Fix a recovery-ast crash on C. Differential Revision: https://reviews.llvm.org/D84222 Added: Modified: clang/lib/AST/Expr.cpp clang/lib/Sema/Sema.cpp clang/test/AST/ast-dump-recovery.c Removed: ################################################################################ diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 399e7e13c445..213a6d1d1caa 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3740,6 +3740,9 @@ Expr::isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const { if (isValueDependent() && (!Ctx.getLangOpts().CPlusPlus11 || Ctx.getLangOpts().MSVCCompat)) { + // Error-dependent expr should never be a null pointer. + if (containsErrors()) + return NPCK_NotNull; switch (NPC) { case NPC_NeverValueDependent: llvm_unreachable("Unexpected value dependent expression!"); diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 735349c3de62..9c8f3fdcda4a 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -539,8 +539,10 @@ ExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty, if (VK == VK_RValue && !E->isRValue()) { switch (Kind) { default: - llvm_unreachable("can't implicitly cast lvalue to rvalue with this cast " - "kind"); + llvm_unreachable(("can't implicitly cast lvalue to rvalue with this cast " + "kind: " + + std::string(CastExpr::getCastKindName(Kind))) + .c_str()); case CK_Dependent: case CK_LValueToRValue: case CK_ArrayToPointerDecay: diff --git a/clang/test/AST/ast-dump-recovery.c b/clang/test/AST/ast-dump-recovery.c index b49c0103dbaf..f3a33fdac49b 100644 --- a/clang/test/AST/ast-dump-recovery.c +++ b/clang/test/AST/ast-dump-recovery.c @@ -39,3 +39,14 @@ void test1() { // CHECK-NEXT: `-DeclRefExpr {{.*}} 'a' 'const int' static int foo = a++; // verify no crash on local static var decl. } + +void test2() { + int* ptr; + // FIXME: the top-level expr should be a binary operator. + // CHECK: ImplicitCastExpr {{.*}} contains-errors <LValueToRValue> + // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors lvalue + // CHECK-NEXT: |-DeclRefExpr {{.*}} 'ptr' 'int *' + // CHECK-NEXT: `-RecoveryExpr {{.*}} + // CHECK-NEXT: `-DeclRefExpr {{.*}} 'some_func' + ptr = some_func(); // should not crash +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits