https://github.com/rdong8 created https://github.com/llvm/llvm-project/pull/226743
Current code is incorrectly trying to `&` two enumerators from different enums together. This patch fixes it to call `needsEHCleanup`, matching the surrounding code. >From cac024e1f2a164d49bdf65aff017fa9c23e49009 Mon Sep 17 00:00:00 2001 From: Richard Dong <[email protected]> Date: Sat, 26 Sep 2026 20:53:54 +0000 Subject: [PATCH] [Clang][CodeGen] Fix EH cleanup check for compound literals with destructors In EmitCompoundLiteralLValue and VisitCompoundLiteralExpr, the code checked `DtorKind & EHCleanup` to determine whether an exception-handling cleanup was needed. However, DtorKind is of type QualType::DestructionKind (an enum) while EHCleanup is CleanupKind (1). Bitwise AND between them inadvertently tested whether the enum value was odd, skipping EH cleanup for DK_objc_strong_lifetime (value 2). Use needsEHCleanup(DtorKind) instead. --- clang/lib/CodeGen/CGExpr.cpp | 2 +- clang/lib/CodeGen/CGExprAgg.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index eba802e187beb..6dee25dbf7eb7 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -6105,7 +6105,7 @@ LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr *E){ if (QualType::DestructionKind DtorKind = E->getType().isDestructedType()) pushLifetimeExtendedDestroy(getCleanupKind(DtorKind), DeclPtr, E->getType(), getDestroyer(DtorKind), - DtorKind & EHCleanup); + needsEHCleanup(DtorKind)); return Result; } diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index f18978c7a936e..411c3b95bf6e1 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -816,7 +816,7 @@ void AggExprEmitter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { if (QualType::DestructionKind DtorKind = E->getType().isDestructedType()) CGF.pushLifetimeExtendedDestroy( CGF.getCleanupKind(DtorKind), Slot.getAddress(), E->getType(), - CGF.getDestroyer(DtorKind), DtorKind & EHCleanup); + CGF.getDestroyer(DtorKind), CGF.needsEHCleanup(DtorKind)); } /// Attempt to look through various unimportant expressions to find a _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
