From f51b74ddee7ec7104d021006575c601245814bb1 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 10 Sep 2024 08:12:36 -0700 Subject: Fix inccorect dropping of declref during Unification of DeclaredSubtypeWitness. (#5041) * Fix inccorect dropping of declref during Unification of DeclaredSubtypeWitness. * Add extension test. --- .../nested-gen-value-param-inference-2.slang | 41 ++++++++++++++++++++++ .../nested-gen-value-param-inference.slang | 32 +++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 tests/language-feature/generics/nested-gen-value-param-inference-2.slang create mode 100644 tests/language-feature/generics/nested-gen-value-param-inference.slang (limited to 'tests') diff --git a/tests/language-feature/generics/nested-gen-value-param-inference-2.slang b/tests/language-feature/generics/nested-gen-value-param-inference-2.slang new file mode 100644 index 000000000..038329e87 --- /dev/null +++ b/tests/language-feature/generics/nested-gen-value-param-inference-2.slang @@ -0,0 +1,41 @@ +//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -shaderobj -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type + +interface IValueGeneric {} +struct ValGenericImpl : IValueGeneric {} + +struct NestedValueGeneric> +{ + int x; +} + +void acceptor>(NestedValueGeneric x) +{ + outputBuffer[0] = D + x.x; +} + +extension> NestedValueGeneric +{ + void foo() + { + acceptor(this); + } +} +void test2(NestedValueGeneric<2, ValGenericImpl<2>> x) +{ + // 'foo' should be a member of 'NestedValueGeneric<2, ValGenericImpl<2>>' through + // the extension above. + x.foo(); +} + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + NestedValueGeneric<2, ValGenericImpl<2>> x; + x.x = 1; + test2(x); + // CHECK: 3 +} \ No newline at end of file diff --git a/tests/language-feature/generics/nested-gen-value-param-inference.slang b/tests/language-feature/generics/nested-gen-value-param-inference.slang new file mode 100644 index 000000000..cf7e5faf8 --- /dev/null +++ b/tests/language-feature/generics/nested-gen-value-param-inference.slang @@ -0,0 +1,32 @@ +//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -shaderobj -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-vk -compute -shaderobj -output-using-type + +interface IValueGeneric {} +struct ValGenericImpl : IValueGeneric {} + +struct NestedValueGeneric> +{ + int x; +} + +void acceptor>(NestedValueGeneric x) +{ + outputBuffer[0] = D + x.x; +} +void test(NestedValueGeneric<2, ValGenericImpl<2>> x) +{ + // Test that we can correctly infer acceptor.D and acceptor.S from `x`. + acceptor(x); +} + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + NestedValueGeneric<2, ValGenericImpl<2>> x; + x.x = 1; + test(x); + // CHECK: 3 +} \ No newline at end of file -- cgit v1.2.3