| 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 | |