diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/language-feature/generics/generic-return-type-requirement.slang | 39 | ||||
| -rw-r--r-- | tests/language-feature/interfaces/default-construct-conformance.slang | 8 |
2 files changed, 41 insertions, 6 deletions
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<let D : int> +{ + __generic<let N : int> + IStack<D - N> popN(); + + int get(); +} +struct StackImpl<let D : int> : IStack<D> +{ + // We should be able to specialize the callsites of this function to use + // the concrete type instead of resorting to dynamic dispatch. + __generic<let N : int> + IStack<D - N> popN() { return StackImpl<D-N>(); } + + int get() { return D; } +} + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +int test<int D, S : IStack<D>>(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(); |
