From d4e935240f0223cdf2270dde587960d3d3868c6f Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Fri, 19 May 2023 12:00:38 +0200 Subject: [PATCH] [clang][AST] Propagate the value-dependent bit for VAArgExpr. Fixes https://github.com/llvm/llvm-project/issues/62711 We never set the value-dependent bit for the VAArgExpr before this patch, this was fine becase the dependent-type TypoExpr was always resolved before checking the operands (see https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaExpr.cpp#L21173-L21180) Now we have enabled the dependence by default for C, the typo expr is not early resolved before checking rather than delayed (share the same codepath with C++). The fix is to propagate the value-dependent bit for VAArgExpr where it contains a TypoExpr, so that the AST node can be handled properly. Differential Revision: https://reviews.llvm.org/D150955 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/AST/ComputeDependence.cpp | 2 +- clang/test/AST/ast-dump-recovery.c | 8 ++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3035e23..3e2b08e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -413,6 +413,9 @@ Bug Fixes in This Version - Fix a crash when an enum constant has a dependent-type recovery expression for C. (`#62446 `_). +- Propagate the value-dependent bit for VAArgExpr. Fixes a crash where a + __builtin_va_arg call has invalid arguments. + (`#62711 `_). Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index 5a301c1..4b6bc2d 100644 --- a/clang/lib/AST/ComputeDependence.cpp +++ b/clang/lib/AST/ComputeDependence.cpp @@ -227,7 +227,7 @@ ExprDependence clang::computeDependence(VAArgExpr *E) { auto D = toExprDependenceAsWritten( E->getWrittenTypeInfo()->getType()->getDependence()) | (E->getSubExpr()->getDependence() & ~ExprDependence::Type); - return D & ~ExprDependence::Value; + return D; } ExprDependence clang::computeDependence(NoInitExpr *E) { diff --git a/clang/test/AST/ast-dump-recovery.c b/clang/test/AST/ast-dump-recovery.c index 75441c1..33f0f2a 100644 --- a/clang/test/AST/ast-dump-recovery.c +++ b/clang/test/AST/ast-dump-recovery.c @@ -109,3 +109,11 @@ void test4() { b, }; } + +// Verify no crash +void test5_GH62711() { + // CHECK: VAArgExpr {{.*}} 'int' contains-errors + // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} '' contains-errors + // CHECK-NEXT: | `-RecoveryExpr {{.*}} '' contains-errors + if (__builtin_va_arg(undef, int) << 1); +} -- 2.7.4