Skip to content

Commit 5f1b85e

Browse files
committed
IRGen: Fix emission of reflection metadata for @objc enums
@objc enums lower as their raw type, so should go through the same code path as imported enums. Fixes <https://bugs.swift.org/browse/SR-5625> and <rdar://problem/33683103>.
1 parent bf8384b commit 5f1b85e

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

lib/IRGen/GenReflection.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,14 @@ void IRGenModule::emitFieldMetadataRecord(const NominalTypeDecl *Decl) {
961961
if (!IRGen.Opts.EnableReflectionMetadata)
962962
return;
963963

964+
// @objc enums never have generic parameters or payloads,
965+
// and lower as their raw type.
966+
if (auto *ED = dyn_cast<EnumDecl>(Decl))
967+
if (ED->isObjC()) {
968+
emitOpaqueTypeMetadataRecord(ED);
969+
return;
970+
}
971+
964972
FieldTypeMetadataBuilder builder(*this, Decl);
965973
builder.emit();
966974
}

test/Reflection/Inputs/TypeLoweringObjectiveC.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,13 @@ public class HasObjCClasses {
1111

1212
public class NSObjectSubclass : NSObject {}
1313

14+
@objc public enum ObjCEnum : Int {
15+
case first
16+
case second
17+
}
18+
19+
public struct HasObjCEnum {
20+
let optionalEnum: ObjCEnum?
21+
let reference: AnyObject
22+
}
23+

test/Reflection/typeref_lowering_objc.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,13 @@
1919
// CHECK: (class TypeLowering.NSObjectSubclass)
2020
// CHECK-NEXT: (reference kind=strong refcounting=unknown)
2121

22+
12TypeLowering11HasObjCEnumV
23+
// CHECK: (struct size=24 alignment=8 stride=24 num_extra_inhabitants=0
24+
// CHECK-NEXT: (field name=optionalEnum offset=0
25+
// CHECK-NEXT: (single_payload_enum size=9 alignment=8 stride=16 num_extra_inhabitants=0
26+
// CHECK-NEXT: (field name=some offset=0
27+
// CHECK-NEXT: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
28+
// CHECK-NEXT: (field name=reference offset=16
29+
// CHECK-NEXT: (class_existential size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647
30+
// CHECK-NEXT: (field name=object offset=0
31+
// CHECK-NEXT: (reference kind=strong refcounting=unknown)))))

0 commit comments

Comments
 (0)