Fix a bug in nonfragile-abi2 when attempting to diagnose

previous use of a synthesized 'ivar' with property of same name
declared as @dynamic. In this case, 'ivar' is in the
inherited class and no diagnostics should be issued.

llvm-svn: 111940
This commit is contained in:
Fariborz Jahanian 2010-08-24 18:48:05 +00:00
parent f2b1419acc
commit 76b35379f5
2 changed files with 40 additions and 2 deletions

View File

@ -521,7 +521,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
if (getLangOptions().ObjCNonFragileABI2) {
// Diagnose if an ivar was lazily synthesdized due to a previous
// use and if 1) property is @dynamic or 2) property is synthesized
// but it requires a dirreferently named ivar.
// but it requires an ivar of different name.
ObjCInterfaceDecl *ClassDeclared;
ObjCIvarDecl *Ivar = 0;
if (!Synthesize)
@ -530,7 +530,9 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
if (PropertyIvar && PropertyIvar != PropertyId)
Ivar = IDecl->lookupInstanceVariable(PropertyId, ClassDeclared);
}
if (Ivar && Ivar->getSynthesize()) {
// Issue diagnostics only if Ivar belongs to current class.
if (Ivar && Ivar->getSynthesize() &&
IC->getClassInterface() == ClassDeclared) {
Diag(Ivar->getLocation(), diag::err_undeclared_var_use)
<< PropertyId;
Ivar->setInvalidDecl();

View File

@ -0,0 +1,36 @@
// RUN: %clang_cc1 -fsyntax-only -fobjc-nonfragile-abi2 -verify %s
// Do not issue error if 'ivar' used previously belongs to the inherited class
// and has same name as @dynalic property in current class.
typedef signed char BOOL;
@protocol IDEBuildable
@property (readonly) BOOL hasRecursiveDependencyCycle;
@end
@protocol IDEBuildableProduct <IDEBuildable>
@end
@interface IDEBuildableSupportMixIn
@property (readonly) BOOL hasRecursiveDependencyCycle;
@end
@interface Xcode3TargetBuildable <IDEBuildable>
{
IDEBuildableSupportMixIn *_buildableMixIn;
}
@end
@interface Xcode3TargetProduct : Xcode3TargetBuildable <IDEBuildableProduct>
@end
@implementation Xcode3TargetBuildable
- (BOOL)hasRecursiveDependencyCycle
{
return [_buildableMixIn hasRecursiveDependencyCycle];
}
@end
@implementation Xcode3TargetProduct
@dynamic hasRecursiveDependencyCycle;
@end