diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index f36c28a85a68fc..b36d97357906bc 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -3291,6 +3291,8 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, for (auto *PD : ClassExt->properties()) { if (IsClassProperty != PD->isClassProperty()) continue; + if (PD->isDirectProperty()) + continue; PropertySet.insert(PD->getIdentifier()); Properties.push_back(PD); } @@ -3302,6 +3304,8 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, // class extension. if (!PropertySet.insert(PD->getIdentifier()).second) continue; + if (PD->isDirectProperty()) + continue; Properties.push_back(PD); } @@ -3327,8 +3331,6 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name, values.addInt(ObjCTypes.IntTy, Properties.size()); auto propertiesArray = values.beginArray(ObjCTypes.PropertyTy); for (auto PD : Properties) { - if (PD->isDirectProperty()) - continue; auto property = propertiesArray.beginStruct(ObjCTypes.PropertyTy); property.add(GetPropertyName(PD->getIdentifier())); property.add(GetPropertyTypeString(PD, Container)); diff --git a/clang/test/CodeGenObjC/direct-properties.m b/clang/test/CodeGenObjC/direct-properties.m new file mode 100644 index 00000000000000..113ac12f18bfe4 --- /dev/null +++ b/clang/test/CodeGenObjC/direct-properties.m @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -emit-llvm -fobjc-arc -triple x86_64-apple-darwin10 %s -o - | FileCheck %s + +__attribute__((objc_root_class)) +@interface A +@property(direct, readonly) int i; +@end + +__attribute__((objc_root_class)) +@interface B +@property(direct, readonly) int i; +@property(readonly) int j; +@end + +// CHECK-NOT: @"__OBJC_$_PROP_LIST_A" +@implementation A +@synthesize i = _i; +@end + +// CHECK: @"_OBJC_$_PROP_LIST_B" = internal global { i32, i32, [1 x %struct._prop_t] } { i32 16, i32 1 +@implementation B +@synthesize i = _i; +@synthesize j = _j; +@end