Skip to content

Commit 8f54aa6

Browse files
Merge pull request #25259 from aschwaighofer/fix_getSingletonAggregateFieldType_tuples
IRGen: Fix handling of singleton aggregate projections and tuple types
2 parents d272bfa + 8e01891 commit 8f54aa6

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
@@ -2291,14 +2291,9 @@ SILType irgen::getSingletonAggregateFieldType(IRGenModule &IGM, SILType t,
22912291
auto field = allFields.begin();
22922292
if (!allFields.empty() && std::next(field) == allFields.end()) {
22932293
auto fieldTy = t.getFieldType(*field, IGM.getSILModule());
2294-
if (auto fieldDecl = fieldTy.getNominalOrBoundGenericNominal()) {
2295-
// The field's access level must be higher or equal to the enclosing
2296-
// struct's.
2297-
if (fieldDecl->getEffectiveAccess() >= structDecl->getEffectiveAccess())
2298-
return fieldTy;
2299-
} else {
2300-
return fieldTy;
2301-
}
2294+
if (!IGM.isTypeABIAccessible(fieldTy))
2295+
return SILType();
2296+
return fieldTy;
23022297
}
23032298

23042299
return SILType();
@@ -2316,14 +2311,9 @@ SILType irgen::getSingletonAggregateFieldType(IRGenModule &IGM, SILType t,
23162311
if (!allCases.empty() && std::next(theCase) == allCases.end()
23172312
&& (*theCase)->hasAssociatedValues()) {
23182313
auto enumEltTy = t.getEnumElementType(*theCase, IGM.getSILModule());
2319-
if (auto eltDecl = enumEltTy.getNominalOrBoundGenericNominal()) {
2320-
// The enum element's access level must be higher or equal to the
2321-
// enclosing struct's.
2322-
if (eltDecl->getEffectiveAccess() >= enumDecl->getEffectiveAccess())
2323-
return enumEltTy;
2324-
} else {
2325-
return enumEltTy;
2326-
}
2314+
if (!IGM.isTypeABIAccessible(enumEltTy))
2315+
return SILType();
2316+
return enumEltTy;
23272317
}
23282318

23292319
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)