Nonfragile ivar synthesis with property is in a continuation
class. llvm-svn: 68234
This commit is contained in:
parent
d854c8d8a6
commit
78be1651e2
|
@ -614,6 +614,17 @@ void ASTContext::CollectObjCIvars(const ObjCInterfaceDecl *OI,
|
|||
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
|
||||
Fields.push_back(cast<FieldDecl>(IV));
|
||||
}
|
||||
// look into continuation class.
|
||||
for (ObjCCategoryDecl *Categories = OI->getCategoryList();
|
||||
Categories; Categories = Categories->getNextClassCategory())
|
||||
if (!Categories->getIdentifier()) {
|
||||
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
|
||||
E = Categories->prop_end(); I != E; ++I) {
|
||||
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
|
||||
Fields.push_back(cast<FieldDecl>(IV));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// addRecordToClass - produces record info. for the class for its
|
||||
|
@ -711,7 +722,18 @@ ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) {
|
|||
if (ObjCIvarDecl *Ivar = (*I)->getPropertyIvarDecl())
|
||||
NewEntry->LayoutField(Ivar, i++, false, StructPacking, *this);
|
||||
}
|
||||
|
||||
// Also continuation class.
|
||||
for (ObjCCategoryDecl *Categories = D->getCategoryList();
|
||||
Categories; Categories = Categories->getNextClassCategory())
|
||||
if (!Categories->getIdentifier()) {
|
||||
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
|
||||
E = Categories->prop_end(); I != E; ++I) {
|
||||
if (ObjCIvarDecl *Ivar = (*I)->getPropertyIvarDecl())
|
||||
NewEntry->LayoutField(Ivar, i++, false, StructPacking, *this);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Finally, round the size of the total struct up to the alignment of the
|
||||
// struct itself.
|
||||
NewEntry->FinalizeLayout();
|
||||
|
|
|
@ -147,6 +147,22 @@ ObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable(
|
|||
return IV;
|
||||
}
|
||||
}
|
||||
// look into continuation class.
|
||||
for (ObjCCategoryDecl *Categories = ClassDecl->getCategoryList();
|
||||
Categories; Categories = Categories->getNextClassCategory())
|
||||
if (!Categories->getIdentifier()) {
|
||||
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
|
||||
E = Categories->prop_end(); I != E; ++I) {
|
||||
ObjCPropertyDecl *PDecl = (*I);
|
||||
if (ObjCIvarDecl *IV = PDecl->getPropertyIvarDecl())
|
||||
if (IV->getIdentifier() == ID) {
|
||||
clsDeclared = ClassDecl;
|
||||
return IV;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
ClassDecl = ClassDecl->getSuperClass();
|
||||
}
|
||||
return NULL;
|
||||
|
|
|
@ -1674,6 +1674,18 @@ static int countInheritedIvars(const ObjCInterfaceDecl *OI) {
|
|||
if ((*I)->getPropertyIvarDecl())
|
||||
++count;
|
||||
}
|
||||
// look into continuation class.
|
||||
for (ObjCCategoryDecl *Categories = OI->getCategoryList();
|
||||
Categories; Categories = Categories->getNextClassCategory()) {
|
||||
if (!Categories->getIdentifier()) {
|
||||
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
|
||||
E = Categories->prop_end(); I != E; ++I) {
|
||||
if ((*I)->getPropertyIvarDecl())
|
||||
++count;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -1702,6 +1714,20 @@ static const ObjCInterfaceDecl *getInterfaceDeclForIvar(
|
|||
if (IV->getIdentifier() == IVD->getIdentifier())
|
||||
return OI;
|
||||
}
|
||||
// look into continuation class.
|
||||
for (ObjCCategoryDecl *Categories = OI->getCategoryList();
|
||||
Categories; Categories = Categories->getNextClassCategory()) {
|
||||
if (!Categories->getIdentifier()) {
|
||||
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
|
||||
E = Categories->prop_end(); I != E; ++I) {
|
||||
ObjCPropertyDecl *PDecl = (*I);
|
||||
if (ObjCIvarDecl *IV = PDecl->getPropertyIvarDecl())
|
||||
if (IV->getIdentifier() == IVD->getIdentifier())
|
||||
return OI;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return getInterfaceDeclForIvar(OI->getSuperClass(), IVD);
|
||||
}
|
||||
|
||||
|
@ -4566,6 +4592,18 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
|
|||
E = OID->prop_end(); I != E; ++I)
|
||||
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
|
||||
OIvars.push_back(IV);
|
||||
// look into continuation class.
|
||||
for (ObjCCategoryDecl *Categories = OID->getCategoryList();
|
||||
Categories; Categories = Categories->getNextClassCategory())
|
||||
if (!Categories->getIdentifier()) {
|
||||
for (ObjCInterfaceDecl::prop_iterator I = Categories->prop_begin(),
|
||||
E = Categories->prop_end(); I != E; ++I) {
|
||||
if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
|
||||
OIvars.push_back(IV);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
unsigned iv = 0;
|
||||
for (RecordDecl::field_iterator e = RD->field_end(); i != e; ++i) {
|
||||
FieldDecl *Field = *i;
|
||||
|
|
|
@ -12,3 +12,16 @@
|
|||
return IP;
|
||||
}
|
||||
@end
|
||||
|
||||
// Test for synthesis of ivar for a property
|
||||
// declared in continuation class.
|
||||
@interface OrganizerViolatorView
|
||||
@end
|
||||
|
||||
@interface OrganizerViolatorView()
|
||||
@property (retain) id bindingInfo;
|
||||
@end
|
||||
|
||||
@implementation OrganizerViolatorView
|
||||
@synthesize bindingInfo;
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue