Skip to content

Commit 08a89b2

Browse files
[ModuleInterface] Print full type if ambiguous for extensions.
The patch introduces a new setting instead of changing existing settings because the generated interfaces in the IDE have slightly different requirements; the extended type there is unconditionally not printed qualified (even if it is ambiguous). This is likely because the ambiguity heuristic is very weak; it doesn't even do name lookup. Simplifying that logic would be nice, but then we'd need to update a bunch of IDE/print* tests and end up with more more visual clutter in the IDE. Introducing the new setting means we can change the behavior for swiftinterface files without affecting the behavior for IDE interfaces. Fixes rdar://79093752. (cherry picked from commit 02afb9d)
1 parent 5190907 commit 08a89b2

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)