Cleaunup Sema::ActOnClassMessage(). This commit:

(a) removes a bogus warning.
(b) removes an undesirable usage of the ObjCMessageExpr constructor that takes an IdentifierInfo * (which I will abolish).

llvm-svn: 54042
This commit is contained in:
Steve Naroff 2008-07-25 19:39:00 +00:00
parent 082af393ff
commit e2177fbfdc
2 changed files with 25 additions and 16 deletions

View File

@ -169,7 +169,7 @@ Sema::ExprResult Sema::ActOnClassMessage(
} else } else
ClassDecl = getObjCInterfaceDecl(receiverName); ClassDecl = getObjCInterfaceDecl(receiverName);
// ClassDecl is null in the following case. // The following code allows for the following GCC-ism:
// //
// typedef XCElementDisplayRect XCElementGraphicsRect; // typedef XCElementDisplayRect XCElementGraphicsRect;
// //
@ -178,22 +178,31 @@ Sema::ExprResult Sema::ActOnClassMessage(
// _sGraphicsDelegate =[[XCElementGraphicsRect alloc] init]; // _sGraphicsDelegate =[[XCElementGraphicsRect alloc] init];
// } // }
// //
// FIXME: Investigate why GCC allows the above. // If necessary, the following lookup could move to getObjCInterfaceDecl().
if (!ClassDecl) {
Decl *IDecl = LookupDecl(receiverName, Decl::IDNS_Ordinary, 0, false);
if (TypedefDecl *OCTD = dyn_cast_or_null<TypedefDecl>(IDecl)) {
const ObjCInterfaceType *OCIT;
OCIT = OCTD->getUnderlyingType()->getAsObjCInterfaceType();
if (OCIT)
ClassDecl = OCIT->getDecl();
}
}
assert(ClassDecl && "missing interface declaration");
ObjCMethodDecl *Method = 0; ObjCMethodDecl *Method = 0;
QualType returnType; QualType returnType;
if (ClassDecl) { Method = ClassDecl->lookupClassMethod(Sel);
Method = ClassDecl->lookupClassMethod(Sel);
// If we have an implementation in scope, check "private" methods.
// If we have an implementation in scope, check "private" methods. if (!Method) {
if (!Method) { if (ObjCImplementationDecl *ImpDecl =
if (ObjCImplementationDecl *ImpDecl = ObjCImplementations[ClassDecl->getIdentifier()])
ObjCImplementations[ClassDecl->getIdentifier()]) Method = ImpDecl->getClassMethod(Sel);
Method = ImpDecl->getClassMethod(Sel);
}
// Before we give up, check if the selector is an instance method.
if (!Method)
Method = ClassDecl->lookupInstanceMethod(Sel);
} }
// Before we give up, check if the selector is an instance method.
if (!Method)
Method = ClassDecl->lookupInstanceMethod(Sel);
if (!Method) { if (!Method) {
Diag(lbrac, diag::warn_method_not_found, std::string("+"), Sel.getName(), Diag(lbrac, diag::warn_method_not_found, std::string("+"), Sel.getName(),
SourceRange(lbrac, rbrac)); SourceRange(lbrac, rbrac));
@ -212,7 +221,7 @@ Sema::ExprResult Sema::ActOnClassMessage(
// FIXME: need to do a better job handling 'super' usage within a class // FIXME: need to do a better job handling 'super' usage within a class
// For now, we simply pass the "super" identifier through (which isn't // For now, we simply pass the "super" identifier through (which isn't
// consistent with instance methods. // consistent with instance methods.
if (isSuper || !ClassDecl) if (isSuper)
return new ObjCMessageExpr(receiverName, Sel, returnType, Method, return new ObjCMessageExpr(receiverName, Sel, returnType, Method,
lbrac, rbrac, ArgExprs, NumArgs); lbrac, rbrac, ArgExprs, NumArgs);
else else

View File

@ -72,7 +72,7 @@ typedef XCElementDisplayRect XCElementGraphicsRect;
{ {
static XCElementGraphicsRect *_sGraphicsDelegate = ((void *) 0); static XCElementGraphicsRect *_sGraphicsDelegate = ((void *) 0);
if (!_sGraphicsDelegate) { if (!_sGraphicsDelegate) {
_sGraphicsDelegate =[[XCElementGraphicsRect alloc] init]; // expected-warning{{method '+alloc' not found (return type defaults to 'id')}} _sGraphicsDelegate =[[XCElementGraphicsRect alloc] init];
} }
} }
@end @end