1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o - %s | FileCheck %s
2// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o - %s | FileCheck %s
3
4/*
5
6Here is a handy command for looking at llvm-gcc's output:
7llvm-gcc -m64 -fobjc-gc -emit-llvm -S -o - ivar-layout-64.m | \
8  grep 'OBJC_CLASS_NAME.* =.*global' | \
9  sed -e 's#, section.*# ...#' | \
10  sed -e 's#_[0-9]*"#_NNN#' | \
11  sort
12
13*/
14
15@interface B @end
16
17@interface A {
18  struct s0 {
19    int f0;
20    int f1;
21  } f0;
22  id f1;
23__weak B *f2;
24  int f3 : 5;
25  struct s1 {
26    int *f0;
27    int *f1;
28  } f4[2][1];
29}
30@end
31
32@interface C : A
33@property int p3;
34@end
35
36// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"C\00"
37// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11p\00"
38// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!`\00"
39
40
41@implementation C
42@synthesize p3 = _p3;
43@end
44
45@interface A()
46@property int p0;
47@property (assign) __strong id p1;
48@property (assign) __weak id p2;
49@end
50
51// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"A\00"
52// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11q\10\00"
53// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!q\00"
54
55@implementation A
56@synthesize p0 = _p0;
57@synthesize p1 = _p1;
58@synthesize p2 = _p2;
59@end
60
61@interface D : A
62@property int p3;
63@end
64
65// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"D\00"
66// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11p\00"
67// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!`\00"
68
69@implementation D
70@synthesize p3 = _p3;
71@end
72
73typedef unsigned short UInt16;
74
75
76typedef signed char BOOL;
77typedef unsigned int FSCatalogInfoBitmap;
78
79@interface NSFileLocationComponent {
80    @private
81
82    id _specifierOrStandardizedPath;
83    BOOL _carbonCatalogInfoAndNameAreValid;
84    FSCatalogInfoBitmap _carbonCatalogInfoMask;
85    id _name;
86    id _containerComponent;
87    id _presentableName;
88    id _iconAsAttributedString;
89}
90@end
91
92// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"NSFileLocationComponent\00"
93// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01\14\00"
94
95@implementation NSFileLocationComponent @end
96
97@interface NSObject {
98  id isa;
99}
100@end
101
102@interface Foo : NSObject {
103    id ivar;
104
105    unsigned long bitfield  :31;
106    unsigned long bitfield2 :1;
107    unsigned long bitfield3 :32;
108}
109@end
110
111// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"Foo\00"
112// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\10\00"
113
114@implementation Foo @end
115
116// GC layout strings aren't capable of expressing __strong ivars at
117// non-word alignments.
118struct __attribute__((packed)) PackedStruct {
119  char c;
120  __strong id x;
121};
122@interface Packed : NSObject {
123  struct PackedStruct _packed;
124}
125@end
126@implementation Packed @end
127// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"Packed\00"
128// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01 \00"
129//  ' ' == 0x20
130
131// Ensure that layout descends into anonymous unions and structs.
132// Hilariously, anonymous unions and structs that appear directly as ivars
133// are completely ignored by layout.
134
135@interface AnonymousUnion : NSObject {
136  struct {
137    union {
138      id _object;
139      void *_ptr;
140    };
141  } a;
142}
143@end
144@implementation AnonymousUnion @end
145// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"AnonymousUnion\00"
146// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\00"
147
148@interface AnonymousStruct : NSObject {
149  struct {
150    struct {
151      id _object;
152      __weak id _weakref;
153    };
154  } a;
155}
156@end
157@implementation AnonymousStruct @end
158// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"AnonymousStruct\00"
159// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\10\00"
160// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!\00"
161//  '!' == 0x21
162