hokein created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D84222
Files:
clang/lib/AST/Expr.cpp
clang/test/AST/ast-dump-recovery.c
Index: clang/test/AST/ast-dump-recovery.c
===================================================================
--- clang/test/AST/ast-dump-recovery.c
+++ clang/test/AST/ast-dump-recovery.c
@@ -39,3 +39,14 @@
// 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
+}
Index: clang/lib/AST/Expr.cpp
===================================================================
--- clang/lib/AST/Expr.cpp
+++ clang/lib/AST/Expr.cpp
@@ -3744,7 +3744,8 @@
case NPC_NeverValueDependent:
llvm_unreachable("Unexpected value dependent expression!");
case NPC_ValueDependentIsNull:
- if (isTypeDependent() || getType()->isIntegralType(Ctx))
+ if ((!containsErrors() && isTypeDependent()) ||
+ getType()->isIntegralType(Ctx))
return NPCK_ZeroExpression;
else
return NPCK_NotNull;
Index: clang/test/AST/ast-dump-recovery.c
===================================================================
--- clang/test/AST/ast-dump-recovery.c
+++ clang/test/AST/ast-dump-recovery.c
@@ -39,3 +39,14 @@
// 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
+}
Index: clang/lib/AST/Expr.cpp
===================================================================
--- clang/lib/AST/Expr.cpp
+++ clang/lib/AST/Expr.cpp
@@ -3744,7 +3744,8 @@
case NPC_NeverValueDependent:
llvm_unreachable("Unexpected value dependent expression!");
case NPC_ValueDependentIsNull:
- if (isTypeDependent() || getType()->isIntegralType(Ctx))
+ if ((!containsErrors() && isTypeDependent()) ||
+ getType()->isIntegralType(Ctx))
return NPCK_ZeroExpression;
else
return NPCK_NotNull;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits