[SemaObjC] Fix ObjCInterfaceDecl::inheritsDesignatedInitializers(), if there are no

designated initializers in the super class hierarchy then it should return false.

rdar://16692535

llvm-svn: 207332
This commit is contained in:
Argyrios Kyrtzidis 2014-04-26 21:28:41 +00:00
parent ccf45ebc24
commit 357b36a2c0
2 changed files with 35 additions and 3 deletions

View File

@ -385,11 +385,21 @@ bool ObjCInterfaceDecl::inheritsDesignatedInitializers() const {
// misleading warnings.
if (isIntroducingInitializers(this)) {
data().InheritedDesignatedInitializers = DefinitionData::IDI_NotInherited;
return false;
} else {
data().InheritedDesignatedInitializers = DefinitionData::IDI_Inherited;
return true;
if (auto SuperD = getSuperClass()) {
data().InheritedDesignatedInitializers =
SuperD->declaresOrInheritsDesignatedInitializers() ?
DefinitionData::IDI_Inherited :
DefinitionData::IDI_NotInherited;
} else {
data().InheritedDesignatedInitializers =
DefinitionData::IDI_NotInherited;
}
}
assert(data().InheritedDesignatedInitializers
!= DefinitionData::IDI_Unknown);
return data().InheritedDesignatedInitializers ==
DefinitionData::IDI_Inherited;
}
}

View File

@ -388,3 +388,25 @@ __attribute__((objc_root_class))
return self;
}
@end
__attribute__((objc_root_class))
@interface RootNoDI
-(id)init;
@end
@interface Base : RootNoDI
@end
@implementation Base
@end
@interface Derived : Base
- (instancetype)initWithInt:(int)n NS_DESIGNATED_INITIALIZER;
@end
@implementation Derived
- (instancetype)initWithInt:(int)n
{
return [super init];
}
@end