diff options
| author | venkataram-nv <vedavamadath@nvidia.com> | 2024-08-12 14:18:02 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-12 14:18:02 -0700 |
| commit | 20bd48659d0009de5477380c335e2419f4c66f8b (patch) | |
| tree | 1b5df96436eaea9adbe5ef524b39fe6da4697387 /tests/diagnostics | |
| parent | 9b580e58417a77109617804362be872f05885f23 (diff) | |
Warn when inout parameter is never written (#4777)
Addresses #4698 as one approach to diagnose the potential problem.
Emit warnings when a user marks a parameter as `inout` but never writes to it in the function. A new intrinsic function `unmodified(out T)` has been added to explicitly indicate that an `inout` variable will not be modified in the function.
This is only one way to address the specific validation error in #4698. In general it seems that DXC does some more extensive checks on actual struct fields (as opposed to observing arbitrary struct writes), so that will be the next step.
Diffstat (limited to 'tests/diagnostics')
| -rw-r--r-- | tests/diagnostics/inout-never-written.slang | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/diagnostics/inout-never-written.slang b/tests/diagnostics/inout-never-written.slang new file mode 100644 index 000000000..0bc59ecf3 --- /dev/null +++ b/tests/diagnostics/inout-never-written.slang @@ -0,0 +1,48 @@ +//TEST:SIMPLE(filecheck=CHK): -target spirv + +struct State +{ + float3 v; + float3 n; + int rnd; +}; + +//CHK-DAG: ([[# @LINE + 1]]): warning 41022: inout parameter 'x' is never written to +void int_never_assigned(inout int x) {} + +//CHK-DAG: ([[# @LINE + 1]]): warning 41022: inout parameter 'state' is never written to +void state_never_assigned(inout State state, inout float v) +{ + v = state.v.x; +} + +void state_assigned(inout State state) +{ + state.rnd = (int) dot(state.v, state.n); +} + +struct A +{ + int state; + + //CHK-DAG: ([[# @LINE + 1]]): warning 41023: method marked `[mutable]` but never modifies `this` + [mutating] int next() { return state; } + + [mutating] int progress() + { + unmodified(state); + return state; + } +}; + +__generic <T> +struct B +{ + int state; + + //CHK-DAG: ([[# @LINE + 1]]): warning 41023: method marked `[mutable]` but never modifies `this` + [mutating] int next() { return state; } +}; + +//CHK-NOT: warning 41022 +//CHK-NOT: warning 41023
\ No newline at end of file |
