1// 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 152