================
@@ -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

Reply via email to