From 20bd48659d0009de5477380c335e2419f4c66f8b Mon Sep 17 00:00:00 2001 From: venkataram-nv Date: Mon, 12 Aug 2024 14:18:02 -0700 Subject: 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. --- source/slang/diff.meta.slang | 63 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 8 deletions(-) (limited to 'source/slang/diff.meta.slang') 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 { -- cgit v1.2.3