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:
parent
082af393ff
commit
e2177fbfdc
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue