Author: Haojian Wu Date: 2023-05-19T23:43:46+02:00 New Revision: d4e935240f0223cdf2270dde587960d3d3868c6f
URL: https://github.com/llvm/llvm-project/commit/d4e935240f0223cdf2270dde587960d3d3868c6f DIFF: https://github.com/llvm/llvm-project/commit/d4e935240f0223cdf2270dde587960d3d3868c6f.diff LOG: [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 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/AST/ComputeDependence.cpp clang/test/AST/ast-dump-recovery.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3035e23f0b45c..3e2b08e9693fe 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 <https://github.com/llvm/llvm-project/issues/62446>`_). +- Propagate the value-dependent bit for VAArgExpr. Fixes a crash where a + __builtin_va_arg call has invalid arguments. + (`#62711 <https://github.com/llvm/llvm-project/issues/62711>`_). Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp index 5a301c10aca6d..4b6bc2d994ca8 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 75441c1c9de0a..33f0f2ad3c996 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 {{.*}} '<dependent type>' contains-errors + // CHECK-NEXT: | `-RecoveryExpr {{.*}} '<dependent type>' contains-errors + if (__builtin_va_arg(undef, int) << 1); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits