From: Fariborz Jahanian Date: Wed, 1 Dec 2010 01:07:24 +0000 (+0000) Subject: When unknown method is sent to a receiver of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2600503170c8366af2587408c50e2beedee5d1f1;p=clang When unknown method is sent to a receiver of 'Class' type, disgnostic should refere to a class method. Fixes // rdar://8592156 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120517 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 04b88e2bde..047236b1bd 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -1075,7 +1075,9 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, Expr **Args = reinterpret_cast(ArgsIn.release()); QualType ReturnType; ExprValueKind VK = VK_RValue; - if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, false, + bool ClassMessage = (ReceiverType->isObjCClassType() || + ReceiverType->isObjCQualifiedClassType()); + if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, ClassMessage, LBracLoc, RBracLoc, ReturnType, VK)) return ExprError(); diff --git a/test/SemaObjC/call-super-2.m b/test/SemaObjC/call-super-2.m index 043314d4e1..84a625c404 100644 --- a/test/SemaObjC/call-super-2.m +++ b/test/SemaObjC/call-super-2.m @@ -35,7 +35,7 @@ id objc_getClass(const char *s); @implementation Derived + (int) class_func1 { - int i = (size_t)[self class_func0]; // expected-warning {{method '-class_func0' not found (return type defaults to 'id')}} + int i = (size_t)[self class_func0]; // expected-warning {{method '+class_func0' not found (return type defaults to 'id')}} return i + (size_t)[super class_func0]; // expected-warning {{method '+class_func0' not found (return type defaults to 'id')}} } + (int) class_func2 diff --git a/test/SemaObjC/class-method-lookup.m b/test/SemaObjC/class-method-lookup.m index f26d692328..8c8c21682f 100644 --- a/test/SemaObjC/class-method-lookup.m +++ b/test/SemaObjC/class-method-lookup.m @@ -20,7 +20,7 @@ [self rootInstanceMethod]; /* class is searched for an instance method */ [MyIntermediate rootInstanceMethod]; /* with the same name. */ - [self instanceMethod];// expected-warning {{'-instanceMethod' not found (return type defaults to 'id')}} + [self instanceMethod];// expected-warning {{'+instanceMethod' not found (return type defaults to 'id')}} [MyDerived instanceMethod];// expected-warning {{'+instanceMethod' not found (return type defaults to 'id')}} } @end diff --git a/test/SemaObjC/method-lookup-5.m b/test/SemaObjC/method-lookup-5.m new file mode 100644 index 0000000000..13df218144 --- /dev/null +++ b/test/SemaObjC/method-lookup-5.m @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// rdar://8592156 + +typedef struct objc_class *Class; +@interface A +-(Class) foo; +@end + +void f0(A *a) { int x = [[a foo] baz]; } // expected-warning {{method '+baz' not found (return type defaults to 'id')}} \ + // expected-warning {{ncompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}} diff --git a/test/SemaObjC/method-lookup.m b/test/SemaObjC/method-lookup.m index e3789584bf..3091124e66 100644 --- a/test/SemaObjC/method-lookup.m +++ b/test/SemaObjC/method-lookup.m @@ -22,7 +22,7 @@ typedef int NSInteger; static NSMutableArray * recentCompletions = ((void *)0); + (float) factorForRecentCompletion:(NSString *) completion { - for (NSObject * item in [self completionItems]) // expected-warning{{method '-completionItems' not found (return type defaults to 'id')}} + for (NSObject * item in [self completionItems]) // expected-warning{{method '+completionItems' not found (return type defaults to 'id')}} { if ([item respondsToSelector:@selector(setPriority:)]) {