Don't inherit dll attributes to deleted methods (PR19988)
We would previously end up with an error when instantiating the
following template:
template <typename> struct __declspec(dllimport) S {
void foo() = delete;
};
S<int> s;
error: attribute 'dllimport' cannot be applied to a deleted function
llvm-svn: 210550
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 3b660fd..b5e6dc8 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -4379,6 +4379,8 @@
for (Decl *Member : Class->decls()) {
if (!isa<CXXMethodDecl>(Member) && !isa<VarDecl>(Member))
continue;
+ if (isa<CXXMethodDecl>(Member) && cast<CXXMethodDecl>(Member)->isDeleted())
+ continue;
if (InheritableAttr *MemberAttr = getDLLAttr(Member)) {
if (S.Context.getTargetInfo().getCXXABI().isMicrosoft() &&
@@ -4399,9 +4401,6 @@
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member)) {
if (ClassExported) {
- if (MD->isDeleted())
- continue;
-
if (MD->isUserProvided()) {
// Instantiate non-default methods.
S.MarkFunctionReferenced(Class->getLocation(), MD);