Avatar
omochimetaru 2/7/2025 12:21 AM
なんですが・・・
12:21 AM
func send( operation: consuming @escaping () async -> Void ) async { await withoutActuallyEscaping(operation) { (_) in } }
12:21 AM
↑これでもクラッシュすることを見つけました
12:22 AM
そうするとこれはsendingの問題じゃなくて
12:23 AM
consumingによるlvalueの問題なのかもしれません
12:23 AM
sending関係でバグってるのはsendingがimplicit copyable consumingになるからで、間接的な理由でしかない (edited)
12:24 AM
さらに見つけたぞ
12:24 AM
func send( operation: consuming @escaping () async -> Void ) async { let x = operation await withoutActuallyEscaping(x) { (_) in } } ↑これはコンパイルできるのに
12:24 AM
func send( operation: consuming @escaping () async -> Void ) async { var x = operation await withoutActuallyEscaping(x) { (_) in } } ↑これはクラッシュします
12:25 AM
var x は、内部で lvalue として扱われるはずなので、
12:25 AM
問題はconsumingにあるのではなく lvalue を渡すと壊れる場所のほうにあるのではないか
12:25 AM
var x を lvalue 扱いするのが間違いってことはないはずなんで。
12:26 AM
そうなってくると、rvalueを要求してる場所にlvalueを渡してるのがバグで、rvalueにcoerceするのが正解ってだけなんじゃないか・・・?