From: Louis Dionne Date: Wed, 10 Oct 2018 15:32:29 +0000 (+0000) Subject: [clang] Properly apply attributes on explicit instantiations of static data members X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1595b4e0d0a98f8affdba55e27bbe0122dff9a93;p=clang [clang] Properly apply attributes on explicit instantiations of static data members Summary: https://llvm.org/PR39118 Reviewers: aaron.ballman, rnk Subscribers: dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D52675 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@344146 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 61e51de349..fb792b7539 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -9173,10 +9173,8 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S, if (!HasNoEffect) { // Instantiate static data member or variable template. Prev->setTemplateSpecializationKind(TSK, D.getIdentifierLoc()); - if (PrevTemplate) { - // Merge attributes. - ProcessDeclAttributeList(S, Prev, D.getDeclSpec().getAttributes()); - } + // Merge attributes. + ProcessDeclAttributeList(S, Prev, D.getDeclSpec().getAttributes()); if (TSK == TSK_ExplicitInstantiationDefinition) InstantiateVariableDefinition(D.getIdentifierLoc(), Prev); } diff --git a/test/SemaCXX/attr-on-explicit-template-instantiation.cpp b/test/SemaCXX/attr-on-explicit-template-instantiation.cpp new file mode 100644 index 0000000000..d930c17662 --- /dev/null +++ b/test/SemaCXX/attr-on-explicit-template-instantiation.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s + +// PR39118 +// Make sure that attributes are properly applied to explicit template +// instantiations. + +#define HIDDEN __attribute__((__visibility__("hidden"))) +#define VISIBLE __attribute__((__visibility__("default"))) + +namespace ns HIDDEN { + struct A { }; + template struct B { static A a; }; + template A B::a; + + // CHECK: @_ZN2ns1BIiE1aE = weak_odr global + // CHECK-NOT: hidden + template VISIBLE A B::a; +} + +struct C { }; +template struct D { static C c; }; +template C D::c; + +// CHECK-DAG: @_ZN1DIiE1cB3TAGE +template __attribute__((abi_tag("TAG"))) C D::c;