Skip to content

Commit f8d0fe2

Browse files
authored
Merge pull request #33703 from slavapestov/fix-opaque-type-decl-in-constrained-extension
ASTDemangler: Fix reconstruction of opaque result type defined in a constrained extension
2 parents 421bce3 + 76a81ef commit f8d0fe2

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

lib/AST/ASTDemangler.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -200,21 +200,16 @@ createSubstitutionMapFromGenericArgs(GenericSignature genericSig,
200200
if (!genericSig)
201201
return SubstitutionMap();
202202

203-
SmallVector<GenericTypeParamType *, 4> genericParams;
204-
genericSig->forEachParam([&](GenericTypeParamType *gp, bool canonical) {
205-
if (canonical)
206-
genericParams.push_back(gp);
207-
});
208-
if (genericParams.size() != args.size())
203+
if (genericSig->getGenericParams().size() != args.size())
209204
return SubstitutionMap();
210205

211206
return SubstitutionMap::get(
212207
genericSig,
213208
[&](SubstitutableType *t) -> Type {
214-
for (unsigned i = 0, e = genericParams.size(); i < e; ++i) {
215-
if (t->isEqual(genericParams[i]))
216-
return args[i];
217-
}
209+
auto *gp = cast<GenericTypeParamType>(t);
210+
unsigned ordinal = genericSig->getGenericParamOrdinal(gp);
211+
if (ordinal < args.size())
212+
return args[ordinal];
218213
return Type();
219214
},
220215
LookUpConformanceInModule(moduleDecl));

test/TypeDecoder/opaque_return_type.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ var prop: some P { return 0 }
1212

1313
func bar() -> some Sequence { return [] }
1414

15+
struct G<T> {}
16+
17+
extension G where T == Int {
18+
var baz: some P { return 0 }
19+
}
20+
1521
// DEMANGLE: $s18opaque_return_type3fooQryFQOyQo_
1622
// CHECK: some P
1723

@@ -21,5 +27,8 @@ func bar() -> some Sequence { return [] }
2127
// DEMANGLE: $s18opaque_return_type3barQryFQOyQo_
2228
// CHECK: some Sequence
2329

30+
// DEMANGLE: $s18opaque_return_type1GVAASiRszlE3bazQrvpQOySi_Qo_
31+
// CHECK: some P
32+
2433
// DEMANGLE: $s18opaque_return_type3barQryFQOyQo_7ElementSTQxD
2534
// CHECK: (some Sequence).Element

0 commit comments

Comments
 (0)