aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2007-12-18 01:30:32 +0000
committerSteve Naroff <snaroff@apple.com>2007-12-18 01:30:32 +0000
commita56f616744b929aa7115034e7e2f9a0b8df545f6 (patch)
treef3672ba2e6262f64fd39485a3336dda5b8e5b8c4
parent7acda7c4a0e4aec6c003b3169ca45a5f3bc7e033 (diff)
Improve how we find private method decls. This involved:
- Changed Sema::ObjcActOnStartOfMethodDef() to register the methods with the global pools. - Changed Sema::ActOnInstanceMessage() to look in global pools (should be much less error prone). - Added a test case to message.m (for lookup that was broken). Misc changes while I was investigating this... - Changed Sema::ActOnAtEnd() to call AddFactoryMethodToGlobalPool (this looked like a cut/paste error). - Added a comment and tweaked another where I was using the first person. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45142 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Sema/SemaDeclObjC.cpp16
-rw-r--r--Sema/SemaExpr.cpp19
-rw-r--r--test/Sema/message.m25
3 files changed, 39 insertions, 21 deletions
diff --git a/Sema/SemaDeclObjC.cpp b/Sema/SemaDeclObjC.cpp
index d520c4f357..946d12f5c0 100644
--- a/Sema/SemaDeclObjC.cpp
+++ b/Sema/SemaDeclObjC.cpp
@@ -24,6 +24,12 @@ void Sema::ObjcActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) {
assert(CurFunctionDecl == 0 && "Method parsing confused");
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
assert(MDecl != 0 && "Not a method declarator!");
+
+ // Allow the rest of sema to find private method decl implementations.
+ if (MDecl->isInstance())
+ AddInstanceMethodToGlobalPool(MDecl);
+ else
+ AddFactoryMethodToGlobalPool(MDecl);
// Allow all of Sema to see that we are entering a method definition.
CurMethodDecl = MDecl;
@@ -666,13 +672,15 @@ void Sema::AddFactoryMethodToGlobalPool(ObjcMethodDecl *Method) {
}
}
+// Note: For class/category implemenations, allMethods/allProperties is
+// always null.
void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
DeclTy **allMethods, unsigned allNum,
DeclTy **allProperties, unsigned pNum) {
Decl *ClassDecl = static_cast<Decl *>(classDecl);
- // FIXME: If we don't have a ClassDecl, we have an error. I (snaroff) would
- // prefer we always pass in a decl. If the decl has an error, isInvalidDecl()
+ // FIXME: If we don't have a ClassDecl, we have an error. We should consider
+ // always passing in a decl. If the decl has an error, isInvalidDecl()
// should be true.
if (!ClassDecl)
return;
@@ -731,8 +739,8 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
} else {
clsMethods.push_back(Method);
ClsMap[Method->getSelector()] = Method;
- /// The following allows us to typecheck messages to "id".
- AddInstanceMethodToGlobalPool(Method);
+ /// The following allows us to typecheck messages to "Class".
+ AddFactoryMethodToGlobalPool(Method);
}
}
}
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index 45d0470544..e5f748fa66 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -2264,23 +2264,8 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
if (receiverType == Context.getObjcIdType() ||
receiverType == Context.getObjcClassType()) {
Method = InstanceMethodPool[Sel].Method;
- // If we didn't find an public method, look for a private one.
- if (!Method && CurMethodDecl) {
- NamedDecl *impCxt = CurMethodDecl->getMethodContext();
- if (ObjcImplementationDecl *IMD =
- dyn_cast<ObjcImplementationDecl>(impCxt)) {
- if (receiverType == Context.getObjcIdType())
- Method = IMD->lookupInstanceMethod(Sel);
- else
- Method = IMD->lookupClassMethod(Sel);
- } else if (ObjcCategoryImplDecl *CID =
- dyn_cast<ObjcCategoryImplDecl>(impCxt)) {
- if (receiverType == Context.getObjcIdType())
- Method = CID->lookupInstanceMethod(Sel);
- else
- Method = CID->lookupClassMethod(Sel);
- }
- }
+ if (!Method)
+ Method = FactoryMethodPool[Sel].Method;
if (!Method) {
Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),
SourceRange(lbrac, rbrac));
diff --git a/test/Sema/message.m b/test/Sema/message.m
index dc50a19c81..9c9289b6b8 100644
--- a/test/Sema/message.m
+++ b/test/Sema/message.m
@@ -36,3 +36,28 @@ static void func(Helicopter *obj) {
// behavior isn't very desirable, however wee need it for GCC compatibility.
NSRect r = [obj rect];
}
+
+@interface NSObject @end
+
+extern Class NSClassFromObject(id object);
+
+@interface XX : NSObject
+@end
+
+@implementation XX
+
++ _privateMethod {
+ return self;
+}
+
+- (void) xx {
+ [NSClassFromObject(self) _privateMethod];
+}
+@end
+
+@implementation XX (Private)
+- (void) yy {
+ [NSClassFromObject(self) _privateMethod];
+}
+@end
+