clang/test/SemaObjC/comptypes-5.m

45 строки
1020 B
Mathematica
Исходник Обычный вид История

// RUN: clang-cc -fsyntax-only -pedantic -verify %s
#define nil (void *)0;
extern void foo();
@protocol MyProtocol
- (void) method;
@end
@interface MyClass
@end
@interface MyClass (Addition) <MyProtocol>
- (void) method;
@end
@interface MyOtherClass : MyClass
@end
int main()
{
id <MyProtocol> obj_id_p = nil;
MyClass *obj_c_cat_p = nil;
MyOtherClass *obj_c_super_p = nil;
MyOtherClass<MyProtocol> *obj_c_super_p_q = nil;
MyClass<MyProtocol> *obj_c_cat_p_q = nil;
This patch includes a conceptually simple, but very intrusive/pervasive change. The idea is to segregate Objective-C "object" pointers from general C pointers (utilizing the recently added ObjCObjectPointerType). The fun starts in Sema::GetTypeForDeclarator(), where "SomeInterface *" is now represented by a single AST node (rather than a PointerType whose Pointee is an ObjCInterfaceType). Since a significant amount of code assumed ObjC object pointers where based on C pointers/structs, this patch is very tedious. It should also explain why it is hard to accomplish this in smaller, self-contained patches. This patch does most of the "heavy lifting" related to moving from PointerType->ObjCObjectPointerType. It doesn't include all potential "cleanups". The good news is additional cleanups can be done later (some are noted in the code). This patch is so large that I didn't want to include any changes that are purely aesthetic. By making the ObjC types truly built-in, they are much easier to work with (and require fewer "hacks"). For example, there is no need for ASTContext::isObjCIdStructType() or ASTContext::isObjCClassStructType()! We believe this change (and the follow-up cleanups) will pay dividends over time. Given the amount of code change, I do expect some fallout from this change (though it does pass all of the clang tests). If you notice any problems, please let us know asap! Thanks. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75314 91177308-0d34-0410-b5e6-96231b3b80d8
2009-07-11 03:34:53 +04:00
obj_c_cat_p = obj_id_p;
obj_c_super_p = obj_id_p;
obj_id_p = obj_c_cat_p; /* Ok */
obj_id_p = obj_c_super_p; /* Ok */
if (obj_c_cat_p == obj_id_p) foo(); /* Ok */
if (obj_c_super_p == obj_id_p) foo() ; /* Ok */
if (obj_id_p == obj_c_cat_p) foo(); /* Ok */
if (obj_id_p == obj_c_super_p) foo(); /* Ok */
obj_c_cat_p = obj_c_super_p; // ok.
obj_c_cat_p = obj_c_super_p_q; // ok.
obj_c_super_p = obj_c_cat_p_q; // expected-warning {{incompatible pointer types}}
obj_c_cat_p_q = obj_c_super_p;
return 0;
}