================
@@ -3244,6 +3244,17 @@ static bool canUseCtorHoming(const CXXRecordDecl *RD) {
RD->hasConstexprNonCopyMoveConstructor())
return false;
+ // Skip this optimization if this type is standard-layout and is a member of
+ // some standard-layout union in this translation unit. Per the C++ spec, "it
----------------
ClaytonKnittel wrote:
Right, here's my refined understanding:
`canUseCtorHoming` is called on complete types by
`CGDebugInfo::completeRequiredType` and `CGDebugInfo::CreateType`. I verified
this by adding an `assert(RD->isComplete());` to `canUseCtorHoming` (happy to
remove this if you think it's unnecessary to keep around). Types may only be
complete if all their field member / base class types are also complete.
What matters for this code is that `isStandardLayoutUnionMember` has been
calculated on the `RecordDecl` before it is called here. This bit is
initialized by `CXXRecordDecl::completeDefinition`, which, as you would expect,
sets the complete definition bit in the `TagDecl`.
This complete bit is also set in a few other places, so as a sanity check I
temporarily added an `isComplete` bit to `CXXRecordDecl` and only set it at the
end of `CXXRecordDecl::completeDefinition`. With the assertion updated to check
this temporary `isComplete`, `check-clang` still passes.
https://github.com/llvm/llvm-project/pull/221615
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits