From 936c22a9a938744eb43c310dd82c9c6944f79e87 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 10 Sep 2024 08:13:21 -0700 Subject: Specialize existential return types when possible. (#5044) * Fix inccorect dropping of declref during Unification of DeclaredSubtypeWitness. * Add extension test. * Specialize existential return types when possible. * Fix. * Fix. * Fix falcor issue. --- .../generics/generic-return-type-requirement.slang | 39 ++++++++++++++++++++++ .../interfaces/default-construct-conformance.slang | 8 ++--- 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 tests/language-feature/generics/generic-return-type-requirement.slang (limited to 'tests') diff --git a/tests/language-feature/generics/generic-return-type-requirement.slang b/tests/language-feature/generics/generic-return-type-requirement.slang new file mode 100644 index 000000000..945afd808 --- /dev/null +++ b/tests/language-feature/generics/generic-return-type-requirement.slang @@ -0,0 +1,39 @@ +//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 +//TEST:SIMPLE(filecheck=HLSL): -target hlsl -profile cs_6_0 -entry computeMain + +// HLSL-NOT: AnyValue + +interface IStack +{ + __generic + IStack popN(); + + int get(); +} +struct StackImpl : IStack +{ + // We should be able to specialize the callsites of this function to use + // the concrete type instead of resorting to dynamic dispatch. + __generic + IStack popN() { return StackImpl(); } + + int get() { return D; } +} + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +int test>(S stack) +{ + return stack.popN<2>().get(); +} + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID : SV_DispatchThreadID) +{ + StackImpl<5> stack; + + // CHECK: 2 + outputBuffer[0] = test(stack); +} diff --git a/tests/language-feature/interfaces/default-construct-conformance.slang b/tests/language-feature/interfaces/default-construct-conformance.slang index 00778a9f6..4a6aed869 100644 --- a/tests/language-feature/interfaces/default-construct-conformance.slang +++ b/tests/language-feature/interfaces/default-construct-conformance.slang @@ -36,22 +36,18 @@ struct TestAny : ITest uint getValue() { return value; } } -// CHECK: Tuple{{.*}} makeTest0{{.*}}() -// CHECK: Tuple{{.*}} = { uint2(0U, 0U), uint2(0U, 0U), packAnyValue4{{.*}} }; ITest makeTest0() { return Test0(); } -// CHECK: Tuple{{.*}} makeTest1{{.*}}() -// CHECK: Tuple{{.*}} = { uint2(0U, 0U), uint2(1U, 0U), packAnyValue4{{.*}} }; ITest makeTest1() { return Test1(); } -// CHECK: Tuple{{.*}} makeTestAny{{.*}}() -// CHECK: Tuple{{.*}} = { uint2(0U, 0U), uint2(2U, 0U), packAnyValue4{{.*}} }; +// CHECK: TestAny{{.*}} makeTestAny{{.*}}() +// CHECK: return TestAny_{{.*}}init{{.*}}() ITest makeTestAny() { return TestAny(); -- cgit v1.2.3