1// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
2
3// CHECK: v17@0:8{vector<float, float, float>=}16
4// CHECK: {vector<float, float, float>=}
5// CHECK: v24@0:816
6
7template <typename T1, typename T2, typename T3> struct vector {
8  vector();
9  vector(T1,T2,T3);
10};
11
12typedef vector< float, float, float > vector3f;
13
14@interface SceneNode
15{
16 vector3f position;
17}
18
19@property (assign, nonatomic) vector3f position;
20
21@end
22
23@interface MyOpenGLView
24{
25@public
26  vector3f position;
27}
28@property vector3f position;
29@end
30
31@implementation MyOpenGLView
32
33@synthesize position;
34
35-(void)awakeFromNib {
36 SceneNode *sn;
37 vector3f VF3(1.0, 1.0, 1.0);
38 [sn setPosition:VF3];
39}
40@end
41
42
43class Int3 { int x, y, z; };
44
45// Enforce @encoding for member pointers.
46@interface MemPtr {}
47- (void) foo: (int (Int3::*)) member;
48@end
49@implementation MemPtr
50- (void) foo: (int (Int3::*)) member {
51}
52@end
53
54// rdar: // 8519948
55typedef float HGVec4f __attribute__ ((vector_size(16)));
56
57@interface RedBalloonHGXFormWrapper {
58  HGVec4f m_Transform[4];
59}
60@end
61
62@implementation RedBalloonHGXFormWrapper
63@end
64
65// rdar://9357400
66namespace rdar9357400 {
67  template<int Dim1 = -1, int Dim2 = -1> struct fixed {
68      template<int D> struct rebind { typedef fixed<D> other; };
69  };
70
71  template<typename Element, int Size>
72  class fixed_1D
73  {
74  public:
75      typedef Element value_type;
76      typedef value_type array_impl[Size];
77    protected:
78      array_impl                  m_data;
79  };
80
81  template<typename Element, typename Alloc>
82  class vector;
83
84  template<typename Element, int Size>
85  class vector< Element, fixed<Size> >
86  : public fixed_1D<Element,Size> { };
87
88  typedef vector< float,  fixed<4> > vector4f;
89
90  // CHECK: @_ZN11rdar93574002ggE = constant [49 x i8] c"{vector<float, rdar9357400::fixed<4, -1> >=[4f]}\00"
91  extern const char gg[] = @encode(vector4f);
92}
93
94// rdar://9624314
95namespace rdar9624314 {
96  struct B2 { int x; };
97  struct B3 {};
98  struct S : B2, B3 {};
99
100  // CHECK: @_ZN11rdar96243142ggE = constant [6 x i8] c"{S=i}\00"
101  extern const char gg[] = @encode(S);
102
103  struct S2 { unsigned : 0; int x; unsigned : 0; };
104  // CHECK: @_ZN11rdar96243142g2E = constant [11 x i8] c"{S2=b0ib0}\00"
105  extern const char g2[] = @encode(S2);
106}
107
108namespace test {
109  class Foo {
110  public:
111   virtual void f() {};
112  };
113
114  class Bar {
115  public:
116   virtual void g() {};
117  };
118
119  class Zoo : virtual public Foo, virtual public Bar {
120  public:
121   int x;
122   int y;
123  };
124
125  // CHECK: @_ZN4test3ecdE = constant [15 x i8] c"{Zoo=^^?ii^^?}\00"
126  extern const char ecd[] = @encode(Zoo);
127}
128
129struct Base1 {
130  char x;
131};
132
133struct DBase : public Base1 {
134  double x;
135  virtual ~DBase();
136};
137
138struct Sub_with_virt : virtual DBase {
139  long x;
140};
141
142struct Sub2 : public Sub_with_virt, public Base1, virtual DBase {
143  float x;
144};
145
146// CHECK: @g1 = constant [10 x i8] c"{Base1=c}\00"
147extern const char g1[] = @encode(Base1);
148
149// CHECK: @g2 = constant [14 x i8] c"{DBase=^^?cd}\00"
150extern const char g2[] = @encode(DBase);
151
152// CHECK: @g3 = constant [26 x i8] c"{Sub_with_virt=^^?q^^?cd}\00"
153extern const char g3[] = @encode(Sub_with_virt);
154
155// CHECK: @g4 = constant [19 x i8] c"{Sub2=^^?qcf^^?cd}\00"
156extern const char g4[] = @encode(Sub2);
157
158// http://llvm.org/PR9927
159class allocator {
160};
161class basic_string     {
162struct _Alloc_hider : allocator       {
163char* _M_p;
164};
165_Alloc_hider _M_dataplus;
166};
167
168// CHECK: @g5 = constant [32 x i8] c"{basic_string={_Alloc_hider=*}}\00"
169extern const char g5[] = @encode(basic_string);
170
171
172// PR10990
173class CefBase {
174  virtual ~CefBase() {}
175};
176class CefBrowser : public virtual CefBase {};
177class CefBrowserImpl : public CefBrowser {};
178// CHECK: @g6 = constant [21 x i8] c"{CefBrowserImpl=^^?}\00"
179extern const char g6[] = @encode(CefBrowserImpl);
180
181// PR10990_2
182class CefBase2 {
183  virtual ~CefBase2() {}
184  int i;
185};
186class CefBrowser2 : public virtual CefBase2 {};
187class CefBrowserImpl2 : public CefBrowser2 {};
188// CHECK: @g7 = constant [26 x i8] c"{CefBrowserImpl2=^^?^^?i}\00"
189extern const char g7[] = @encode(CefBrowserImpl2);
190
191// <rdar://problem/11324167>
192struct Empty {};
193
194struct X : Empty {
195  int array[10];
196};
197
198struct Y : Empty {
199  X vec;
200};
201
202// CHECK: @g8 = constant [14 x i8] c"{Y={X=[10i]}}\00"
203extern const char g8[] = @encode(Y);
204
205
206class dynamic_class {
207public:
208  virtual ~dynamic_class();
209};
210@interface has_dynamic_class_ivar
211@end
212@implementation has_dynamic_class_ivar {
213  dynamic_class dynamic_class_ivar;
214}
215@end
216// CHECK: internal global [41 x i8] c"{dynamic_class=\22_vptr$dynamic_class\22^^?}\00"
217
218namespace PR17142 {
219  struct A { virtual ~A(); };
220  struct B : virtual A { int y; };
221  struct C { virtual ~C(); int z; };
222  struct D : C, B { int a; };
223  struct E : D {};
224  // CHECK: @_ZN7PR171421xE = constant [14 x i8] c"{E=^^?i^^?ii}\00"
225  extern const char x[] = @encode(E);
226}
227