Objective-C: When using super.prop, property should be

looked up the current class's super class.
// rdar://13349296

llvm-svn: 176832
This commit is contained in:
Fariborz Jahanian 2013-03-11 22:26:33 +00:00
parent 789beb5300
commit 05e2aaadae
3 changed files with 33 additions and 4 deletions

View File

@ -1561,8 +1561,15 @@ ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
if (ObjCMethodDecl *CurMethod = tryCaptureObjCSelf(receiverNameLoc)) {
if (CurMethod->isInstanceMethod()) {
QualType T =
Context.getObjCInterfaceType(CurMethod->getClassInterface());
ObjCInterfaceDecl *Super =
CurMethod->getClassInterface()->getSuperClass();
if (!Super) {
// The current class does not have a superclass.
Diag(receiverNameLoc, diag::error_root_class_cannot_use_super)
<< CurMethod->getClassInterface()->getIdentifier();
return ExprError();
}
QualType T = Context.getObjCInterfaceType(Super);
T = Context.getObjCObjectPointerType(T);
return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(),

View File

@ -9,6 +9,7 @@
@class B;
@interface Root
@property(readonly) int p0;
@end
@interface A : Root <P1> {

View File

@ -1,5 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// expected-no-diagnostics
// RUN: %clang_cc1 -fsyntax-only -fobjc-default-synthesize-properties -verify %s
@interface B
+(int) classGetter;
@ -29,3 +28,25 @@ void f0() {
int l2 = [A classGetter2];
}
// rdar://13349296
__attribute__((objc_root_class)) @interface ClassBase
@property (nonatomic, retain) ClassBase * foo;
@end
@implementation ClassBase
- (void) Meth:(ClassBase*)foo {
super.foo = foo; // expected-error {{'ClassBase' cannot use 'super' because it is a root class}}
[super setFoo:foo]; // expected-error {{'ClassBase' cannot use 'super' because it is a root class}}
}
@end
@interface ClassDerived : ClassBase
@property (nonatomic, retain) ClassDerived * foo;
@end
@implementation ClassDerived
- (void) Meth:(ClassBase*)foo {
super.foo = foo; // issues compile warning
[super setFoo:foo]; // works with no warning
}
@end