1// 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
4
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
19// 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
21
22// CHECK-FW-DAG: @_OBJC_METACLASS_J = dso_local dllexport global
23// CHECK-FW-DAG: @_OBJC_CLASS_J = dso_local dllexport global
24
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
35// 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
37
38// CHECK-FW-DAG: @_OBJC_METACLASS_K = dso_local global
39// CHECK-FW-DAG: @_OBJC_CLASS_K = dso_local global
40
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
52// 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
54
55// CHECK-FW-DAG: @_OBJC_METACLASS_L = dso_local dllexport global
56// CHECK-FW-DAG: @_OBJC_CLASS_L = dso_local dllexport global
57
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// CHECK-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
97// CHECK-FW-DAG: @_OBJC_METACLASS_N = dso_local dllexport global
98// CHECK-FW-DAG: @_OBJC_CLASS_N = dso_local dllexport global
99
100@implementation N : I
101@end
102
103// CHECK-IR-DAG: @"OBJC_EHTYPE_$_N" = dso_local dllexport global %struct._objc_typeinfo
104
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
116// CHECK-IR-DAG: @"OBJC_EHTYPE_$_P" = external dso_local global %struct._objc_typeinfo
117
118@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
127int 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
162