forked from OSchip/llvm-project
[CodeGen][ObjC] Push the properties of a protocol before pushing the
properties of the protocol it inherits This fixes a bug where the type string for a @dynamic property of an @implementation didn't have 'D' in it when the protocol it conforms to redeclares the property declared in the base protocol. rdar://problem/45503561
This commit is contained in:
parent
7ba4595c86
commit
20f005d25f
|
@ -3245,9 +3245,6 @@ PushProtocolProperties(llvm::SmallPtrSet<const IdentifierInfo*,16> &PropertySet,
|
|||
SmallVectorImpl<const ObjCPropertyDecl *> &Properties,
|
||||
const ObjCProtocolDecl *Proto,
|
||||
bool IsClassProperty) {
|
||||
for (const auto *P : Proto->protocols())
|
||||
PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
|
||||
|
||||
for (const auto *PD : Proto->properties()) {
|
||||
if (IsClassProperty != PD->isClassProperty())
|
||||
continue;
|
||||
|
@ -3255,6 +3252,9 @@ PushProtocolProperties(llvm::SmallPtrSet<const IdentifierInfo*,16> &PropertySet,
|
|||
continue;
|
||||
Properties.push_back(PD);
|
||||
}
|
||||
|
||||
for (const auto *P : Proto->protocols())
|
||||
PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
// CHECK: private unnamed_addr constant [16 x i8] c"@\22Foo<X><Y><Z>\22\00",
|
||||
// CHECK: private unnamed_addr constant [13 x i8] c"{Intf=@@@@#}\00",
|
||||
|
||||
// CHECK: @[[PROP_NAME_ATTR:.*]] = private unnamed_addr constant [5 x i8] c"T@,D\00",
|
||||
// CHECK: @"_OBJC_$_PROP_LIST_C0" = internal global { i32, i32, [1 x %{{.*}}] } { i32 8, i32 1, [1 x %{{.*}}] [%{{.*}} { {{.*}}, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @[[PROP_NAME_ATTR]], i32 0, i32 0) }] },
|
||||
|
||||
@protocol X, Y, Z;
|
||||
@class Foo;
|
||||
|
||||
|
@ -29,3 +32,18 @@ int main()
|
|||
{
|
||||
const char * en = @encode(Intf);
|
||||
}
|
||||
|
||||
@protocol P0
|
||||
@property id prop0;
|
||||
@end
|
||||
|
||||
@protocol P1 <P0>
|
||||
@property id prop0;
|
||||
@end
|
||||
|
||||
@interface C0 <P1>
|
||||
@end
|
||||
|
||||
@implementation C0
|
||||
@dynamic prop0;
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue