diff options
| -rw-r--r-- | source/slang/slang-ir-use-uninitialized-values.cpp | 23 | ||||
| -rw-r--r-- | tests/diagnostics/uninitialized-local-variables.slang | 26 | ||||
| -rw-r--r-- | tests/hlsl-intrinsic/size-of/align-of-3.slang | 2 | ||||
| -rw-r--r-- | tests/hlsl-intrinsic/size-of/size-of-3.slang | 2 |
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() { |
