1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | @protocol Foo; |
4 | |
5 | Class T; |
6 | id<Foo> S; |
7 | id R; |
8 | void foo() { |
9 | // Test assignment compatibility of Class and id. No warning should be |
10 | // produced. |
11 | // rdar://6770142 - Class and id<foo> are compatible. |
12 | S = T; // expected-warning {{incompatible pointer types assigning to 'id<Foo>' from 'Class'}} |
13 | T = S; // expected-warning {{incompatible pointer types assigning to 'Class' from 'id<Foo>'}} |
14 | R = T; T = R; |
15 | R = S; S = R; |
16 | } |
17 | |
18 | // Test attempt to redefine 'id' in an incompatible fashion. |
19 | // rdar://11356439 |
20 | typedef int id; // expected-error {{typedef redefinition with different types ('int' vs 'id')}} |
21 | id b; |
22 | |
23 | typedef double id; // expected-error {{typedef redefinition with different types ('double' vs 'id')}} |
24 | |
25 | typedef char *id; // expected-error {{typedef redefinition with different types ('char *' vs 'id')}} |
26 | |
27 | typedef union U{ int iu; } *id; // expected-error {{typedef redefinition with different types ('union U *' vs 'id')}} |
28 | |
29 | void test11356439(id o) { |
30 | o->x; // expected-error {{member reference base type 'id' is not a structure or union}} |
31 | } |
32 | |