summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-ir-use-uninitialized-values.cpp1
-rw-r--r--tests/diagnostics/inout-never-written.slang28
2 files changed, 28 insertions, 1 deletions
diff --git a/source/slang/slang-ir-use-uninitialized-values.cpp b/source/slang/slang-ir-use-uninitialized-values.cpp
index b8dfcc33c..8b940d30d 100644
--- a/source/slang/slang-ir-use-uninitialized-values.cpp
+++ b/source/slang/slang-ir-use-uninitialized-values.cpp
@@ -110,6 +110,7 @@ namespace Slang
case kIROp_FieldAddress:
case kIROp_GetElement:
case kIROp_GetElementPtr:
+ case kIROp_InOutImplicitCast:
return true;
default:
break;
diff --git a/tests/diagnostics/inout-never-written.slang b/tests/diagnostics/inout-never-written.slang
index 0bc59ecf3..f4d4bce7e 100644
--- a/tests/diagnostics/inout-never-written.slang
+++ b/tests/diagnostics/inout-never-written.slang
@@ -44,5 +44,31 @@ struct B
[mutating] int next() { return state; }
};
+// Sometimes an inOutImplicitCast is done,
+// this needs to be tracked as an alias;
+// none of the following functions should
+// generate warnings
+uint lcg(inout uint prev)
+{
+ const uint LCG_A = 1664525u;
+ const uint LCG_C = 1013904223u;
+ prev = (LCG_A * prev + LCG_C);
+ return prev & 0x00FFFFFF;
+}
+
+float rnd(inout uint prev)
+{
+ return ((float) lcg(prev) / (float) 0x01000000);
+}
+
+float3 sample(inout int seed)
+{
+ float3 xi;
+ xi.x = rnd(seed);
+ xi.y = rnd(seed);
+ xi.z = rnd(seed);
+ return xi.z;
+}
+
//CHK-NOT: warning 41022
-//CHK-NOT: warning 41023 \ No newline at end of file
+//CHK-NOT: warning 41023