[dllexport] Instantiate default ctor default args

Fixes https://bugs.llvm.org/show_bug.cgi?id=51414.

Differential Revision: https://reviews.llvm.org/D108021
This commit is contained in:
Reid Kleckner 2021-08-23 15:56:29 -07:00
parent a58c2e4af0
commit e42ce422a9
2 changed files with 29 additions and 0 deletions

View File

@ -6005,6 +6005,15 @@ static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) {
if (TSK == TSK_ImplicitInstantiation && !ClassAttr->isInherited())
continue;
// If this is an MS ABI dllexport default constructor, instantiate any
// default arguments.
if (S.Context.getTargetInfo().getCXXABI().isMicrosoft()) {
auto *CD = dyn_cast<CXXConstructorDecl>(MD);
if (CD && CD->isDefaultConstructor() && TSK == TSK_Undeclared) {
S.InstantiateDefaultCtorDefaultArgs(CD);
}
}
S.MarkFunctionReferenced(Class->getLocation(), MD);
// The function will be passed to the consumer when its definition is

View File

@ -0,0 +1,20 @@
// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c++14 \
// RUN: -fno-threadsafe-statics -fms-extensions -O1 -mconstructor-aliases \
// RUN: -disable-llvm-passes -o - %s -w -fms-compatibility-version=19.00 | \
// RUN: FileCheck %s
struct HasDtor {
~HasDtor();
int o;
};
struct HasImplicitDtor1 {
HasDtor o;
};
struct __declspec(dllexport) CtorClosureOuter {
struct __declspec(dllexport) CtorClosureInner {
CtorClosureInner(const HasImplicitDtor1 &v = {}) {}
};
};
// CHECK-LABEL: $"??1HasImplicitDtor1@@QAE@XZ" = comdat any
// CHECK-LABEL: define weak_odr dso_local dllexport x86_thiscallcc void @"??_FCtorClosureInner@CtorClosureOuter@@QAEXXZ"({{.*}}) {{#[0-9]+}} comdat