Fix <rdar://problem/6257675> error: member reference base type ('NSUserDefaults *') is not a structure or union.

Teach Sema::ActOnMemberReferenceExpr() to look through local category implementations associated with the class.

llvm-svn: 57995
This commit is contained in:
Steve Naroff 2008-10-22 19:16:27 +00:00
parent c49d71ea61
commit 1df62692f2
2 changed files with 39 additions and 0 deletions

View File

@ -977,6 +977,13 @@ ActOnMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
ObjCImplementations[ClassDecl->getIdentifier()])
Getter = ImpDecl->getInstanceMethod(Sel);
// Look through local category implementations associated with the class.
if (!Getter) {
for (unsigned i = 0; i < ObjCCategoryImpls.size() && !Getter; i++) {
if (ObjCCategoryImpls[i]->getClassInterface() == IFace)
Getter = ObjCCategoryImpls[i]->getInstanceMethod(Sel);
}
}
if (Getter) {
// If we found a getter then this may be a valid dot-reference, we
// need to also look for the matching setter.

View File

@ -0,0 +1,32 @@
// RUN: clang -fsyntax-only -verify %s
@interface NSSound
@end
@interface NSFont
@end
@interface NSSound (Adds)
@end
@implementation NSSound (Adds)
- foo {
return self;
}
- (void)setFoo:obj {
}
@end
@implementation NSFont (Adds)
- xx {
NSSound *x;
id o;
o = [x foo];
o = x.foo;
[x setFoo:o];
x.foo = o;
}
@end