Skip to content

Commit 8b03396

Browse files
authored
Merge pull request #37942 from varungandhi-apple/vg-5.5-fix-interface-bug
[5.5] [ModuleInterface] Print full type if ambiguous for extensions.
2 parents 923e2fc + 08a89b2 commit 8b03396

15 files changed

+134
-93
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ struct PrintOptions {
195195
/// type might be ambiguous.
196196
bool FullyQualifiedTypesIfAmbiguous = false;
197197

198+
/// Print fully qualified extended types if ambiguous.
199+
bool FullyQualifiedExtendedTypesIfAmbiguous = false;
200+
198201
/// If true, printed module names will use the "exported" name, which may be
199202
/// different from the regular name.
200203
///

lib/AST/ASTPrinter.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ PrintOptions PrintOptions::printSwiftInterfaceFile(ModuleDecl *ModuleToPrint,
121121
result.PrintIfConfig = false;
122122
result.CurrentModule = ModuleToPrint;
123123
result.FullyQualifiedTypes = true;
124+
result.FullyQualifiedTypesIfAmbiguous = true;
125+
result.FullyQualifiedExtendedTypesIfAmbiguous = true;
124126
result.UseExportedModuleNames = true;
125127
result.AllowNullTypes = false;
126128
result.SkipImports = true;
@@ -2336,9 +2338,14 @@ void PrintAST::visitImportDecl(ImportDecl *decl) {
23362338
}
23372339

23382340
static void printExtendedTypeName(Type ExtendedType, ASTPrinter &Printer,
2339-
PrintOptions Options) {
2340-
Options.FullyQualifiedTypes = false;
2341-
Options.FullyQualifiedTypesIfAmbiguous = false;
2341+
PrintOptions &Options) {
2342+
bool OldFullyQualifiedTypesIfAmbiguous =
2343+
Options.FullyQualifiedTypesIfAmbiguous;
2344+
Options.FullyQualifiedTypesIfAmbiguous =
2345+
Options.FullyQualifiedExtendedTypesIfAmbiguous;
2346+
SWIFT_DEFER {
2347+
Options.FullyQualifiedTypesIfAmbiguous = OldFullyQualifiedTypesIfAmbiguous;
2348+
};
23422349

23432350
// Strip off generic arguments, if any.
23442351
auto Ty = ExtendedType->getAnyNominal()->getDeclaredType();

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -590,10 +590,16 @@ class InheritedProtocolCollector {
590590
DeclAttributes::print(printer, printOptions, attrs);
591591

592592
printer << "extension ";
593-
PrintOptions typePrintOptions = printOptions;
594-
typePrintOptions.FullyQualifiedTypes = false;
595-
typePrintOptions.FullyQualifiedTypesIfAmbiguous = false;
596-
nominal->getDeclaredType().print(printer, typePrintOptions);
593+
{
594+
PrintOptions typePrintOptions = printOptions;
595+
bool oldFullyQualifiedTypesIfAmbiguous =
596+
typePrintOptions.FullyQualifiedTypesIfAmbiguous;
597+
typePrintOptions.FullyQualifiedTypesIfAmbiguous =
598+
typePrintOptions.FullyQualifiedExtendedTypesIfAmbiguous;
599+
nominal->getDeclaredType().print(printer, typePrintOptions);
600+
typePrintOptions.FullyQualifiedTypesIfAmbiguous =
601+
oldFullyQualifiedTypesIfAmbiguous;
602+
}
597603
printer << " : ";
598604

599605
proto->getDeclaredInterfaceType()->print(printer, printOptions);

test/ModuleInterface/access-filter.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public protocol PublicProto {
5353
func requirement()
5454
} // CHECK-NEXT: {{^[}]$}}
5555

56-
// CHECK: extension PublicProto {{[{]$}}
56+
// CHECK: extension AccessFilter.PublicProto {{[{]$}}
5757
extension PublicProto {
5858
// CHECK: public func publicMethod(){{$}}
5959
public func publicMethod() {}
@@ -64,7 +64,7 @@ extension PublicProto {
6464
@usableFromInline internal func ufiMethod() {}
6565
} // CHECK: {{^[}]$}}
6666

67-
// CHECK: {{^}}extension PublicProto {{[{]$}}
67+
// CHECK: {{^}}extension AccessFilter.PublicProto {{[{]$}}
6868
public extension PublicProto {
6969
// CHECK: public func publicExtPublicMethod(){{$}}
7070
func publicExtPublicMethod() {}
@@ -96,7 +96,7 @@ internal protocol UFIProto {
9696
func requirement()
9797
} // CHECK-NEXT: {{^[}]$}}
9898

99-
// CHECK: extension UFIProto {{[{]$}}
99+
// CHECK: extension AccessFilter.UFIProto {{[{]$}}
100100
extension UFIProto {
101101
// CHECK: public func publicMethod(){{$}}
102102
public func publicMethod() {}
@@ -107,7 +107,7 @@ extension UFIProto {
107107
@usableFromInline internal func ufiMethod() {}
108108
} // CHECK: {{^[}]$}}
109109

110-
// CHECK: extension PublicStruct {{[{]$}}
110+
// CHECK: extension AccessFilter.PublicStruct {{[{]$}}
111111
extension PublicStruct {
112112
// CHECK: @_hasInitialValue public static var secretlySettable: Swift.Int {
113113
// CHECK-NEXT: get
@@ -120,7 +120,7 @@ extension InternalStruct_BAD: PublicProto {
120120
internal static var dummy: Int { return 0 }
121121
}
122122

123-
// CHECK: extension UFIStruct : AccessFilter.PublicProto {{[{]$}}
123+
// CHECK: extension AccessFilter.UFIStruct : AccessFilter.PublicProto {{[{]$}}
124124
extension UFIStruct: PublicProto {
125125
// CHECK-NEXT: @usableFromInline
126126
// CHECK-NEXT: internal typealias Assoc = Swift.Int
@@ -167,12 +167,12 @@ class InternalClass_BAD {
167167
// CHECK: public struct GenericStruct<T>
168168
public struct GenericStruct<T> {}
169169

170-
// CHECK: extension GenericStruct where T == AccessFilter.PublicStruct {{[{]$}}
170+
// CHECK: extension AccessFilter.GenericStruct where T == AccessFilter.PublicStruct {{[{]$}}
171171
extension GenericStruct where T == AccessFilter.PublicStruct {
172172
// CHECK-NEXT: public func constrainedToPublicStruct(){{$}}
173173
public func constrainedToPublicStruct() {}
174174
} // CHECK-NEXT: {{^[}]$}}
175-
// CHECK: extension GenericStruct where T == AccessFilter.UFIStruct {{[{]$}}
175+
// CHECK: extension AccessFilter.GenericStruct where T == AccessFilter.UFIStruct {{[{]$}}
176176
extension GenericStruct where T == AccessFilter.UFIStruct {
177177
// CHECK-NEXT: @usableFromInline{{$}}
178178
// CHECK-NEXT: internal func constrainedToUFIStruct(){{$}}
@@ -182,12 +182,12 @@ extension GenericStruct where T == InternalStruct_BAD {
182182
@usableFromInline internal func constrainedToInternalStruct_BAD() {}
183183
}
184184

185-
// CHECK: extension GenericStruct where T == AccessFilter.PublicStruct {{[{]$}}
185+
// CHECK: extension AccessFilter.GenericStruct where T == AccessFilter.PublicStruct {{[{]$}}
186186
extension GenericStruct where PublicStruct == T {
187187
// CHECK-NEXT: public func constrainedToPublicStruct2(){{$}}
188188
public func constrainedToPublicStruct2() {}
189189
} // CHECK-NEXT: {{^[}]$}}
190-
// CHECK: extension GenericStruct where T == AccessFilter.UFIStruct {{[{]$}}
190+
// CHECK: extension AccessFilter.GenericStruct where T == AccessFilter.UFIStruct {{[{]$}}
191191
extension GenericStruct where UFIStruct == T {
192192
// CHECK-NEXT: @usableFromInline{{$}}
193193
// CHECK-NEXT: internal func constrainedToUFIStruct2(){{$}}
@@ -197,12 +197,12 @@ extension GenericStruct where InternalStruct_BAD == T {
197197
@usableFromInline internal func constrainedToInternalStruct2_BAD() {}
198198
}
199199

200-
// CHECK: extension GenericStruct where T : AccessFilter.PublicProto {{[{]$}}
200+
// CHECK: extension AccessFilter.GenericStruct where T : AccessFilter.PublicProto {{[{]$}}
201201
extension GenericStruct where T: PublicProto {
202202
// CHECK-NEXT: public func constrainedToPublicProto(){{$}}
203203
public func constrainedToPublicProto() {}
204204
} // CHECK-NEXT: {{^[}]$}}
205-
// CHECK: extension GenericStruct where T : AccessFilter.UFIProto {{[{]$}}
205+
// CHECK: extension AccessFilter.GenericStruct where T : AccessFilter.UFIProto {{[{]$}}
206206
extension GenericStruct where T: UFIProto {
207207
// CHECK-NEXT: @usableFromInline{{$}}
208208
// CHECK-NEXT: internal func constrainedToUFIProto(){{$}}
@@ -212,12 +212,12 @@ extension GenericStruct where T: InternalProto_BAD {
212212
@usableFromInline internal func constrainedToInternalProto_BAD() {}
213213
}
214214

215-
// CHECK: extension GenericStruct where T : AccessFilter.PublicClass {{[{]$}}
215+
// CHECK: extension AccessFilter.GenericStruct where T : AccessFilter.PublicClass {{[{]$}}
216216
extension GenericStruct where T: PublicClass {
217217
// CHECK-NEXT: public func constrainedToPublicClass(){{$}}
218218
public func constrainedToPublicClass() {}
219219
} // CHECK-NEXT: {{^[}]$}}
220-
// CHECK: extension GenericStruct where T : AccessFilter.UFIClass {{[{]$}}
220+
// CHECK: extension AccessFilter.GenericStruct where T : AccessFilter.UFIClass {{[{]$}}
221221
extension GenericStruct where T: UFIClass {
222222
// CHECK-NEXT: @usableFromInline{{$}}
223223
// CHECK-NEXT: internal func constrainedToUFIClass(){{$}}
@@ -227,7 +227,7 @@ extension GenericStruct where T: InternalClass_BAD {
227227
@usableFromInline internal func constrainedToInternalClass_BAD() {}
228228
}
229229

230-
// CHECK: extension GenericStruct where T : AnyObject {{[{]$}}
230+
// CHECK: extension AccessFilter.GenericStruct where T : AnyObject {{[{]$}}
231231
extension GenericStruct where T: AnyObject {
232232
// CHECK-NEXT: public func constrainedToAnyObject(){{$}}
233233
public func constrainedToAnyObject() {}
@@ -245,12 +245,12 @@ internal typealias InternalAlias_BAD = PublicAliasBase
245245

246246
internal typealias ReallyInternalAlias_BAD = ReallyInternalAliasBase_BAD
247247

248-
// CHECK: extension GenericStruct where T == AccessFilter.PublicAlias {{[{]$}}
248+
// CHECK: extension AccessFilter.GenericStruct where T == AccessFilter.PublicAlias {{[{]$}}
249249
extension GenericStruct where T == PublicAlias {
250250
// CHECK-NEXT: public func constrainedToPublicAlias(){{$}}
251251
public func constrainedToPublicAlias() {}
252252
} // CHECK-NEXT: {{^[}]$}}
253-
// CHECK: extension GenericStruct where T == AccessFilter.UFIAlias {{[{]$}}
253+
// CHECK: extension AccessFilter.GenericStruct where T == AccessFilter.UFIAlias {{[{]$}}
254254
extension GenericStruct where T == UFIAlias {
255255
// CHECK-NEXT: @usableFromInline{{$}}
256256
// CHECK-NEXT: internal func constrainedToUFIAlias(){{$}}
@@ -275,7 +275,7 @@ extension GenericStruct: PublicProto where T: InternalProto_BAD {
275275

276276
public struct MultiGenericStruct<First, Second> {}
277277

278-
// CHECK: extension MultiGenericStruct where First == AccessFilter.PublicStruct, Second == AccessFilter.PublicStruct {{[{]$}}
278+
// CHECK: extension AccessFilter.MultiGenericStruct where First == AccessFilter.PublicStruct, Second == AccessFilter.PublicStruct {{[{]$}}
279279
extension MultiGenericStruct where First == PublicStruct, Second == PublicStruct {
280280
// CHECK-NEXT: public func publicPublic(){{$}}
281281
public func publicPublic() {}

test/ModuleInterface/conformances.swift

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -33,45 +33,45 @@ public struct A1: PublicProto, PrivateProto {}
3333
// NEGATIVE-NOT: extension conformances.A2
3434
public struct A2: PrivateProto, PublicProto {}
3535
// CHECK: public struct A3 {
36-
// CHECK-END: extension A3 : conformances.PublicProto {}
36+
// CHECK-END: extension conformances.A3 : conformances.PublicProto {}
3737
public struct A3: PublicProto & PrivateProto {}
3838
// CHECK: public struct A4 {
39-
// CHECK-END: extension A4 : conformances.PublicProto {}
39+
// CHECK-END: extension conformances.A4 : conformances.PublicProto {}
4040
public struct A4: PrivateProto & PublicProto {}
4141

4242
public protocol PublicBaseProto {}
4343
private protocol PrivateSubProto: PublicBaseProto {}
4444

4545
// CHECK: public struct B1 {
46-
// CHECK-END: extension B1 : conformances.PublicBaseProto {}
46+
// CHECK-END: extension conformances.B1 : conformances.PublicBaseProto {}
4747
public struct B1: PrivateSubProto {}
4848
// CHECK: public struct B2 : conformances.PublicBaseProto {
4949
// NEGATIVE-NOT: extension conformances.B2
5050
public struct B2: PublicBaseProto, PrivateSubProto {}
5151
// CHECK: public struct B3 {
52-
// CHECK-END: extension B3 : conformances.PublicBaseProto {}
52+
// CHECK-END: extension conformances.B3 : conformances.PublicBaseProto {}
5353
public struct B3: PublicBaseProto & PrivateSubProto {}
5454
// CHECK: public struct B4 : conformances.PublicBaseProto {
55-
// NEGATIVE-NOT: extension B4 {
55+
// NEGATIVE-NOT: extension conformances.B4 {
5656
// NEGATIVE-NOT: extension conformances.B4
5757
public struct B4: PublicBaseProto {}
5858
extension B4: PrivateSubProto {}
5959
// CHECK: public struct B5 {
60-
// CHECK: extension B5 : conformances.PublicBaseProto {
61-
// NEGATIVE-NOT: extension conformances.B5
60+
// CHECK: extension conformances.B5 : conformances.PublicBaseProto {
61+
// NEGATIVE-NOT: extension B5
6262
public struct B5: PrivateSubProto {}
6363
extension B5: PublicBaseProto {}
6464
// CHECK: public struct B6 {
65-
// NEGATIVE-NOT: extension B6 {
66-
// CHECK: extension B6 : conformances.PublicBaseProto {
67-
// NEGATIVE-NOT: extension conformances.B6
65+
// NEGATIVE-NOT: extension conformances.B6 : conformances.PrivateSubProto
66+
// NEGATIVE-NOT: extension conformances.B6 {
67+
// CHECK: extension conformances.B6 : conformances.PublicBaseProto {
6868
public struct B6 {}
6969
extension B6: PrivateSubProto {}
7070
extension B6: PublicBaseProto {}
7171
// CHECK: public struct B7 {
72-
// CHECK: extension B7 : conformances.PublicBaseProto {
73-
// NEGATIVE-NOT: extension B7 {
74-
// NEGATIVE-NOT: extension conformances.B7
72+
// CHECK: extension conformances.B7 : conformances.PublicBaseProto {
73+
// NEGATIVE-NOT: extension conformances.B7 : conformances.PrivateSubProto {
74+
// NEGATIVE-NOT: extension conformances.B7 {
7575
public struct B7 {}
7676
extension B7: PublicBaseProto {}
7777
extension B7: PrivateSubProto {}
@@ -92,7 +92,7 @@ public protocol ConditionallyConformedAgain {}
9292
extension OuterGeneric: ConditionallyConformed where T: PrivateProto {}
9393
extension OuterGeneric: ConditionallyConformedAgain where T == PrivateProto {}
9494

95-
// CHECK-END: extension OuterGeneric.Inner : conformances.PublicBaseProto {}
95+
// CHECK-END: extension conformances.OuterGeneric.Inner : conformances.PublicBaseProto {}
9696
// CHECK-END: @available(*, unavailable)
9797
// CHECK-END-NEXT: extension conformances.OuterGeneric.Inner : conformances.ConditionallyConformed, conformances.ConditionallyConformedAgain where T : _ConstraintThatIsNotPartOfTheAPIOfThisLibrary {}
9898
extension OuterGeneric.Inner: ConditionallyConformed where T: PrivateProto {}
@@ -101,14 +101,14 @@ extension OuterGeneric.Inner: ConditionallyConformedAgain where T == PrivateProt
101101
private protocol AnotherPrivateSubProto: PublicBaseProto {}
102102

103103
// CHECK: public struct C1 {
104-
// CHECK-END: extension C1 : conformances.PublicBaseProto {}
104+
// CHECK-END: extension conformances.C1 : conformances.PublicBaseProto {}
105105
public struct C1: PrivateSubProto, AnotherPrivateSubProto {}
106106
// CHECK: public struct C2 {
107-
// CHECK-END: extension C2 : conformances.PublicBaseProto {}
107+
// CHECK-END: extension conformances.C2 : conformances.PublicBaseProto {}
108108
public struct C2: PrivateSubProto & AnotherPrivateSubProto {}
109109
// CHECK: public struct C3 {
110-
// NEGATIVE-NOT: extension C3 {
111-
// CHECK-END: extension C3 : conformances.PublicBaseProto {}
110+
// NEGATIVE-NOT: extension conformances.C3 {
111+
// CHECK-END: extension conformances.C3 : conformances.PublicBaseProto {}
112112
public struct C3: PrivateSubProto {}
113113
extension C3: AnotherPrivateSubProto {}
114114

@@ -122,48 +122,49 @@ public struct D1: PublicSubProto, PrivateSubProto {}
122122
// NEGATIVE-NOT: extension conformances.D2
123123
public struct D2: PrivateSubProto, PublicSubProto {}
124124
// CHECK: public struct D3 {
125-
// CHECK-END: extension D3 : conformances.PublicBaseProto {}
126-
// CHECK-END: extension D3 : conformances.PublicSubProto {}
125+
// CHECK-END: extension conformances.D3 : conformances.PublicBaseProto {}
126+
// CHECK-END: extension conformances.D3 : conformances.PublicSubProto {}
127127
public struct D3: PrivateSubProto & PublicSubProto {}
128128
// CHECK: public struct D4 {
129-
// CHECK-END: extension D4 : conformances.APublicSubProto {}
130-
// CHECK-END: extension D4 : conformances.PublicBaseProto {}
129+
// CHECK-END: extension conformances.D4 : conformances.APublicSubProto {}
130+
// CHECK-END: extension conformances.D4 : conformances.PublicBaseProto {}
131131
public struct D4: APublicSubProto & PrivateSubProto {}
132132
// CHECK: public struct D5 {
133-
// CHECK: extension D5 : conformances.PublicSubProto {
134-
// NEGATIVE-NOT: extension conformances.D5
133+
// NEGATIVE-NOT: extension conformances.D5 : conformances.PrivateSubProto {
134+
// NEGATIVE-NOT: extension conformances.D5 {
135+
// CHECK: extension conformances.D5 : conformances.PublicSubProto {
135136
public struct D5: PrivateSubProto {}
136137
extension D5: PublicSubProto {}
137138
// CHECK: public struct D6 : conformances.PublicSubProto {
138-
// NEGATIVE-NOT: extension D6 {
139+
// NEGATIVE-NOT: extension conformances.D6 {
139140
// NEGATIVE-NOT: extension conformances.D6
140141
public struct D6: PublicSubProto {}
141142
extension D6: PrivateSubProto {}
142143

143144
private typealias PrivateProtoAlias = PublicProto
144145

145146
// CHECK: public struct E1 {
146-
// CHECK-END: extension E1 : conformances.PublicProto {}
147+
// CHECK-END: extension conformances.E1 : conformances.PublicProto {}
147148
public struct E1: PrivateProtoAlias {}
148149

149150
private typealias PrivateSubProtoAlias = PrivateSubProto
150151

151152
// CHECK: public struct F1 {
152-
// CHECK-END: extension F1 : conformances.PublicBaseProto {}
153+
// CHECK-END: extension conformances.F1 : conformances.PublicBaseProto {}
153154
public struct F1: PrivateSubProtoAlias {}
154155

155156
private protocol ClassConstrainedProto: PublicProto, AnyObject {}
156157

157158
public class G1: ClassConstrainedProto {}
158159
// CHECK: public class G1 {
159-
// CHECK-END: extension G1 : conformances.PublicProto {}
160+
// CHECK-END: extension conformances.G1 : conformances.PublicProto {}
160161

161162
public class Base {}
162163
private protocol BaseConstrainedProto: Base, PublicProto {}
163164

164165
public class H1: Base, ClassConstrainedProto {}
165166
// CHECK: public class H1 : conformances.Base {
166-
// CHECK-END: extension H1 : conformances.PublicProto {}
167+
// CHECK-END: extension conformances.H1 : conformances.PublicProto {}
167168

168169
public struct MultiGeneric<T, U, V> {}
169170
extension MultiGeneric: PublicProto where U: PrivateProto {}
@@ -197,32 +198,32 @@ public struct CoolTVType: PrivateSubProto {}
197198
// CHECK: public struct CoolTVType {
198199
// CHECK-END: @available(iOS, unavailable)
199200
// CHECK-END-NEXT: @available(macOS, unavailable)
200-
// CHECK-END-NEXT: extension CoolTVType : conformances.PublicBaseProto {}
201+
// CHECK-END-NEXT: extension conformances.CoolTVType : conformances.PublicBaseProto {}
201202

202203
@available(macOS 10.99, *)
203204
public struct VeryNewMacType: PrivateSubProto {}
204205
// CHECK: public struct VeryNewMacType {
205206
// CHECK-END: @available(macOS 10.99, *)
206-
// CHECK-END-NEXT: extension VeryNewMacType : conformances.PublicBaseProto {}
207+
// CHECK-END-NEXT: extension conformances.VeryNewMacType : conformances.PublicBaseProto {}
207208

208209
public struct VeryNewMacProto {}
209210
@available(macOS 10.98, *)
210211
extension VeryNewMacProto: PrivateSubProto {}
211212
// CHECK: public struct VeryNewMacProto {
212213
// CHECK-END: @available(macOS 10.98, *)
213-
// CHECK-END-NEXT: extension VeryNewMacProto : conformances.PublicBaseProto {}
214+
// CHECK-END-NEXT: extension conformances.VeryNewMacProto : conformances.PublicBaseProto {}
214215

215216
public struct PrivateProtoConformer {}
216217
extension PrivateProtoConformer : PrivateProto {
217218
public var member: Int { return 0 }
218219
}
219220
// CHECK: public struct PrivateProtoConformer {
220-
// CHECK: extension PrivateProtoConformer {
221+
// CHECK: extension conformances.PrivateProtoConformer {
221222
// CHECK-NEXT: public var member: Swift.Int {
222223
// CHECK-NEXT: get
223224
// CHECK-NEXT: }
224225
// CHECK-NEXT: {{^}$}}
225-
// NEGATIVE-NOT: extension conformances.PrivateProtoConformer
226+
// NEGATIVE-NOT: extension conformances.PrivateProtoConformer : conformances.PrivateProto {
226227

227228
// NEGATIVE-NOT: extension {{(Swift.)?}}Bool{{.+}}Hashable
228229
// NEGATIVE-NOT: extension {{(Swift.)?}}Bool{{.+}}Equatable
@@ -238,7 +239,7 @@ public struct NestedAvailabilityOuter {
238239

239240
// CHECK-END: @available(macOS 10.97, iOS 23, *)
240241
// CHECK-END: @available(tvOS, unavailable)
241-
// CHECK-END: extension NestedAvailabilityOuter.Inner : conformances.PublicBaseProto {}
242+
// CHECK-END: extension conformances.NestedAvailabilityOuter.Inner : conformances.PublicBaseProto {}
242243

243244

244245
// CHECK-END: @usableFromInline

0 commit comments

Comments
 (0)