diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -991,11 +991,21 @@ uint64_t Size = 0; uint32_t Align = 0; + llvm::DINode::DIFlags Flags = llvm::DINode::FlagFwdDecl; + + // Add flag to nontrivial forward declarations. To be consistent with MSVC, + // add the flag if a record has no definition because we don't know whether + // it will be trivial or not. + if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) + if (!CXXRD->hasDefinition() || + (CXXRD->hasDefinition() && !CXXRD->isTrivial())) + Flags |= llvm::DINode::FlagNonTrivial; + // Create the type. SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU); llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType( - getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, - llvm::DINode::FlagFwdDecl, Identifier); + getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align, Flags, + Identifier); if (CGM.getCodeGenOpts().DebugFwdTemplateParams) if (auto *TSpecial = dyn_cast(RD)) DBuilder.replaceArrays(RetTy, llvm::DINodeArray(), diff --git a/clang/test/CodeGenCXX/debug-info-composite-triviality-fwd-decl.cpp b/clang/test/CodeGenCXX/debug-info-composite-triviality-fwd-decl.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/debug-info-composite-triviality-fwd-decl.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -emit-llvm -gcodeview -debug-info-kind=limited -x c %s -o - | FileCheck %s --check-prefix CHECK-C +// RUN: %clang_cc1 -emit-llvm -gcodeview -debug-info-kind=limited -x c++ %s -o - | FileCheck %s --check-prefix CHECK-CXX +// +// Test for DIFlagNonTrivial on forward declared DICompositeTypes. + +struct Incomplete; +struct Incomplete (*func_ptr)() = 0; +// CHECK-C: !DICompositeType({{.*}}name: "Incomplete" +// CHECK-C-NOT: DIFlagNonTrivial +// CHECK-CXX: !DICompositeType({{.*}}name: "Incomplete" +// CHECK-CXX-SAME: DIFlagNonTrivial