[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / SemaObjC / parameterized_classes_arc.m
blob608a521f4724ab119ee6c9b0ad3172eb83cac9d6
1 // RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak %s -verify
3 // rdar://21612439
5 __attribute__((objc_root_class))
6 @interface NSObject
7 @end
8   
9 @class Forward;
10 @class Forward2;
12 // Tests for generic arguments.
14 @interface PC1<T> : NSObject
15 - (T) get;
16 - (void) set: (T) v; // expected-note 4 {{parameter}}
17 @end
19 void test1a(PC1<__weak id> *obj) { // expected-error {{type argument '__weak id' cannot be qualified with '__weak'}}
20   id x = [obj get];
21   [obj set: x];
24 void test1b(PC1<__strong id> *obj) { // expected-error {{type argument '__strong id' cannot be qualified with '__strong'}}
25   id x = [obj get];
26   [obj set: x];
29 void test1c(PC1<id> *obj) {
30   id x = [obj get];
31   [obj set: x];
34 // Test that this doesn't completely kill downstream type-checking.
35 void test1d(PC1<__weak Forward*> *obj) { // expected-error {{type argument 'Forward *__weak' cannot be qualified with '__weak'}}
36   Forward2 *x = [obj get]; // expected-warning {{incompatible}}
37   [obj set: x]; // expected-warning {{incompatible}}
40 void test1e(PC1<__strong Forward*> *obj) { // expected-error {{type argument 'Forward *__strong' cannot be qualified with '__strong'}}
41   Forward2 *x = [obj get]; // expected-warning {{incompatible}}
42   [obj set: x]; // expected-warning {{incompatible}}
45 void test1f(PC1<Forward*> *obj) {
46   Forward2 *x = [obj get]; // expected-warning {{incompatible}}
47   [obj set: x]; // expected-warning {{incompatible}}
50 // Typedefs are fine, just silently ignore them.
51 typedef __strong id StrongID;
52 void test1g(PC1<StrongID> *obj) {
53   Forward2 *x = [obj get];
54   [obj set: x];
57 typedef __strong Forward *StrongForward;
58 void test1h(PC1<StrongForward> *obj) {
59   Forward2 *x = [obj get]; // expected-warning {{incompatible}}
60   [obj set: x]; // expected-warning {{incompatible}}
63 // These aren't really ARC-specific, but they're the same basic idea.
64 void test1i(PC1<const id> *obj) { // expected-error {{type argument 'const id' cannot be qualified with 'const'}}
65   id x = [obj get];
66   [obj set: x];
69 void test1j(PC1<volatile id> *obj) { // expected-error {{type argument 'volatile id' cannot be qualified with 'volatile'}}
70   id x = [obj get];
71   [obj set: x];
74 void test1k(PC1<__attribute__((address_space(256))) id> *obj) { // expected-error {{type argument '__attribute__((address_space(256))) id' cannot be qualified with '__attribute__((address_space(256)))'}}
75   id x = [obj get];
76   [obj set: x];
79 // Tests for generic parameter bounds.
81 @interface PC2<T : __strong id> // expected-error {{type bound '__strong id' for type parameter 'T' cannot be qualified with '__strong'}}
82 @end
84 @interface PC3<T : __weak id> // expected-error {{type bound '__weak id' for type parameter 'T' cannot be qualified with '__weak'}}
85 @end
87 @interface PC4<T : __strong Forward*> // expected-error {{type bound 'Forward *__strong' for type parameter 'T' cannot be qualified with '__strong'}}
88 @end
90 @interface PC5<T : __weak Forward*> // expected-error {{type bound 'Forward *__weak' for type parameter 'T' cannot be qualified with '__weak'}}
91 @end
93 @interface PC6<T : StrongID> // expected-error {{type bound 'StrongID' (aka '__strong id') for type parameter 'T' cannot be qualified with '__strong'}}
94 @end
96 @interface PC7<T : StrongForward> // expected-error {{type bound 'StrongForward' (aka 'Forward *__strong') for type parameter 'T' cannot be qualified with '__strong'}}
97 @end
99 // These aren't really ARC-specific, but they're the same basic idea.
100 @interface PC8<T : const id> // expected-error {{type bound 'const id' for type parameter 'T' cannot be qualified with 'const'}}
101 @end
103 @interface PC9<T : volatile id> // expected-error {{type bound 'volatile id' for type parameter 'T' cannot be qualified with 'volatile'}}
104 @end
106 @interface PC10<T : __attribute__((address_space(256))) id> // expected-error {{type bound '__attribute__((address_space(256))) id' for type parameter 'T' cannot be qualified with '__attribute__((address_space(256)))'}}
107 @end