================
@@ -901,6 +901,33 @@ void
CIRGenFunction::emitImplicitAssignmentOperatorBody(FunctionArgList &args) {
assert(!cir::MissingFeatures::incrementProfileCounter());
assert(!cir::MissingFeatures::runCleanupsScope());
+ // For a memcpy-equivalent special member (a union, or a trivially-copyable
+ // record) the synthesized body either copies nothing -- a union body is just
+ // `return *this` -- or relies on a memcpy the AST does not spell out as
+ // field assignments. Mirror classic CodeGen's AssignmentMemcpyizer: copy
+ // the whole object once, then fall through to emit the trailing
+ // `return *this`. Emitting the copy but skipping the return would leave the
+ // result reference uninitialized.
+ if (assignOp->isMemcpyEquivalentSpecialMember(getContext())) {
+ CanQualType recordTy =
+ getContext().getCanonicalTagType(assignOp->getParent());
+ LValue dest = makeNaturalAlignAddrLValue(loadCXXThis(), recordTy);
+ // The source is the trailing reference parameter; load it to get the
+ // referent's address before copying (mirrors the copy-constructor path).
+ mlir::Value srcPtr = builder.createLoad(getLoc(assignOp->getLocation()),
+ getAddrOfLocalVar(args.back()));
+ LValue src = makeNaturalAlignAddrLValue(srcPtr, recordTy);
+ emitAggregateAssign(dest, src, recordTy);
+
+ for (Stmt *s : rootCS->body())
+ if (isa<ReturnStmt>(s))
+ if (emitStmt(s, /*useCurrentScope=*/true).failed())
+ cgm.errorNYI(s->getSourceRange(),
+ std::string("emitImplicitAssignmentOperatorBody: ") +
+ s->getStmtClassName());
----------------
andykaylor wrote:
More evidence that the fix should be made in the AST construction:
https://github.com/llvm/llvm-project/blob/4f55655a932133fe49a8fb0e3e1f622f2ead66a3/clang/lib/Sema/SemaDeclCXX.cpp#L15474
```
// FIXME: We should form some kind of AST representation for the implied
// memcpy in a union copy operation.
if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
continue;
```
This is why the copy assignment operator body is empty for unions. The move
assignment operator contains the same code and FIXME.
https://github.com/llvm/llvm-project/pull/198918
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits