[clang] [DebugInfo] Ignore undefined constexpr constructors in constructor homing. (PR #218165)
Clayton Knittel via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 1 13:46:57 PDT 2026
================
@@ -3239,18 +3239,36 @@ static bool canUseCtorHoming(const CXXRecordDecl *RD) {
if (isClassOrMethodDLLImport(RD))
return false;
- if (RD->isLambda() || RD->isAggregate() ||
- RD->hasTrivialDefaultConstructor() ||
- RD->hasConstexprNonCopyMoveConstructor())
+ if (RD->isLambda() || RD->isAggregate() || RD->hasTrivialDefaultConstructor())
return false;
+ // Skip this optimization if the class has a constexpr default constructor,
+ // since those constructors can be invoked without emitting type information
+ // for the constructor.
+ if (RD->needsImplicitDefaultConstructor() &&
+ RD->defaultedDefaultConstructorIsConstexpr())
+ return false;
+
+ bool HasNonDeletedCtor = false;
for (const CXXConstructorDecl *Ctor : RD->ctors()) {
if (Ctor->isCopyOrMoveConstructor())
continue;
+ const FunctionDecl *Def = nullptr;
+ if (Ctor->isDefined(Def)) {
+ const auto *CtorDef = cast<CXXConstructorDecl>(Def);
+ // Ignore delegating constructors, the target constructor's definition
+ // will emit the type info.
+ if (CtorDef->isDelegatingConstructor())
+ continue;
----------------
ClaytonKnittel wrote:
I was writing up an argument to why it was not necessary, but I realized delegating-to-copy-ctor (or move ctor) should not enable this optimization, so we do need to check for delegating constructors in https://github.com/llvm/llvm-project/pull/218807. I updated that PR, and added two tests for delegating to copy/move ctors.
https://github.com/llvm/llvm-project/pull/218165
More information about the cfe-commits
mailing list