Skip to content

Commit d45e611

Browse files
committed
[5.1] IRGen: Fix handling of singleton aggregate projections and tuple types
Follow up to "IRGen: getSingletonAggregateFieldType must not return field if its access level does not match" rdar://50554717
1 parent 20e68e2 commit d45e611

File tree

3 files changed

+72
-16
lines changed

3 files changed

+72
-16
lines changed

lib/IRGen/GenType.cpp

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,14 +2253,9 @@ SILType irgen::getSingletonAggregateFieldType(IRGenModule &IGM, SILType t,
22532253
auto field = allFields.begin();
22542254
if (!allFields.empty() && std::next(field) == allFields.end()) {
22552255
auto fieldTy = t.getFieldType(*field, IGM.getSILModule());
2256-
if (auto fieldDecl = fieldTy.getNominalOrBoundGenericNominal()) {
2257-
// The field's access level must be higher or equal to the enclosing
2258-
// struct's.
2259-
if (fieldDecl->getEffectiveAccess() >= structDecl->getEffectiveAccess())
2260-
return fieldTy;
2261-
} else {
2262-
return fieldTy;
2263-
}
2256+
if (!IGM.isTypeABIAccessible(fieldTy))
2257+
return SILType();
2258+
return fieldTy;
22642259
}
22652260

22662261
return SILType();
@@ -2278,14 +2273,9 @@ SILType irgen::getSingletonAggregateFieldType(IRGenModule &IGM, SILType t,
22782273
if (!allCases.empty() && std::next(theCase) == allCases.end()
22792274
&& (*theCase)->hasAssociatedValues()) {
22802275
auto enumEltTy = t.getEnumElementType(*theCase, IGM.getSILModule());
2281-
if (auto eltDecl = enumEltTy.getNominalOrBoundGenericNominal()) {
2282-
// The enum element's access level must be higher or equal to the
2283-
// enclosing struct's.
2284-
if (eltDecl->getEffectiveAccess() >= enumDecl->getEffectiveAccess())
2285-
return enumEltTy;
2286-
} else {
2287-
return enumEltTy;
2288-
}
2276+
if (!IGM.isTypeABIAccessible(enumEltTy))
2277+
return SILType();
2278+
return enumEltTy;
22892279
}
22902280

22912281
return SILType();

test/IRGen/Inputs/metadata2.swift

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,66 @@ struct InternalContainer {
2424
self.type = SomeEnumType(item: item)
2525
}
2626
}
27+
28+
struct InternalContainer2 {
29+
30+
fileprivate enum SomeEnumType {
31+
case none
32+
case single(Item)
33+
34+
init(item: [Item]) {
35+
if item.count >= 1 {
36+
self = .single(item.first!)
37+
} else {
38+
self = .none
39+
}
40+
}
41+
}
42+
43+
private var type: (SomeEnumType, SomeEnumType)
44+
45+
init(item: [Item]) {
46+
self.type = SomeEnumType(item: item)
47+
}
48+
}
49+
50+
enum InternalSingletonEnum {
51+
fileprivate enum SomeEnumType {
52+
case none
53+
case single(Item)
54+
55+
init(item: [Item]) {
56+
if item.count >= 1 {
57+
self = .single(item.first!)
58+
} else {
59+
self = .none
60+
}
61+
}
62+
}
63+
case first(SomeEnumType)
64+
65+
init() {
66+
return .first(.none)
67+
}
68+
}
69+
70+
enum InternalSingletonEnum2 {
71+
fileprivate enum SomeEnumType {
72+
case none
73+
case single(Item)
74+
75+
init(item: [Item]) {
76+
if item.count >= 1 {
77+
self = .single(item.first!)
78+
} else {
79+
self = .none
80+
}
81+
}
82+
}
83+
84+
case first(SomeEnumType, SomeEnumType)
85+
86+
init() {
87+
return .first(.none, .none)
88+
}
89+
}

test/IRGen/metadata.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
// CHECK: ret
99
class MyController {
1010
var c = InternalContainer(item: [])
11+
var c2 = InternalContainer2(item: [])
12+
var e = InternalSingletonEnum()
13+
var e2 = InternalSingletonEnum2()
1114
func update(_ n: InternalContainer) {
1215
c = n
1316
}

0 commit comments

Comments
 (0)