From ebaa768521cfd5318d77f1efaf7ae47020863a9d Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Tue, 7 Apr 2009 15:07:57 +0000 Subject: [PATCH] Tweak Sema::ActOnInstanceMessage() to look for a class method when dealing with qualified id's. This change is motivated by our desire to not support the "Class" idiom. Note that the change makes perfect sense (since all ObjC classes are also id/instances). This allow us to document a simple migration path...change "Class " to "id ". This effects: - TASK: File source change radars for "qualified Class" errors - Protocol qualified Class is unsupported git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68517 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprObjC.cpp | 3 ++ test/SemaObjC/call-super-2.m | 4 +- .../protocol-qualified-class-unsupported.m | 40 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 test/SemaObjC/protocol-qualified-class-unsupported.m diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index cfa279aa31..54ed709d0f 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -548,6 +548,9 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, ObjCProtocolDecl *PDecl = QIT->getProtocols(i); if (PDecl && (Method = PDecl->lookupInstanceMethod(Sel))) break; + // Since we aren't supporting "Class", look for a class method. + if (PDecl && (Method = PDecl->lookupClassMethod(Sel))) + break; } } else if (const ObjCInterfaceType *OCIType = ReceiverCType->getAsPointerToObjCInterfaceType()) { diff --git a/test/SemaObjC/call-super-2.m b/test/SemaObjC/call-super-2.m index cc66cf3f21..f171007be0 100644 --- a/test/SemaObjC/call-super-2.m +++ b/test/SemaObjC/call-super-2.m @@ -41,8 +41,8 @@ id objc_getClass(const char *s); } + (int) class_func2 { - int i = [(id )self class_func0]; // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} // expected-warning {{incompatible pointer to integer conversion initializing 'id', expected 'int'}} - i += [(id )super class_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} // expected-warning {{incompatible pointer to integer conversion assigning 'id', expected 'int'}} + int i = [(id )self class_func0]; + i += [(id )super class_func0]; // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} i += [(Class )self class_func0]; // expected-error {{protocol qualified 'Class' is unsupported}} return i + [(Class )super class_func0]; // expected-error {{protocol qualified 'Class' is unsupported}} // expected-warning {{casting 'super' is deprecated (it isn't an expression)}} } diff --git a/test/SemaObjC/protocol-qualified-class-unsupported.m b/test/SemaObjC/protocol-qualified-class-unsupported.m new file mode 100644 index 0000000000..ad1ed5dc94 --- /dev/null +++ b/test/SemaObjC/protocol-qualified-class-unsupported.m @@ -0,0 +1,40 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +#include + +typedef struct objc_class *Class; +typedef struct objc_object { + Class isa; +} *id; +id objc_getClass(const char *s); + +@interface Object ++ self; +@end + +@protocol Func ++ (void) class_func0; +- (void) instance_func0; +@end + +@interface Derived: Object +@end + +@interface Derived2: Object +@end + +static void doSomething(Class unsupportedObjectType) { // expected-error {{protocol qualified 'Class' is unsupported}} + [unsupportedObjectType class_func0]; +} + +static void doSomethingElse(id pleaseConvertToThisType) { + [pleaseConvertToThisType class_func0]; +} + +int main(int argv, char *argc[]) { + doSomething([Derived self]); + doSomething([Derived2 self]); + doSomethingElse([Derived self]); + doSomethingElse([Derived2 self]); +} + -- 2.40.0