diff options
-rw-r--r-- | lib/AST/Decl.cpp | 6 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 3 | ||||
-rw-r--r-- | test/CodeGenCXX/visibility.cpp | 13 |
3 files changed, 18 insertions, 4 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 2066a98984..33826cbb46 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -702,10 +702,8 @@ llvm::Optional<Visibility> NamedDecl::getExplicitVisibility() const { // specialization of a class template, check for visibility // on the pattern. if (const ClassTemplateSpecializationDecl *spec - = dyn_cast<ClassTemplateSpecializationDecl>(this)) { - ClassTemplateDecl *TD = spec->getSpecializedTemplate()->getCanonicalDecl(); - return getVisibilityOf(TD->getTemplatedDecl()); - } + = dyn_cast<ClassTemplateSpecializationDecl>(this)) + return getVisibilityOf(spec->getSpecializedTemplate()->getTemplatedDecl()); // If this is a member class of a specialization of a class template // and the corresponding decl has explicit visibility, use that. diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 4605e01fa2..5d14d8762c 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -1134,6 +1134,9 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, NewTemplate->setInvalidDecl(); NewClass->setInvalidDecl(); } + if (PrevClassTemplate) + mergeDeclAttributes(NewClass, PrevClassTemplate->getTemplatedDecl()); + return NewTemplate; } diff --git a/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index 94fb290ad1..92b7f4453f 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/test/CodeGenCXX/visibility.cpp @@ -1031,3 +1031,16 @@ namespace test55 { // CHECK: declare hidden void @_ZN6test553fooIiE3barEv // CHECK-HIDDEN: declare hidden void @_ZN6test553fooIiE3barEv } + +namespace test56 { + template <class T> struct foo; + template <class T> + struct __attribute__((visibility("hidden"))) foo { + static void bar(); + }; + void foobar() { + foo<int>::bar(); + } + // CHECK: declare hidden void @_ZN6test563fooIiE3barEv + // CHECK-HIDDEN: declare hidden void @_ZN6test563fooIiE3barEv +} |