blob: 2cc4dc72a0cbdcdc1779ec4ef221f1e60ce3ffbf [file] [log] [blame]
Joel E. Denny72c27832018-07-11 20:26:20 +00001// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -fobjc-runtime=ios -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s
2// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=macosx -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s
3// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=objfw -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-FW %s
Saleem Abdulrasool7093e212016-07-17 22:27:44 +00004
5// CHECK-IR-DAG: @_objc_empty_cache = external dllimport global %struct._objc_cache
6
7__declspec(dllimport)
8@interface I
9+ (instancetype) new;
10@end
11
12// CHECK-IR-DAG: @"OBJC_METACLASS_$_I" = external dllimport global %struct._class_t
13// CHECK-IR-DAG: @"OBJC_CLASS_$_I" = external dllimport global %struct._class_t
14
15__declspec(dllexport)
16@interface J : I
17@end
18
Rafael Espindolab7350042018-03-01 00:35:47 +000019// CHECK-IR-DAG: @"OBJC_METACLASS_$_J" = dso_local dllexport global %struct._class_t
20// CHECK-IR-DAG: @"OBJC_CLASS_$_J" = dso_local dllexport global %struct._class_t
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000021
Rafael Espindolab7350042018-03-01 00:35:47 +000022// CHECK-FW-DAG: @_OBJC_METACLASS_J = dso_local dllexport global
23// CHECK-FW-DAG: @_OBJC_CLASS_J = dso_local dllexport global
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000024
25@implementation J {
26 id _ivar;
27}
28@end
29
30// CHECK-IR-DAG: @"OBJC_IVAR_$_J._ivar" = global i32
31
32@interface K : J
33@end
34
Rafael Espindolab7350042018-03-01 00:35:47 +000035// CHECK-IR-DAG: @"OBJC_METACLASS_$_K" = dso_local global %struct._class_t
36// CHECK-IR-DAG: @"OBJC_CLASS_$_K" = dso_local global %struct._class_t
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000037
Rafael Espindolab7350042018-03-01 00:35:47 +000038// CHECK-FW-DAG: @_OBJC_METACLASS_K = dso_local global
39// CHECK-FW-DAG: @_OBJC_CLASS_K = dso_local global
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000040
41@implementation K {
42 id _ivar;
43}
44@end
45
46// CHECK-IR-DAG: @"OBJC_IVAR_$_K._ivar" = global i32
47
48__declspec(dllexport)
49@interface L : K
50@end
51
Rafael Espindolab7350042018-03-01 00:35:47 +000052// CHECK-IR-DAG: @"OBJC_METACLASS_$_L" = dso_local dllexport global %struct._class_t
53// CHECK-IR-DAG: @"OBJC_CLASS_$_L" = dso_local dllexport global %struct._class_t
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000054
Rafael Espindolab7350042018-03-01 00:35:47 +000055// CHECK-FW-DAG: @_OBJC_METACLASS_L = dso_local dllexport global
56// CHECK-FW-DAG: @_OBJC_CLASS_L = dso_local dllexport global
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000057
58@implementation L {
59 id _none;
60
61 @public
62 id _public;
63
64 @protected
65 id _protected;
66
67 @package
68 id _package;
69
70 @private
71 id _private;
72}
73@end
74
75// CHECK-IR-DAG: @"OBJC_IVAR_$_L._none" = global i32
76// CHECK-IR-DAG: @"OBJC_IVAR_$_L._public" = dllexport global i32
77// CHECK-IR-DAG: @"OBJC_IVAR_$_L._protected" = dllexport global i32
78// CHECK-IR-DAG: @"OBJC_IVAR_$_L._package" = global i32
79// CHECK-IR-DAG: @"OBJC_IVAR_$_L._private" = global i32
80
81__declspec(dllimport)
82@interface M : I {
83 @public
84 id _ivar;
85}
86@end
87
88// CHEKC-FW-DAG: @_OBJC_CLASS_M = external dllimport global i32
89
90// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
91
92__declspec(dllexport)
93__attribute__((__objc_exception__))
94@interface N : I
95@end
96
Rafael Espindolab7350042018-03-01 00:35:47 +000097// CHECK-FW-DAG: @_OBJC_METACLASS_N = dso_local dllexport global
98// CHECK-FW-DAG: @_OBJC_CLASS_N = dso_local dllexport global
Saleem Abdulrasool7093e212016-07-17 22:27:44 +000099
100@implementation N : I
101@end
102
Rafael Espindolab7350042018-03-01 00:35:47 +0000103// CHECK-IR-DAG: @"OBJC_EHTYPE_$_N" = dso_local dllexport global %struct._objc_typeinfo
Saleem Abdulrasool7093e212016-07-17 22:27:44 +0000104
105__declspec(dllimport)
106__attribute__((__objc_exception__))
107@interface O : I
108@end
109
110// CHECK-IR-DAG: @"OBJC_EHTYPE_$_O" = external dllimport global %struct._objc_typeinfo
111
112__attribute__((__objc_exception__))
113@interface P : I
114@end
115
Rafael Espindolab7350042018-03-01 00:35:47 +0000116// CHECK-IR-DAG: @"OBJC_EHTYPE_$_P" = external dso_local global %struct._objc_typeinfo
Saleem Abdulrasool7093e212016-07-17 22:27:44 +0000117
Saleem Abdulrasoolad75c7d2017-10-25 03:58:15 +0000118@interface Q : M
119@end
120
121id f(Q *q) {
122 return q->_ivar;
123}
124
125// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32
126
Saleem Abdulrasool7093e212016-07-17 22:27:44 +0000127int g() {
128 @autoreleasepool {
129 M *mi = [M new];
130 @try {
131 mi->_ivar = (void *)0;
132 @throw(@"CFConstantString");
133 } @catch (id) {
134 return 1;
135 } @catch (I *) {
136 return 2;
137 } @catch (J *) {
138 return 3;
139 } @catch (K *) {
140 return 4;
141 } @catch (L *) {
142 return 5;
143 } @catch (M *) {
144 return 6;
145 } @catch (N *) {
146 return 7;
147 } @catch (O *) {
148 return 8;
149 } @catch (P *) {
150 return 9;
151 }
152 }
153 return 0;
154}
155
156// CHECK-IR-DAG: @OBJC_EHTYPE_id = external dllimport global %struct._objc_typeinfo
157// CHECK-IR-DAG: @"OBJC_EHTYPE_$_I" = weak global %struct._objc_typeinfo
158// CHECK-IR-DAG: @"OBJC_EHTYPE_$_K" = weak global %struct._objc_typeinfo
159// CHECK-IR-DAG: @"OBJC_EHTYPE_$_L" = weak global %struct._objc_typeinfo
160// CHECK-IR-DAG: @"OBJC_EHTYPE_$_M" = weak global %struct._objc_typeinfo
161