blob: f8c1167b53db03d1d255eb739de8c7e1a038f3bc [file] [log] [blame]
Douglas Gregor88d292c2010-05-13 16:44:06 +00001// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o - | sort | FileCheck %s
Daniel Dunbar64585cd2010-05-14 03:54:53 +00002
3// FIXME: Fails on Win32, dunno why.
4// XFAIL: win32
5
Anders Carlssond0081292009-12-20 22:30:54 +00006#include <typeinfo>
Anders Carlssona0b98f02009-12-11 16:37:06 +00007
Douglas Gregor88d292c2010-05-13 16:44:06 +00008
9
10// CHECK: _ZTIN12_GLOBAL__N_11DE to
11
12
13
Anders Carlssona0b98f02009-12-11 16:37:06 +000014// CHECK: _ZTI1A = weak_odr constant
15// CHECK: _ZTI1B = constant
Anders Carlsson2b7f44432009-12-21 00:41:42 +000016// CHECK: _ZTI1C = internal constant
Douglas Gregor876cec22010-06-02 06:16:02 +000017// CHECK: _ZTIA10_i = weak_odr constant
Anders Carlsson26cf4ab2009-12-29 20:20:19 +000018// CHECK: _ZTIFN12_GLOBAL__N_11DEvE = internal constant
Anders Carlsson26cf4ab2009-12-29 20:20:19 +000019// CHECK: _ZTIFvN12_GLOBAL__N_11DEE = internal constant
Anders Carlsson26cf4ab2009-12-29 20:20:19 +000020// CHECK: _ZTIFvvE = weak_odr
Douglas Gregor88d292c2010-05-13 16:44:06 +000021// CHECK: _ZTIM1A1C = internal constant
22// CHECK: _ZTIM1AP1C = internal constant
23// CHECK: _ZTIM1CPS_ = internal constant
24// CHECK: _ZTIM1CS_ = internal constant
25// CHECK: _ZTIM1Ci = internal constant
26// CHECK: _ZTIN12_GLOBAL__N_11DE = internal constant
Anders Carlssonef886952009-12-29 22:13:01 +000027// CHECK: _ZTIN12_GLOBAL__N_11EE = internal constant
Douglas Gregor88d292c2010-05-13 16:44:06 +000028// CHECK: _ZTIP1C = internal constant
29// CHECK: _ZTIPFvvE = weak_odr constant
30// CHECK: _ZTIPM1Ci = internal constant
31// CHECK: _ZTIPN12_GLOBAL__N_11DE = internal constant
32// CHECK: _ZTIPP1C = internal constant
33// CHECK: _ZTS1A = weak_odr constant
34// CHECK: _ZTS1B = constant
35// CHECK: _ZTS1C = internal constant
36// CHECK: _ZTS1F = weak_odr constant
Douglas Gregor876cec22010-06-02 06:16:02 +000037// CHECK: _ZTSA10_i = weak_odr constant
Douglas Gregor88d292c2010-05-13 16:44:06 +000038// CHECK: _ZTSFN12_GLOBAL__N_11DEvE = internal constant
39// CHECK: _ZTSFvN12_GLOBAL__N_11DEE = internal constant
40// CHECK: _ZTSFvvE = weak_odr constant
41// CHECK: _ZTSM1A1C = internal constant
42// CHECK: _ZTSM1AP1C = internal constant
43// CHECK: _ZTSM1CPS_ = internal constant
44// CHECK: _ZTSM1CS_ = internal constant
45// CHECK: _ZTSM1Ci = internal constant
46// CHECK: _ZTSN12_GLOBAL__N_11DE = internal constant
47// CHECK: _ZTSN12_GLOBAL__N_11EE = internal constant
48// CHECK: _ZTSP1C = internal constant
49// CHECK: _ZTSPFvvE = weak_odr constant
50// CHECK: _ZTSPM1Ci = internal constant
51// CHECK: _ZTSPN12_GLOBAL__N_11DE = internal constant
52// CHECK: _ZTSPP1C = internal constant
Anders Carlssonef886952009-12-29 22:13:01 +000053
Anders Carlssona0b98f02009-12-11 16:37:06 +000054// A has no key function, so its RTTI data should be weak_odr.
55struct A { };
56
57// B has a key function defined in the translation unit, so the RTTI data should
58// be emitted in this translation unit and have external linkage.
59struct B : A {
60 virtual void f();
61};
62void B::f() { }
Anders Carlssond0081292009-12-20 22:30:54 +000063
64// C is an incomplete class type, so any direct or indirect pointer types should have
Anders Carlssonac2f6812009-12-30 01:00:12 +000065// internal linkage, as should the type info for C itself.
Anders Carlssond0081292009-12-20 22:30:54 +000066struct C;
67
Anders Carlsson9a98ac92009-12-21 00:57:38 +000068void t1() {
Anders Carlssond0081292009-12-20 22:30:54 +000069 (void)typeid(C*);
70 (void)typeid(C**);
Anders Carlsson18e6ee12009-12-20 23:37:55 +000071 (void)typeid(int C::*);
72 (void)typeid(int C::**);
73 (void)typeid(C C::*);
74 (void)typeid(C *C::*);
75 (void)typeid(C A::*);
76 (void)typeid(C* A::*);
Anders Carlssond0081292009-12-20 22:30:54 +000077}
78
Anders Carlsson9a98ac92009-12-21 00:57:38 +000079namespace {
80 // D is inside an anonymous namespace, so all type information related to D should have
81 // internal linkage.
82 struct D { };
Anders Carlssonef886952009-12-29 22:13:01 +000083
84 // E is also inside an anonymous namespace.
85 enum E { };
86
Anders Carlsson9a98ac92009-12-21 00:57:38 +000087};
88
Anders Carlsson2d213942009-12-31 19:36:25 +000089// F has a key function defined in the translation unit, but it is inline so the RTTI
90// data should be emitted with weak_odr linkage.
91struct F {
92 virtual void f();
93};
94
95inline void F::f() { }
Douglas Gregorf45f6822009-12-23 20:51:04 +000096const D getD();
97
98const std::type_info &t2() {
99 (void)typeid(const D);
Anders Carlsson26cf4ab2009-12-29 20:20:19 +0000100 (void)typeid(D *);
101 (void)typeid(D (*)());
102 (void)typeid(void (*)(D));
Douglas Gregord7f18dd2010-03-31 00:15:35 +0000103 (void)typeid(void (*)(D&));
Anders Carlsson26cf4ab2009-12-29 20:20:19 +0000104 // The exception specification is not part of the RTTI descriptor, so it should not have
105 // internal linkage.
106 (void)typeid(void (*)() throw (D));
107
Anders Carlssonef886952009-12-29 22:13:01 +0000108 (void)typeid(E);
109
Douglas Gregorf45f6822009-12-23 20:51:04 +0000110 return typeid(getD());
Anders Carlsson9a98ac92009-12-21 00:57:38 +0000111}
Douglas Gregor876cec22010-06-02 06:16:02 +0000112
113namespace Arrays {
114 struct A {
115 static const int a[10];
116 };
117 const std::type_info &f() {
118 return typeid(A::a);
119 }
120}