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 /source/slang/diff.meta.slang | |
| 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 'source/slang/diff.meta.slang')
| -rw-r--r-- | source/slang/diff.meta.slang | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/source/slang/diff.meta.slang b/source/slang/diff.meta.slang index c912e026c..a4c468ef7 100644 --- a/source/slang/diff.meta.slang +++ b/source/slang/diff.meta.slang @@ -273,7 +273,12 @@ struct TensorView __subscript(uint index) -> T { [ForceInline] [__NoSideEffect] get { return load(index); } - [ForceInline] set { store(index, newValue); } + + [ForceInline] set + { + unmodified(this); + store(index, newValue); + } [__NoSideEffect] ref @@ -288,7 +293,13 @@ struct TensorView __subscript(uint i1, uint i2) -> T { [ForceInline] [__NoSideEffect] get { return load(i1, i2); } - [ForceInline] set { store(i1, i2, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i1, i2, newValue); + } + [__NoSideEffect] ref { @@ -302,7 +313,13 @@ struct TensorView __subscript(uint2 i) -> T { [ForceInline] [__NoSideEffect] get { return load(i.x, i.y); } - [ForceInline] set { store(i.x, i.y, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i.x, i.y, newValue); + } + [__NoSideEffect] ref { @@ -316,7 +333,13 @@ struct TensorView __subscript(uint i1, uint i2, uint i3) -> T { [ForceInline] [__NoSideEffect] get { return load(i1, i2, i3); } - [ForceInline] set { store(i1, i2, i3, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i1, i2, i3, newValue); + } + [__NoSideEffect] ref { @@ -330,7 +353,13 @@ struct TensorView __subscript(uint3 i) -> T { [ForceInline] [__NoSideEffect] get { return load(i.x, i.y, i.z); } - [ForceInline] set { store(i.x, i.y, i.z, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i.x, i.y, i.z, newValue); + } + [__NoSideEffect] ref { @@ -344,7 +373,13 @@ struct TensorView __subscript(uint i1, uint i2, uint i3, uint i4) -> T { [ForceInline] [__NoSideEffect] get { return load(i1, i2, i3, i4); } - [ForceInline] set { store(i1, i2, i3, i4, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i1, i2, i3, i4, newValue); + } + [__NoSideEffect] ref { @@ -358,7 +393,13 @@ struct TensorView __subscript(uint4 i) -> T { [__NoSideEffect][ForceInline] get { return load(i.x, i.y, i.z, i.w); } - [ForceInline] set { store(i.x, i.y, i.z, i.w, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i.x, i.y, i.z, i.w, newValue); + } + [__NoSideEffect] ref { @@ -372,7 +413,13 @@ struct TensorView __subscript(uint i1, uint i2, uint i3, uint i4, uint i5) -> T { [ForceInline] [__NoSideEffect] get { return load(i1, i2, i3, i4, i5); } - [ForceInline] set { store(i1, i2, i3, i4, i5, newValue); } + + [ForceInline] set + { + unmodified(this); + store(i1, i2, i3, i4, i5, newValue); + } + [__NoSideEffect] ref { |
