| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| @protocol Foo; |
| |
| Class T; |
| id<Foo> S; |
| id R; |
| void foo() { |
| // Test assignment compatibility of Class and id. No warning should be |
| // produced. |
| // rdar://6770142 - Class and id<foo> are compatible. |
| S = T; // expected-warning {{incompatible pointer types assigning to 'id<Foo>' from 'Class'}} |
| T = S; // expected-warning {{incompatible pointer types assigning to 'Class' from 'id<Foo>'}} |
| R = T; T = R; |
| R = S; S = R; |
| } |
| |
| // Test attempt to redefine 'id' in an incompatible fashion. |
| // rdar://11356439 |
| typedef int id; // expected-error {{typedef redefinition with different types ('int' vs 'id')}} |
| id b; |
| |
| typedef double id; // expected-error {{typedef redefinition with different types ('double' vs 'id')}} |
| |
| typedef char *id; // expected-error {{typedef redefinition with different types ('char *' vs 'id')}} |
| |
| typedef union U{ int iu; } *id; // expected-error {{typedef redefinition with different types ('union U *' vs 'id')}} |
| |
| void test11356439(id o) { |
| o->x; // expected-error {{member reference base type 'id' is not a structure or union}} |
| } |