summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-04-23 17:51:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-04-23 17:51:55 +0000
commitb522a5f246cccbcf72be1f3150dbdc8406346c9a (patch)
treebc41939bcff572195bc6f2671393ee33bbfc4b21
parenta3f8ba2439de325a3494ba66f8524d6ba9e6999a (diff)
downloadbcm5719-llvm-b522a5f246cccbcf72be1f3150dbdc8406346c9a.tar.gz
bcm5719-llvm-b522a5f246cccbcf72be1f3150dbdc8406346c9a.zip
Fix visibility when we have two types with explicit visibility in a template
argument list. llvm-svn: 155368
-rw-r--r--clang/lib/AST/Decl.cpp6
-rw-r--r--clang/test/CodeGenCXX/visibility.cpp12
2 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 77cc7a29b4d..a98e8dddbb8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -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:
diff --git a/clang/test/CodeGenCXX/visibility.cpp b/clang/test/CodeGenCXX/visibility.cpp
index d126de3d051..2aa067886a5 100644
--- a/clang/test/CodeGenCXX/visibility.cpp
+++ b/clang/test/CodeGenCXX/visibility.cpp
@@ -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
+}
OpenPOWER on IntegriCloud