[clang] [Clang] Fix sret AS for non-trivial-copy returns. (PR #186275)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 15 11:53:16 PDT 2026
================
@@ -288,13 +288,18 @@ void AggExprEmitter::withReturnValueSlot(
// its lifetime before we have the chance to emit a proper destructor call.
//
// We also need a temporary if the destination is in a different address space
- // from the alloca AS, to avoid an invalid addrspacecast on the sret pointer.
- // Look through addrspacecasts to avoid unnecessary temps when the
- // destination is already in the alloca AS.
- unsigned SRetAS = CGF.getContext().getTargetAddressSpace(
- CGF.CGM.getASTAllocaAddressSpace());
- bool DestASMismatch = !Dest.isIgnored() &&
- RetTy.isTriviallyCopyableType(CGF.getContext()) &&
+ // from the sret AS. Use the target hook to get the actual sret AS for this
+ // return type.
+ const CXXRecordDecl *RD = RetTy->getAsCXXRecordDecl();
+ LangAS SRetLangAS = CGF.CGM.getTargetCodeGenInfo().getSRetAddrSpace(RD);
+ unsigned SRetAS = CGF.getContext().getTargetAddressSpace(SRetLangAS);
+ bool CanAggregateCopy =
+ RD ? (RD->hasTrivialCopyConstructor() ||
+ RD->hasTrivialMoveConstructor() || RD->hasTrivialCopyAssignment() ||
+ RD->hasTrivialMoveAssignment() || RD->hasAttr<TrivialABIAttr>() ||
+ RD->isUnion())
+ : RetTy.isTriviallyCopyableType(CGF.getContext());
+ bool DestASMismatch = !Dest.isIgnored() && CanAggregateCopy &&
----------------
efriedma-quic wrote:
Do we need to check CanAggregateCopy? Whether we need a temporary is inherent based on the address-spaces in question. If the address-spaces mismatch and CanAggregateCopy is false, that would indicate getSRetAddrSpace() is broken.
https://github.com/llvm/llvm-project/pull/186275
More information about the cfe-commits
mailing list