Skip to content

Commit 04158dc

Browse files
committed
[ExistentialSpecializer] Move-only must consume.
Bail on non-consuming existential values which are move-only. Existential specialization requires creating a copy in such cases and that's illegal for move-only values.
1 parent 972c22f commit 04158dc

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

lib/SILOptimizer/FunctionSignatureTransforms/ExistentialSpecializer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,14 @@ bool ExistentialSpecializer::canSpecializeExistentialArgsInFunction(
190190
if (paramInfo.isIndirectMutating())
191191
continue;
192192

193+
// The ExistentialSpecializerCloner copies the incoming generic argument
194+
// into an existential if it is non-consuming (if it's consuming, it's
195+
// moved into the existential via `copy_addr [take]`). Introducing a copy
196+
// of a move-only value isn't legal.
197+
if (!paramInfo.isConsumed() &&
198+
paramInfo.getSILStorageInterfaceType().isMoveOnly())
199+
continue;
200+
193201
ETAD.AccessType = paramInfo.isConsumed()
194202
? OpenedExistentialAccess::Mutable
195203
: OpenedExistentialAccess::Immutable;

0 commit comments

Comments
 (0)