From a9ce7520e5f1b97b09e5de69455258bef55e10d2 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Thu, 23 Jan 2025 00:06:21 -0800 Subject: Fix incorrect resolve of specialization instance (#6162) * Fix incorrect resolve of specialization instance While checking the uninitialized variables, we were not resolving the specialized instance correctly. This commit repeats the resolve while the result is a specialization instance. A new test is added for this: tests/diagnostics/uninitialized-generic.slang After the problem is fixed, it revealed another problem in existing tests: tests/compute/nested-generics2.slang tests/diagnostics/uninitialized-local-variables.slang When a struct has a member variable whose type is a generic type, we cannot iterate over its member variables yet, because the type is unknown until the generic function/struct is specialized. We will have to give up checking for these cases. --- tests/diagnostics/uninitialized-generic.slang | 30 ++++++++++++++++++++++ .../uninitialized-local-variables.slang | 9 ++++--- 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 tests/diagnostics/uninitialized-generic.slang (limited to 'tests') diff --git a/tests/diagnostics/uninitialized-generic.slang b/tests/diagnostics/uninitialized-generic.slang new file mode 100644 index 000000000..2d6ccd45b --- /dev/null +++ b/tests/diagnostics/uninitialized-generic.slang @@ -0,0 +1,30 @@ +//TEST:SIMPLE(filecheck=CHK): -target spirv -entry computeMain + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +groupshared float4 gsVar; + +__generic +struct MyContainer +{ + __generic + void store(__ref vector v) + { + v[0] = TYPE2(0); + v[1] = TYPE2(1); + v[2] = TYPE2(2); + v[3] = TYPE2(3); + } +}; + +[Shader("compute")] +[NumThreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID : SV_DispatchThreadID) +{ + MyContainer obj; + obj.store(gsVar); + + // CHK-NOT:warning 41017: + outputBuffer[0] = gsVar.x; +} diff --git a/tests/diagnostics/uninitialized-local-variables.slang b/tests/diagnostics/uninitialized-local-variables.slang index f7a8ff2c7..9ade4591a 100644 --- a/tests/diagnostics/uninitialized-local-variables.slang +++ b/tests/diagnostics/uninitialized-local-variables.slang @@ -38,13 +38,14 @@ int use_undefined_value(int k) return x; } -// Returning uninitialized values +// We don't know the exact type of T yet. +// T may not have any members, and it may not need any initialization. __generic T generic_undefined_return() { - T x; - //CHK-DAG: warning 41016: use of uninitialized variable 'x' - return x; + T y; + //CHK-NOT: warning 41016: use of uninitialized variable 'y' + return y; } // Array variables -- cgit v1.2.3