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.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57995 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Steve Naroff 2008-10-22 19:16:27 +00:00
Родитель 8b7650ed5a
Коммит 7692ed6109
2 изменённых файлов: 39 добавлений и 0 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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