1806f9a3d08c08acd79fe92a335ae24cbc271e626Anders Carlsson// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o %t
2806f9a3d08c08acd79fe92a335ae24cbc271e626Anders Carlsson// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fhidden-weak-vtables -emit-llvm -o %t.hidden
33361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST1 %s < %t
43361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST2 %s < %t
53361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST2-HIDDEN %s < %t.hidden
63361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson
73361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson#include <typeinfo>
83361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson
93361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlssonnamespace Test1 {
103361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // A is explicitly marked hidden, so all RTTI data should also be marked hidden.
113361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST1: @_ZTSN5Test11AE = linkonce_odr hidden constant
123361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST1: @_ZTIN5Test11AE = linkonce_odr hidden unnamed_addr constant
13907c828b080332854826a87451e838930f4be788Anders Carlsson  // CHECK-TEST1: @_ZTSPN5Test11AE = linkonce_odr hidden constant
143361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST1: @_ZTIPN5Test11AE = linkonce_odr hidden unnamed_addr constant
153361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  struct __attribute__((visibility("hidden"))) A { };
163361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson
173361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  void f() {
183361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson    (void)typeid(A);
193361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson    (void)typeid(A *);
203361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  }
213361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson}
223361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson
233361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlssonnamespace Test2 {
243361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // A is weak, so its linkage should be linkoce_odr, but not marked hidden.
253361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST2: @_ZTSN5Test21AE = linkonce_odr constant
263361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST2: @_ZTIN5Test21AE = linkonce_odr unnamed_addr constant
273361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  struct A { };
283361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson
293361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // With -fhidden-weak-vtables, the typeinfo for A is marked hidden, but not its name.
303361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST2-HIDDEN: _ZTSN5Test21AE = linkonce_odr constant
313361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  // CHECK-TEST2-HIDDEN: @_ZTIN5Test21AE = linkonce_odr hidden unnamed_addr constant
323361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  void f() {
333361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson    (void)typeid(A);
343361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson  }
353361cff6021195dc29aa9082ff8a0e5628de5f31Anders Carlsson}
36