summaryrefslogtreecommitdiffstats
path: root/tests/bugs/overload-ambiguous-2.slang
blob: 785db7b31ff3caed2cd00ad38853ae6e4bbf58ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// https://github.com/shader-slang/slang/issues/4476

//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cuda -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cpu -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj

//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
RWStructuredBuffer<uint> outputBuffer;

namespace A
{
    struct Struct1<let SIZE : uint>
    {
        uint data;
    };

    Struct1<Z1> myFunc<let Z0 : uint, let Z1 : uint>(Struct1<Z0> inputS1)
    {
        Struct1<Z1> s1;
        s1.data = inputS1.data + 2U;
        return s1;
    }
};


A::Struct1<Z1> myFunc<let Z0 : uint, let Z1 : uint>(A::Struct1<Z0> inputS1)
{
    A::Struct1<Z1> s1;
    s1.data = inputS1.data + 5U;
    return s1;
}

namespace A
{
    struct Struct2<let SIZE : uint>
    {
        Struct1<SIZE> s1;
    }

    Struct2<Z1> myFunc<let Z0 : uint, let Z1 : uint>(Struct2<Z0> inputS2)
    {
        Struct2<Z1> s2;
        // We want to cover a corner case in our compiler where:
        // when looking up "myFunc", the compiler should find
        //   Struct1<Z1> A::myFunc<let Z0 : uint, let Z1 : uint>(Struct1<Z0> inputS1)
        // and it won't be ambiguous with the global "myFunc".
        s2.s1 = myFunc<Z0, Z1>(inputS2.s1);
        return s2;
    }
};

[numthreads(1, 1, 1)]
[shader("compute")]
void computeMain(uint3 threadID: SV_DispatchThreadID)
{
    using namespace A;

    Struct2<10> input = {{threadID.x}};

    Struct2<20> output;
    output = myFunc<10, 20>(input);
    outputBuffer[0] = output.s1.data;

    // BUF: 2
}