diff options
author | Steve Naroff <snaroff@apple.com> | 2009-02-22 19:35:57 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2009-02-22 19:35:57 +0000 |
commit | 0de21fd85d79bccd32f04256f5b3328ab5ed7c95 (patch) | |
tree | c57169d2b2650b72d82498056d70a1147541a22a /lib/Sema/SemaExprObjC.cpp | |
parent | 66b41512466db9a4b2859db517692fb79dae449e (diff) |
Contains the following (related to problems found while investigting <rdar://problem/6497631> Message lookup is sometimes different than gcc's).
- Implement instance/class overloading in ObjCContainerDecl (removing a FIXME). This involved hacking NamedDecl::declarationReplaces(), which took awhile to figure out (didn't realize replace was the default).
- Changed Sema::ActOnInstanceMessage() to remove redundant warnings when dealing with protocols. For now, I've omitted the "protocol" term in the diagnostic. It simplifies the code flow and wan't always 100% accurate (e.g. "Foo<Prot>" looks in the class interface, not just the protocol).
- Changed several test cases to jive with the above changes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65292 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index e5fefd3e3a..d8f3fd4cf7 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -397,9 +397,6 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, if (PDecl && (Method = PDecl->lookupInstanceMethod(Sel))) break; } - if (!Method) - Diag(lbrac, diag::warn_method_not_found_in_protocol) - << Sel << RExpr->getSourceRange(); // Check for GCC extension "Class<foo>". } else if (ObjCQualifiedClassType *QIT = dyn_cast<ObjCQualifiedClassType>(ReceiverCType)) { @@ -409,9 +406,6 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, if (PDecl && (Method = PDecl->lookupClassMethod(Sel))) break; } - if (!Method) - Diag(lbrac, diag::warn_method_not_found_in_protocol) - << Sel << RExpr->getSourceRange(); } else if (const ObjCInterfaceType *OCIReceiver = ReceiverCType->getAsPointerToObjCInterfaceType()) { // We allow sending a message to a pointer to an interface (an object). @@ -422,19 +416,29 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, // The idea is to add class info to InstanceMethodPool. Method = ClassDecl->lookupInstanceMethod(Sel); + bool haveQualifiers = false; if (!Method) { // Search protocol qualifiers. for (ObjCQualifiedIdType::qual_iterator QI = OCIReceiver->qual_begin(), E = OCIReceiver->qual_end(); QI != E; ++QI) { + haveQualifiers = true; if ((Method = (*QI)->lookupInstanceMethod(Sel))) break; } } - - if (!Method && !OCIReceiver->qual_empty()) - Diag(lbrac, diag::warn_method_not_found_in_protocol) - << Sel << SourceRange(lbrac, rbrac); - + if (!Method) { + // If we have an implementation in scope, check "private" methods. + if (ClassDecl) + if (ObjCImplementationDecl *ImpDecl = + ObjCImplementations[ClassDecl->getIdentifier()]) + Method = ImpDecl->getInstanceMethod(Sel); + // If we still haven't found a method, look in the global pool. This + // behavior isn't very desirable, however we need it for GCC + // compatibility. FIXME: should we deviate?? + if (!Method && !haveQualifiers) + Method = LookupInstanceMethodInGlobalPool( + Sel, SourceRange(lbrac,rbrac)); + } if (Method && DiagnoseUseOfDecl(Method, receiverLoc)) return true; } else { @@ -443,19 +447,6 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, return true; } - if (!Method) { - // If we have an implementation in scope, check "private" methods. - if (ClassDecl) - if (ObjCImplementationDecl *ImpDecl = - ObjCImplementations[ClassDecl->getIdentifier()]) - Method = ImpDecl->getInstanceMethod(Sel); - // If we still haven't found a method, look in the global pool. This - // behavior isn't very desirable, however we need it for GCC - // compatibility. - if (!Method) - Method = LookupInstanceMethodInGlobalPool( - Sel, SourceRange(lbrac,rbrac)); - } if (CheckMessageArgumentTypes(ArgExprs, NumArgs, Sel, Method, false, lbrac, rbrac, returnType)) return true; |