diff options
| author | Jay Kwak <82421531+jkwak-work@users.noreply.github.com> | 2025-01-23 00:06:21 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-23 00:06:21 -0800 |
| commit | a9ce7520e5f1b97b09e5de69455258bef55e10d2 (patch) | |
| tree | ab9af31ba0a52cd4dd245e19fa4323864286f551 /tests | |
| parent | 8000e0ede34e920cc7f37d69a335d74a472eff42 (diff) | |
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.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/diagnostics/uninitialized-generic.slang | 30 | ||||
| -rw-r--r-- | tests/diagnostics/uninitialized-local-variables.slang | 9 |
2 files changed, 35 insertions, 4 deletions
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<float> outputBuffer; + +groupshared float4 gsVar; + +__generic<TYPE1 : __BuiltinArithmeticType> +struct MyContainer +{ + __generic<TYPE2 : __BuiltinArithmeticType> + void store(__ref vector<TYPE2,4> 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<float> 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> 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 |
