Repository navigation
ネイティブ整数の定数を無効な型として断つ - #253
Merged
Merged
Conversation
PRレビュー / PR review変更 4 ファイル、コミット 3 件。 / 4 files, 3 commits. 検証の要否 / Verification required以下を走らせ、失敗した試験の名前と失敗の様子を変更前と突き合わせてください。総数だけで判断しないでください。 dotnet build ComputeWeave.sln -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests.SourceGenerators/ComputeWeave.Tests.SourceGenerators.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests.Internals/ComputeWeave.Tests.Internals.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests/ComputeWeave.Tests.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests.DeviceLost/ComputeWeave.Tests.DeviceLost.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.D2D1.Tests.SourceGenerators/ComputeWeave.D2D1.Tests.SourceGenerators.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.D2D1.Tests/ComputeWeave.D2D1.Tests.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.D2D1.Tests.AssemblyLevelAttributes/ComputeWeave.D2D1.Tests.AssemblyLevelAttributes.csproj -c Release -p:Platform=x64ビルドエラーを出す診断を変えた場合は、アナライザーの試験に加えて解全体の検証が要ります。 慎重を要する箇所 / Guarded areas touched
寿命の追跡と危険の追跡は別々の保証です。一方を保っても他方が保たれるとは限りません。 確認できた点 / Confirmed
これは自動の確認で、査読の代わりにはなりません。指摘は判断の材料であって、従う義務はありません。 |
routersys
force-pushed
the
dev/ComputeWeave.NativeIntegerConstants
branch
from
September 15, 2026 11:51
0f4db0e to
577ee38
Compare
This was referenced Sep 15, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary / 概要
nintとnuintの定数を、型集合の外の型として断ちます。PR #248 はlongとulongの定数を、値が64ビットの整数であることで見分けて断ちました。ネイティブ整数の定数は C# が値を32ビットの範囲に限るため32ビットの整数として箱詰めされ、値だけを見る判定はintの定数と見分けられず、桁をそのまま#defineへ書き出していました。シェーダーはそれを32ビットで計算し、C# は x64 の工程で64ビットで計算するので、32ビットを越える結果が食い違います。定数に HLSL のリテラルが在るかを決める関数が、値に加えて定数の型を受け取るようにし、ネイティブ整数の型なら値を見ずにリテラル無しと答えます。定数を定義へ書き出す補助メソッドは、これまでどおりリテラルの無い定数の型を追跡します。報告は局所変数と
longの定数と同じCMPW0050、Direct2D 側はCMPWD2D0041です。これで定数の型の族は閉じます。bool、char、8ビットと16ビットの整数、int、uint、float、double、decimalは書き出し、long、ulong、nint、nuint、文字列は断ちます。Linked issue / 関連する課題
Closes #251
Kind / 種別
Behavior change / 挙動の変更
nintかnuintの定数を持つシェーダーは、ビルドが止まるようになります。既定の重大度はエラーです。次の表は、土台のmain(c050699d)とこの枝で計算側の生成器を直に動かして測ったものです。名前とメンバーアクセスの2行は足した回帰試験が固定しています。const nintを名前で読むCMPW0050const nuintをメンバーアクセスで読むCMPW0050const nintCMPW0050(float)OwnCMPW0050const nintCMPW0125CMPW0125とCMPW0050nintの局所変数CMPW0050装置では、
const nint Own = 5とint.MaxValueの和と積、const nuintとuint.MaxValueの和を実機と WARP で読みました。C# の値は 2147483648、10737418240、4294967296、装置の値は -2147483648、2147483648、4 で、装置の3つは32ビットで折り返した整数を単精度へ丸めたものです。このリポジトリのシェーダーには
nintとnuintの定数がありません。const nintとconst nuintの宣言は足した試験の雛形の中だけです。変わる経路はその型の定数だけなので、生成物は変わりません。公開 API は変わりません。
Verification / 検証
生成器の2本を枝の先端
577ee38fでビルドし直して走らせました。判定は失敗した試験の名前で行い、失敗は0件です。土台の値は
c050699dの CI と PR #248 の手元の値で、567 と 234 です。増えた2件と1件が足した回帰試験です。他のスイートはこの変更が触れるコードを通らず、CI が回します。変異
実装をコミットしてから、型の判定を定数の型では決して真にならない述語へ替える変異を当て、足した試験だけを両方の生成器で回しました。判定を外す形は到達しない符号の警告で建たないので、この形にしています。計算側は
nintとnuintの2行が落ち、Direct2D 側はnintの1行が落ち、longの行と断たない側の行は落ちません。対照は変異なしで失敗0件です。Adapter and driver tested / 試したアダプターとドライバー: Intel(R) Iris(R) Xe Graphics, 32.0.101.7085、および WARP
なぜ型で見分けるのか
PR #248 は値の種類で見分けました。64ビットの整数は値がそう箱詰めされるからです。ネイティブ整数の定数は値が
intと同じ形で箱詰めされるので、値では見分けられません。C# の定数式がnintを32ビットの範囲に限ることを確かめたうえで、この1つだけは定数の型で見分けます。どの定数にリテラルが在るかの判断を1つの関数に置いたままにするため、その関数へ型を渡す形にし、呼ぶ側に条件を足す形は採りませんでした。判定を型へ全部寄せる形は退けました。8ビットと16ビットの整数の定数は型が集合の外でも C# が演算のたびにintへ広げるので値は同じで、charの定数はintへ、decimalの定数は浮動小数点の綴りへ書き出す既存の扱いがあり、型だけで見ると受け入れている定数まで断ってしまうためです。測っていないこと
Direct2D 側の装置での値は読んでいません。利用者のシェーダーにこの形がどれだけ在るかは分かりません。
走らせていないスイート
生成器の2本以外は手元で走らせていません。この変更が触れるのは定数のフィールドの型の判定1つで、リポジトリのシェーダーにその型の定数は無く、CI が8本を回します。
Checklist / 確認
If this touches a guarded area / 慎重を要する箇所に触れる場合
Notes for the reviewer / 査読者への注記
コミットは3つです。断りを足すもの、試験を足すもの、台帳の行を足すものの順です。定数のリテラルを決める関数に型の引数と判定を1つ足しただけで、書き出す側の経路は変わっていません。
解全体のビルドは、この機械では資源で落ちるのでプロジェクトを1本ずつビルドしています。11のプロジェクトすべてを枝の先端でビルドし直し、警告0、誤り0でした。