Author: David Blaikie Date: 2023-02-28T01:25:22Z New Revision: d8a1a559f3009a31c517f864156db91d2ae3012c
URL: https://github.com/llvm/llvm-project/commit/d8a1a559f3009a31c517f864156db91d2ae3012c DIFF: https://github.com/llvm/llvm-project/commit/d8a1a559f3009a31c517f864156db91d2ae3012c.diff LOG: DebugInfo: Disable ctor homing for types with only deleted (non copy/move) ctors Such a type is never going to have a ctor home, and may be used for type punning or other ways of creating objects. May be a more generally acceptable solution in some cases compared to attributing with [[clang::standalone_debug]]. Differential Revision: https://reviews.llvm.org/D144931 Added: Modified: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/CodeGenCXX/debug-info-limited-ctor.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 4dab595ada76b..126b239042ee1 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -2489,9 +2489,18 @@ static bool canUseCtorHoming(const CXXRecordDecl *RD) { if (isClassOrMethodDLLImport(RD)) return false; - return !RD->isLambda() && !RD->isAggregate() && - !RD->hasTrivialDefaultConstructor() && - !RD->hasConstexprNonCopyMoveConstructor(); + if (RD->isLambda() || RD->isAggregate() || + RD->hasTrivialDefaultConstructor() || + RD->hasConstexprNonCopyMoveConstructor()) + return false; + + for (const CXXConstructorDecl *Ctor : RD->ctors()) { + if (Ctor->isCopyOrMoveConstructor()) + continue; + if (!Ctor->isDeleted()) + return true; + } + return false; } static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind, diff --git a/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp b/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp index ac53cace075cd..18adfdeed0480 100644 --- a/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp +++ b/clang/test/CodeGenCXX/debug-info-limited-ctor.cpp @@ -68,6 +68,21 @@ class K { }; void f(K k) {} +// CHECK-DAG: !DICompositeType({{.*}}name: "DeletedCtors",{{.*}}DIFlagTypePassBy +struct NonTrivial { + NonTrivial(); +}; +struct DeletedCtors { + DeletedCtors() = delete; + DeletedCtors(const DeletedCtors &) = default; + void f1(); + NonTrivial t; +}; + +const NonTrivial &f(const DeletedCtors &D) { + return D.t; +} + // Test that we don't use constructor homing on lambdas. // CHECK-DAG: ![[L:.*]] ={{.*}}!DISubprogram({{.*}}name: "L" // CHECK-DAG: !DICompositeType({{.*}}scope: ![[L]], {{.*}}DIFlagTypePassByValue @@ -89,3 +104,4 @@ VTableAndCtor::VTableAndCtor() { } // ITANIUM-DAG: !DICompositeType({{.*}}name: "VTableAndCtor", {{.*}}flags: DIFlagFwdDecl + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits