зеркало из https://github.com/microsoft/clang-1.git
Fix <rdar://problem/6333904> [sema] message lookup on super is incorrect
Missing special lookup rule in Sema::ActOnInstanceMessage(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59467 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
c689836d76
Коммит
87d3ef08d8
|
@ -278,7 +278,23 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel,
|
|||
|
||||
QualType ReceiverCType =
|
||||
Context.getCanonicalType(RExpr->getType()).getUnqualifiedType();
|
||||
|
||||
|
||||
// Handle messages to 'super'.
|
||||
if (isa<ObjCSuperExpr>(RExpr)) {
|
||||
ObjCMethodDecl *Method = 0;
|
||||
if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {
|
||||
// If we have an interface in scope, check 'super' methods.
|
||||
if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
|
||||
if (ObjCInterfaceDecl *SuperDecl = ClassDecl->getSuperClass())
|
||||
Method = SuperDecl->lookupInstanceMethod(Sel);
|
||||
}
|
||||
if (CheckMessageArgumentTypes(ArgExprs, NumArgs, Sel, Method, "-",
|
||||
lbrac, rbrac, returnType))
|
||||
return true;
|
||||
return new ObjCMessageExpr(RExpr, Sel, returnType, Method, lbrac, rbrac,
|
||||
ArgExprs, NumArgs);
|
||||
}
|
||||
|
||||
// Handle messages to id.
|
||||
if (ReceiverCType == Context.getCanonicalType(Context.getObjCIdType()) ||
|
||||
ReceiverCType->getAsBlockPointerType()) {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
@interface NSObject
|
||||
- (void)release;
|
||||
- dealloc;
|
||||
@end
|
||||
|
||||
@interface MyClass : NSObject {
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
// RUN: clang -fsyntax-only -verify %s
|
||||
|
||||
@interface Foo
|
||||
- iMethod;
|
||||
+ cMethod;
|
||||
@end
|
||||
|
||||
@interface A
|
||||
@end
|
||||
|
||||
@interface B : A
|
||||
- (void)instanceMethod;
|
||||
+ classMethod;
|
||||
@end
|
||||
|
||||
@implementation B
|
||||
|
||||
- (void)instanceMethod {
|
||||
[super iMethod]; // expected-warning{{method '-iMethod' not found (return type defaults to 'id')}}
|
||||
}
|
||||
|
||||
+ classMethod {
|
||||
[super cMethod]; // expected-warning{{method '+cMethod' not found (return type defaults to 'id')}}
|
||||
}
|
||||
@end
|
Загрузка…
Ссылка в новой задаче