summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExprObjC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaExprObjC.cpp')
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp
index e2e23ce0637..1f21ee0ec57 100644
--- a/clang/lib/Sema/SemaExprObjC.cpp
+++ b/clang/lib/Sema/SemaExprObjC.cpp
@@ -223,8 +223,7 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
receiverType = RExpr->getType().getCanonicalType().getUnqualifiedType();
- if (receiverType == Context.getObjCIdType().getCanonicalType() ||
- receiverType == Context.getObjCClassType().getCanonicalType()) {
+ if (receiverType == Context.getObjCIdType().getCanonicalType()) {
Method = InstanceMethodPool[Sel].Method;
if (!Method)
Method = FactoryMethodPool[Sel].Method;
@@ -238,6 +237,29 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
if (CheckMessageArgumentTypes(ArgExprs, Sel.getNumArgs(), Method))
return true;
}
+ } else if (receiverType == Context.getObjCClassType().getCanonicalType()) {
+ if (CurMethodDecl) {
+ ObjCInterfaceDecl* ClassDecl = CurMethodDecl->getClassInterface();
+ // If we have an implementation in scope, check "private" methods.
+ if (ClassDecl)
+ if (ObjCImplementationDecl *ImpDecl =
+ ObjCImplementations[ClassDecl->getIdentifier()])
+ Method = ImpDecl->getClassMethod(Sel);
+ }
+ if (!Method)
+ Method = FactoryMethodPool[Sel].Method;
+ if (!Method)
+ Method = InstanceMethodPool[Sel].Method;
+ if (!Method) {
+ Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),
+ SourceRange(lbrac, rbrac));
+ returnType = Context.getObjCIdType();
+ } else {
+ returnType = Method->getResultType();
+ if (Sel.getNumArgs())
+ if (CheckMessageArgumentTypes(ArgExprs, Sel.getNumArgs(), Method))
+ return true;
+ }
} else {
bool receiverIsQualId = isa<ObjCQualifiedIdType>(receiverType);
// FIXME (snaroff): checking in this code from Patrick. Needs to be
OpenPOWER on IntegriCloud