1a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -ftype-visibility default -emit-llvm -o %t
2a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall// RUN: FileCheck %s < %t
3a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall// RUN: FileCheck -check-prefix=CHECK-GLOBAL %s < %t
4a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
5a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall// The two visibility options above are how we translate
6a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall// -fvisibility-ms-compat in the driver.
7a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
8a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall// rdar://13079314
9a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
10a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall#define HIDDEN __attribute__((visibility("hidden")))
11a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall#define PROTECTED __attribute__((visibility("protected")))
12a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall#define DEFAULT __attribute__((visibility("default")))
13a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
14a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace std {
15a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  class type_info;
16a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall};
17a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
18a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace test0 {
19a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  struct A {
20a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void foo();
21a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void bar();
22a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  };
23a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
24a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  void A::foo() { bar(); }
2593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN5test01A3fooEv()
26a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK: declare void @_ZN5test01A3barEv()
27a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
28a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  const std::type_info &ti = typeid(A);
29a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZTSN5test01AE = linkonce_odr constant
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-GLOBAL: @_ZTIN5test01AE = linkonce_odr constant
31a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZN5test02tiE = hidden constant
32a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall}
33a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
34a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace test1 {
35a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  struct HIDDEN A {
36a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void foo();
37a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void bar();
38a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  };
39a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
40a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  void A::foo() { bar(); }
4193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN5test11A3fooEv()
42a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK: declare hidden void @_ZN5test11A3barEv()
43a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
44a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  const std::type_info &ti = typeid(A);
45a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZTSN5test11AE = linkonce_odr hidden constant
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-GLOBAL: @_ZTIN5test11AE = linkonce_odr hidden constant
47a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZN5test12tiE = hidden constant
48a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall}
49a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
50a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace test2 {
51a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  struct DEFAULT A {
52a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void foo();
53a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void bar();
54a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  };
55a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
56a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  void A::foo() { bar(); }
5793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN5test21A3fooEv()
58a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK: declare void @_ZN5test21A3barEv()
59a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
60a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  const std::type_info &ti = typeid(A);
61a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZTSN5test21AE = linkonce_odr constant
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-GLOBAL: @_ZTIN5test21AE = linkonce_odr constant
63a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZN5test22tiE = hidden constant
64a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall}
65a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
66a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace test3 {
67a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  struct A { int x; };
68a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  template <class T> struct B {
69a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void foo() { bar(); }
70a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void bar();
71a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  };
72a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
73a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  template void B<A>::foo();
7493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN5test31BINS_1AEE3fooEv()
75a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK: declare void @_ZN5test31BINS_1AEE3barEv()
76a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
77a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  const std::type_info &ti = typeid(B<A>);
78a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZTSN5test31BINS_1AEEE = linkonce_odr constant
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-GLOBAL: @_ZTIN5test31BINS_1AEEE = linkonce_odr constant
80a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall}
81a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
82a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace test4 {
83a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  struct A { int x; };
84a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  template <class T> struct DEFAULT B {
85a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void foo() { bar(); }
86a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void bar();
87a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  };
88a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
89a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  template void B<A>::foo();
9093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN5test41BINS_1AEE3fooEv()
91a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK: declare void @_ZN5test41BINS_1AEE3barEv()
92a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
93a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  const std::type_info &ti = typeid(B<A>);
94a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZTSN5test41BINS_1AEEE = linkonce_odr constant
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-GLOBAL: @_ZTIN5test41BINS_1AEEE = linkonce_odr constant
96a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall}
97a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
98a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCallnamespace test5 {
99a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  struct A { int x; };
100a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  template <class T> struct HIDDEN B {
101a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void foo() { bar(); }
102a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    static void bar();
103a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  };
104a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
105a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  template void B<A>::foo();
10693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN5test51BINS_1AEE3fooEv()
107a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK: declare hidden void @_ZN5test51BINS_1AEE3barEv()
108a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall
109a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  const std::type_info &ti = typeid(B<A>);
110a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // CHECK-GLOBAL: @_ZTSN5test51BINS_1AEEE = linkonce_odr hidden constant
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-GLOBAL: @_ZTIN5test51BINS_1AEEE = linkonce_odr hidden constant
112a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall}
113