Open adamkuipers opened 9 months ago
CC: @jckarter @kavon
Possibly related, here is the first bug I was debugging before I discovered the crash:
struct Node<Value>: ~Copyable {
var next: NodePointer<Value>
var prev: NodePointer<Value>
var value: Value
}
enum MaybeNode<Value>: ~Copyable {
case some(Node<Value>)
case none
mutating func take() -> Self {
let old = self
self = .none
return old
}
}
final class NodePointer<Value> {
var node: MaybeNode<Value>
init(_ node: consuming Node<Value>) {
self.node = .some(node)
}
func consume() -> Node<Value> {
guard case .some(let node) = node.take() else {
fatalError("Can't consumed value already taken.")
}
return node
}
}
This fails to compile giving the following message:
swift:26:43: error: cannot partially consume 'unknown'
guard case .some(let node) = node.take() else {
^
error: fatalError
Like the crash, this builds fine when the types are not generic
Description
When pattern matching a generic noncopyable enum, the nightly toolchain's swift-frontend crashes. The Xcode 15.1 default toolchain just hangs indefinitely.
If the enum is not generic with a copyable type (e.g., Int) then the code compiles as expected.
If the enum is not generic with a noncopyable type (e.g.,
struct NoCopy: ~Copyable {}
) the the compiler fails with the following:I came to this error while debugging a what I presume to be another and related ownership compiler bug. Where there would be a partial consumption error pointed to the take() callsite.
Reproduction
Build with
$NIGHTLY_TOOLCHAIN/swift-frontend -frontend -c LinkedHashMap.swift
As mentioned in the description, if built with a release toolchain (e.g., Xcode default) it just hangs indefinitely.
Stack dump
Expected behavior
I'd expect this to compile. If my understanding of noncopyable types is correct then there should be no ownership issues, just as how it succeeds if one replaces T with Int.
Environment
Additional information
No response