diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3035e23f0b45c2..3e2b08e9693fe6 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 5a301c10aca6d1..4b6bc2d994ca84 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 75441c1c9de0a4..33f0f2ad3c9967 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); +}