Avatar
Avatar
shiz
調べてみました。 1. var x を通常の関数引数に渡す場合がどうなってるか coerceCallArgumentsの中でRValueにしているようでした。 https://github.com/swiftlang/swift/blob/e22c09c05546bc638169da0dfc8c8996f160f168/lib/Sema/CSApply.cpp#L8399 (argument (declref_expr type="@lvalue Int" location=79078.swift:19:6(argument (load_expr implicit type="Int" location=79078.swift:19:6 に変わります。クロージャ(例えば、var a = {})も同じでした。 2. coerceToRValue はっきりとこの場合だというのはわからなかったのですが、参照を実態化するために使われているようです。Exprを新しく生成(Rewrite)するときに必要なのかなあ?と思いました 3. withoutActuallyEscaping The body closure receives a copy of the argument closure that is temporarily made @escaping. とコピーが渡されていることを想定していることからも、RValueが期待されているのかなと思いました。 https://github.com/swiftlang/swift/blob/3787044e8349bf4933ae43f16cbbb44344785e04/lib/Sema/TypeOfReference.cpp#L2245 そうすると、LValueをRValueに変換し忘れていたということかと思うのですが、一個気になるのが、sendingconsumingは比較的新しいものの、 inout でもクラッシュするのは、なんで今まで誰も気づかなかったのかという点ですね...w (あるいはユースケースがないから放置されていたのか...) func send( operation: inout () async -> Void ) async { _ = await withoutActuallyEscaping(operation) { escapingClosure in await escapingClosure() } }
omochimetaru 2/8/2025 12:52 AM
古いコンパイラでもダメなのか気になりますね var、inout、sending全部でテストケース足しておきましょう
👍🏻 1
12:53 AM
気づかれてないんだと思いますよ
12:53 AM
woAEはそもそも型チェックが専用実装で特別だし、使う場所もかなり限られてるし、それをinoutでつかわんし。 (edited)
12:55 AM
coerce to RVは単にセマンティクスとして「値」を求められてる時に常に事前に呼ぶってことじゃないかなあ
12:56 AM
言語仕様としてはLVは暗黙にRVになるけど、コンパイラ内部では明示的に変換するスタイルなんじゃないすかね
12:56 AM
生成されるコードという意味では命令生成が必要だったりもするし。
t_naruhodo 1