]> granicus.if.org Git - clang/commitdiff
Don't process #pragma visibility during instantiation. The visibility of the
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 11 Jul 2012 02:15:51 +0000 (02:15 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 11 Jul 2012 02:15:51 +0000 (02:15 +0000)
instantiation depends on the template, its arguments and parameters, but not
where it is instantiated.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160034 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/CodeGenCXX/visibility.cpp

index f9a487270b8ecf907b228ba55626a1946ddf5263..576cbd150a4b60422bc82c34316cccafd87ca907 100644 (file)
@@ -10062,7 +10062,8 @@ void Sema::ActOnFields(Scope* S,
 
   // If there's a #pragma GCC visibility in scope, and this isn't a subclass,
   // set the visibility of this record.
-  if (Record && !Record->getDeclContext()->isRecord())
+  if (Record && !Record->getDeclContext()->isRecord() &&
+      !isa<ClassTemplateSpecializationDecl>(Record))
     AddPushedVisibilityAttribute(Record);
 }
 
index a398a45e585c01b6cd4738bec04b2a620cf2fe3f..60a77927ff02e6766dc887a42c04ebfadd8a52f3 100644 (file)
@@ -974,3 +974,16 @@ namespace test52 {
   // CHECK: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
   // CHECK-HIDDEN: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
 }
+
+namespace test53 {
+  template<typename _Tp > struct vector   {
+    static void       _M_fill_insert();
+  };
+#pragma GCC visibility push(hidden)
+  void foo() {
+    vector<unsigned>::_M_fill_insert();
+  }
+#pragma GCC visibility pop
+  // CHECK: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
+  // CHECK-HIDDEN: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
+}