summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/visibility.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-02-26 19:33:14 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-02-26 19:33:14 +0000
commit3a52c44865a7276647a0b05d46e991e3c3a4517d (patch)
treea4bcfa5b91c3ecdbd764b3e3c5a7ce1d54f003af /clang/test/CodeGenCXX/visibility.cpp
parent58f546cd157a528a7472a77baca5f665c1454be9 (diff)
downloadbcm5719-llvm-3a52c44865a7276647a0b05d46e991e3c3a4517d.tar.gz
bcm5719-llvm-3a52c44865a7276647a0b05d46e991e3c3a4517d.zip
Use the most recent decl in getExplicitVisibility.
Now that implicitly hidden template arguments can make an instantiation hidden, it is important to look at more than just the canonical decl of the argument in order to see if an attribute is available in a more recent decl. This has the disadvantage of exposing when getExplicitVisibility is called, but lets us handle cases like template <typename T> struct __attribute__((visibility("default"))) barT { static void zed() {} }; class foo; class __attribute__((visibility("default"))) foo; template struct barT<foo>; llvm-svn: 176112
Diffstat (limited to 'clang/test/CodeGenCXX/visibility.cpp')
-rw-r--r--clang/test/CodeGenCXX/visibility.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/visibility.cpp b/clang/test/CodeGenCXX/visibility.cpp
index b9dec173017..5511da7cb3a 100644
--- a/clang/test/CodeGenCXX/visibility.cpp
+++ b/clang/test/CodeGenCXX/visibility.cpp
@@ -1227,3 +1227,36 @@ namespace test65 {
template class C<B<A>::InnerT>;
}
+
+namespace test66 {
+ template <typename T>
+ struct __attribute__((visibility("default"))) barT {
+ static void zed() {}
+ };
+ class foo;
+ class __attribute__((visibility("default"))) foo;
+ template struct barT<foo>;
+ // CHECK: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv
+ // CHECK-HIDDEN: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv
+
+ template <int* I>
+ struct __attribute__((visibility("default"))) barI {
+ static void zed() {}
+ };
+ extern int I;
+ extern int I __attribute__((visibility("default")));
+ template struct barI<&I>;
+ // CHECK: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv
+ // CHECK-HIDDEN: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv
+
+ typedef void (*fType)(void);
+ template<fType F>
+ struct __attribute__((visibility("default"))) barF {
+ static void zed() {}
+ };
+ void F();
+ void F() __attribute__((visibility("default")));;
+ template struct barF<F>;
+ // CHECK: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv
+ // CHECK-HIDDEN: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv
+}
OpenPOWER on IntegriCloud