Skip to content

Commit 66effa4

Browse files
committed
[Concurrency] Teach Type::stripConcurrency to handle generic arguments
1 parent d270dad commit 66effa4

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

lib/AST/Type.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,25 @@ Type TypeBase::stripConcurrency(bool recurse, bool dropGlobalActor) {
11091109
return Type(this);
11101110
}
11111111

1112+
if (auto *BGT = getAs<BoundGenericType>()) {
1113+
if (!recurse)
1114+
return Type(this);
1115+
1116+
bool anyChanged = false;
1117+
SmallVector<Type, 2> genericArgs;
1118+
llvm::transform(BGT->getGenericArgs(), std::back_inserter(genericArgs),
1119+
[&](Type argTy) {
1120+
auto newArgTy =
1121+
argTy->stripConcurrency(recurse, dropGlobalActor);
1122+
anyChanged |= !newArgTy->isEqual(argTy);
1123+
return newArgTy;
1124+
});
1125+
1126+
return anyChanged ? BoundGenericType::get(BGT->getDecl(), BGT->getParent(),
1127+
genericArgs)
1128+
: Type(this);
1129+
}
1130+
11121131
return Type(this);
11131132
}
11141133

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %target-swift-emit-silgen %s -verify -swift-version 5 | %FileCheck %s
2+
3+
// REQUIRES: concurrency
4+
5+
// Test erasure in generic arguments
6+
do {
7+
struct S<T> {
8+
}
9+
10+
@preconcurrency func test(_: S<any Sendable>) {}
11+
// CHECK-LABEL: sil private [ossa] @$s31sendable_preconcurrency_erasure4testL_yyAA1SL_VyypGF
12+
@preconcurrency func test(_: S<Array<@Sendable () -> Void>>) {}
13+
// CHECK-LABEL: sil private [ossa] @$s31sendable_preconcurrency_erasure4testL0_yyAA1SL_VySayyycGGF
14+
}

0 commit comments

Comments
 (0)