Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -1685,7 +1685,8 @@ if (!CXXDecl) return false; - if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass()) + if (CXXDecl->hasDefinition() && CXXDecl->isDynamicClass() && + !CXXDecl->hasAttr()) return true; TemplateSpecializationKind Spec = TSK_Undeclared; Index: test/CodeGenCXX/debug-info-dllimport-base-class.cpp =================================================================== --- /dev/null +++ test/CodeGenCXX/debug-info-dllimport-base-class.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple i386-pc-windows -emit-llvm -gcodeview -debug-info-kind=limited -fms-compatibility %s -x c++ -o - | FileCheck %s + +// Ensure we emit debug info for the full definition of base classes that will +// be imported from a DLL. Otherwise, the debugger wouldn't be able to show the +// members. + +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ImportedBase", +// CHECK-NOT: DIFlagFwdDecl +// CHECK-SAME: ){{$}} + +struct __declspec(dllimport) ImportedBase { + ImportedBase(); + virtual void Foo(); +}; + +struct DerivedFromImported : public ImportedBase {}; + +int main() { + DerivedFromImported d; +}