]> granicus.if.org Git - clang/commitdiff
Fix visibility when we have two types with explicit visibility in a template
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 23 Apr 2012 17:51:55 +0000 (17:51 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 23 Apr 2012 17:51:55 +0000 (17:51 +0000)
argument list.

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

lib/AST/Decl.cpp
test/CodeGenCXX/visibility.cpp

index 77cc7a29b4d4dafad557d002ab8173e23deb1747..a98e8dddbb825e6d05ca2875a322b4bc536e2d23 100644 (file)
@@ -122,7 +122,7 @@ static LinkageInfo getLVForTemplateArgumentList(const TemplateArgument *Args,
       break;
 
     case TemplateArgument::Type:
-      LV.merge(getLVForType(Args[I].getAsType()));
+      LV.mergeWithMin(getLVForType(Args[I].getAsType()));
       break;
 
     case TemplateArgument::Declaration:
@@ -130,7 +130,7 @@ static LinkageInfo getLVForTemplateArgumentList(const TemplateArgument *Args,
       // arguments, valid only in C++0x.
       if (Decl *D = Args[I].getAsDecl()) {
         if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
-          LV.merge(getLVForDecl(ND, OnlyTemplate));
+          LV.mergeWithMin(getLVForDecl(ND, OnlyTemplate));
       }
       break;
 
@@ -138,7 +138,7 @@ static LinkageInfo getLVForTemplateArgumentList(const TemplateArgument *Args,
     case TemplateArgument::TemplateExpansion:
       if (TemplateDecl *Template
                 = Args[I].getAsTemplateOrTemplatePattern().getAsTemplateDecl())
-        LV.merge(getLVForDecl(Template, OnlyTemplate));
+        LV.mergeWithMin(getLVForDecl(Template, OnlyTemplate));
       break;
 
     case TemplateArgument::Pack:
index d126de3d0511fcddb4d361cd622a60ec5d0e6b3a..2aa067886a5288834691fdb4ed3b6e7e4c1c53aa 100644 (file)
@@ -700,3 +700,15 @@ namespace test35 {
   // CHECK: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
   // CHECK-HIDDEN: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
 }
+
+namespace test36 {
+  template<typename T1, typename T2>
+  class foo {
+    void bar() {}
+  };
+  class DEFAULT S1 {};
+  struct HIDDEN S2 {};
+  template class foo<S1, S2>;
+  // CHECK: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
+  // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
+}