blob: 4bdbd509151b68e0e7b371f7388d0c27f38843ae [file] [log] [blame]
Saleem Abdulrasool7093e212016-07-17 22:27:44 +00001// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=macosx -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -check-prefix CHECK-IR %s
2// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=objfw -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -check-prefix CHECK-FW %s
3
4// CHECK-IR-DAG: @_objc_empty_cache = external dllimport global %struct._objc_cache
5
6__declspec(dllimport)
7@interface I
8+ (instancetype) new;
9@end
10
11// CHECK-IR-DAG: @"OBJC_METACLASS_$_I" = external dllimport global %struct._class_t
12// CHECK-IR-DAG: @"OBJC_CLASS_$_I" = external dllimport global %struct._class_t
13
14__declspec(dllexport)
15@interface J : I
16@end
17
18// CHECK-IR-DAG: @"OBJC_METACLASS_$_J" = dllexport global %struct._class_t
19// CHECK-IR-DAG: @"OBJC_CLASS_$_J" = dllexport global %struct._class_t
20
21// CHECK-FW-DAG: @_OBJC_METACLASS_J = dllexport global
22// CHECK-FW-DAG: @_OBJC_CLASS_J = dllexport global
23
24@implementation J {
25 id _ivar;
26}
27@end
28
29// CHECK-IR-DAG: @"OBJC_IVAR_$_J._ivar" = global i32
30
31@interface K : J
32@end
33
34// CHECK-IR-DAG: @"OBJC_METACLASS_$_K" = global %struct._class_t
35// CHECK-IR-DAG: @"OBJC_CLASS_$_K" = global %struct._class_t
36
37// CHECK-FW-DAG: @_OBJC_METACLASS_K = global
38// CHECK-FW-DAG: @_OBJC_CLASS_K = global
39
40@implementation K {
41 id _ivar;
42}
43@end
44
45// CHECK-IR-DAG: @"OBJC_IVAR_$_K._ivar" = global i32
46
47__declspec(dllexport)
48@interface L : K
49@end
50
51// CHECK-IR-DAG: @"OBJC_METACLASS_$_L" = dllexport global %struct._class_t
52// CHECK-IR-DAG: @"OBJC_CLASS_$_L" = dllexport global %struct._class_t
53
54// CHECK-FW-DAG: @_OBJC_METACLASS_L = dllexport global
55// CHECK-FW-DAG: @_OBJC_CLASS_L = dllexport global
56
57@implementation L {
58 id _none;
59
60 @public
61 id _public;
62
63 @protected
64 id _protected;
65
66 @package
67 id _package;
68
69 @private
70 id _private;
71}
72@end
73
74// CHECK-IR-DAG: @"OBJC_IVAR_$_L._none" = global i32
75// CHECK-IR-DAG: @"OBJC_IVAR_$_L._public" = dllexport global i32
76// CHECK-IR-DAG: @"OBJC_IVAR_$_L._protected" = dllexport global i32
77// CHECK-IR-DAG: @"OBJC_IVAR_$_L._package" = global i32
78// CHECK-IR-DAG: @"OBJC_IVAR_$_L._private" = global i32
79
80__declspec(dllimport)
81@interface M : I {
82 @public
83 id _ivar;
84}
85@end
86
87// CHEKC-FW-DAG: @_OBJC_CLASS_M = external dllimport global i32
88
89// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
90
91__declspec(dllexport)
92__attribute__((__objc_exception__))
93@interface N : I
94@end
95
96// CHECK-FW-DAG: @_OBJC_METACLASS_N = dllexport global
97// CHECK-FW-DAG: @_OBJC_CLASS_N = dllexport global
98
99@implementation N : I
100@end
101
102// CHECK-IR-DAG: @"OBJC_EHTYPE_$_N" = dllexport global %struct._objc_typeinfo
103
104__declspec(dllimport)
105__attribute__((__objc_exception__))
106@interface O : I
107@end
108
109// CHECK-IR-DAG: @"OBJC_EHTYPE_$_O" = external dllimport global %struct._objc_typeinfo
110
111__attribute__((__objc_exception__))
112@interface P : I
113@end
114
115// CHECK-IR-DAG: @"OBJC_EHTYPE_$_P" = external global %struct._objc_typeinfo
116
117int g() {
118 @autoreleasepool {
119 M *mi = [M new];
120 @try {
121 mi->_ivar = (void *)0;
122 @throw(@"CFConstantString");
123 } @catch (id) {
124 return 1;
125 } @catch (I *) {
126 return 2;
127 } @catch (J *) {
128 return 3;
129 } @catch (K *) {
130 return 4;
131 } @catch (L *) {
132 return 5;
133 } @catch (M *) {
134 return 6;
135 } @catch (N *) {
136 return 7;
137 } @catch (O *) {
138 return 8;
139 } @catch (P *) {
140 return 9;
141 }
142 }
143 return 0;
144}
145
146// CHECK-IR-DAG: @OBJC_EHTYPE_id = external dllimport global %struct._objc_typeinfo
147// CHECK-IR-DAG: @"OBJC_EHTYPE_$_I" = weak global %struct._objc_typeinfo
148// CHECK-IR-DAG: @"OBJC_EHTYPE_$_K" = weak global %struct._objc_typeinfo
149// CHECK-IR-DAG: @"OBJC_EHTYPE_$_L" = weak global %struct._objc_typeinfo
150// CHECK-IR-DAG: @"OBJC_EHTYPE_$_M" = weak global %struct._objc_typeinfo
151