diff options
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 48fb2318e61..5b90557e799 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -6041,6 +6041,21 @@ static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, diag::warn_dllimport_dropped_from_inline_function) << NewDecl << OldImportAttr; } + + // A specialization of a class template member function is processed here + // since it's a redeclaration. If the parent class is dllexport, the + // specialization inherits that attribute. This doesn't happen automatically + // since the parent class isn't instantiated until later. + if (IsSpecialization && isa<CXXMethodDecl>(NewDecl) && !NewImportAttr && + !NewExportAttr) { + if (const DLLExportAttr *ParentExportAttr = cast<CXXMethodDecl>(NewDecl) + ->getParent() + ->getAttr<DLLExportAttr>()) { + DLLExportAttr *NewAttr = ParentExportAttr->clone(S.Context); + NewAttr->setInherited(true); + NewDecl->addAttr(NewAttr); + } + } } /// Given that we are within the definition of the given function, |