summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-ir-use-uninitialized-values.cpp23
-rw-r--r--tests/diagnostics/uninitialized-local-variables.slang26
-rw-r--r--tests/hlsl-intrinsic/size-of/align-of-3.slang2
-rw-r--r--tests/hlsl-intrinsic/size-of/size-of-3.slang2
4 files changed, 41 insertions, 12 deletions
diff --git a/source/slang/slang-ir-use-uninitialized-values.cpp b/source/slang/slang-ir-use-uninitialized-values.cpp
index 9780d669a..1be43591a 100644
--- a/source/slang/slang-ir-use-uninitialized-values.cpp
+++ b/source/slang/slang-ir-use-uninitialized-values.cpp
@@ -377,21 +377,24 @@ namespace Slang
}
// Check ordinary instructions
- for (auto inst = firstBlock->getFirstInst(); inst; inst = inst->getNextInst())
+ for (auto block : func->getBlocks())
{
- if (!isUninitializedValue(inst))
- continue;
+ for (auto inst = block->getFirstInst(); inst; inst = inst->getNextInst())
+ {
+ if (!isUninitializedValue(inst))
+ continue;
- IRType* type = inst->getFullType();
- if (canIgnoreType(type, nullptr))
- continue;
+ IRType* type = inst->getFullType();
+ if (canIgnoreType(type, nullptr))
+ continue;
- auto loads = getUnresolvedVariableLoads(reachability, inst);
- for (auto load : loads)
- {
- sink->diagnose(load,
+ auto loads = getUnresolvedVariableLoads(reachability, inst);
+ for (auto load : loads)
+ {
+ sink->diagnose(load,
Diagnostics::usingUninitializedVariable,
inst);
+ }
}
}
}
diff --git a/tests/diagnostics/uninitialized-local-variables.slang b/tests/diagnostics/uninitialized-local-variables.slang
index 5a2119f53..3c3dba881 100644
--- a/tests/diagnostics/uninitialized-local-variables.slang
+++ b/tests/diagnostics/uninitialized-local-variables.slang
@@ -148,4 +148,30 @@ float structs()
return result;
}
+// Warnings even in nested scopes
+float nested_scopes(int x, inout float p)
+{
+ if (x == 0)
+ {
+ float y;
+ //CHK-DAG: warning 41016: use of uninitialized variable 'y'
+ return y;
+ }
+ else if (x == 1)
+ {
+ float y;
+ //CHK-DAG: warning 41016: use of uninitialized variable 'y'
+ p = y + 1;
+
+ if (x == 2)
+ {
+ float z;
+ //CHK-DAG: warning 41016: use of uninitialized variable 'z'
+ p += z;
+ }
+ }
+
+ return 1.0;
+}
+
//CHK-NOT: warning 41016
diff --git a/tests/hlsl-intrinsic/size-of/align-of-3.slang b/tests/hlsl-intrinsic/size-of/align-of-3.slang
index 064ea48e3..28665b5ab 100644
--- a/tests/hlsl-intrinsic/size-of/align-of-3.slang
+++ b/tests/hlsl-intrinsic/size-of/align-of-3.slang
@@ -24,7 +24,7 @@ int getParamSizeWithDirection(inout uint3 v)
return alignof(v);
}
-struct TestThis
+struct TestThis : IDefaultInitializable
{
int getSize()
{
diff --git a/tests/hlsl-intrinsic/size-of/size-of-3.slang b/tests/hlsl-intrinsic/size-of/size-of-3.slang
index 26ef3f861..8a211867f 100644
--- a/tests/hlsl-intrinsic/size-of/size-of-3.slang
+++ b/tests/hlsl-intrinsic/size-of/size-of-3.slang
@@ -24,7 +24,7 @@ int getParamSizeWithDirection(inout uint3 v)
return sizeof(v);
}
-struct TestThis
+struct TestThis : IDefaultInitializable
{
int getSize()
{