diff --git a/source/slang/slang-ir-use-uninitialized-values.cpp b/source/slang/slang-ir-use-uninitialized-values.cpp index b1db2913e3..51de2117cf 100644 --- a/source/slang/slang-ir-use-uninitialized-values.cpp +++ b/source/slang/slang-ir-use-uninitialized-values.cpp @@ -139,13 +139,6 @@ static bool isDifferentiableFunc(IRInst* func) return false; } -static IRInst* resolveSpecialization(IRSpecialize* spec) -{ - IRInst* base = spec->getBase(); - IRGeneric* generic = as(base); - return findInnerMostGenericReturnVal(generic); -} - // The `upper` field contains the struct that the type is // is contained in. It is used to check for empty structs. static bool canIgnoreType(IRType* type, IRType* upper) @@ -174,6 +167,10 @@ static bool canIgnoreType(IRType* type, IRType* upper) if (as(type)) return true; + // We don't know what type it will be yet. + if (as(type)) + return true; + // For pointers, check the value type (primarily for globals) if (auto ptr = as(type)) { @@ -188,7 +185,7 @@ static bool canIgnoreType(IRType* type, IRType* upper) // In the case of specializations, check returned type if (auto spec = as(type)) { - IRInst* inner = resolveSpecialization(spec); + IRInst* inner = getResolvedInstForDecorations(spec); IRType* innerType = as(inner); return canIgnoreType(innerType, upper); } @@ -231,7 +228,7 @@ static InstructionUsageType getCallUsageType(IRCall* call, IRInst* inst) IRFunc* ftn = nullptr; IRFuncType* ftype = nullptr; if (auto spec = as(callee)) - ftn = as(resolveSpecialization(spec)); + ftn = as(getResolvedInstForDecorations(spec)); // Differentiable functions are mostly ignored, treated as having inout parameters else if (as(callee)) diff --git a/tests/diagnostics/uninitialized-generic.slang b/tests/diagnostics/uninitialized-generic.slang new file mode 100644 index 0000000000..2d6ccd45bb --- /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 f7a8ff2c7e..9ade4591ac 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