diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/bugs/gh-7232.slang | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/bugs/gh-7232.slang b/tests/bugs/gh-7232.slang new file mode 100644 index 000000000..041d3e880 --- /dev/null +++ b/tests/bugs/gh-7232.slang @@ -0,0 +1,59 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -dx12 +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -cpu + +// CHECK: 5 +// CHECK-NEXT: 5 +// CHECK-NEXT: 5 +// CHECK-NEXT: 1 +// CHECK-NEXT: 1 +// CHECK-NEXT: 1 +// CHECK-NEXT: 1 + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +interface IFoo +{ + property uint value { get; } +}; + +struct Foo : IFoo +{ + property uint value + { + get { return _value; } + } + + uint _value; +}; + +void issue1(Foo foo) +{ + int array[10] = {0,1,2,3,4,5,6,7,8,9}; + outputBuffer[0] = array[foo._value]; // ok + outputBuffer[1] = array[uint(foo.value)]; // ok + outputBuffer[2] = array[foo.value]; // Used to cause error, 'value' was not resolved before checking that it's an integer +} + +void issue2(Foo foo, uint arg) +{ + bool b1 = foo._value < arg; // ok + bool b2 = uint(foo.value) < arg; // ok + bool b3 = foo.value < arg; // Used to crash the compiler + bool b4 = foo.value > arg; // ok + if (b1) outputBuffer[3] = 1; + if (b2) outputBuffer[4] = 1; + if (b3) outputBuffer[5] = 1; + if (!b4) outputBuffer[6] = 1; +} + +[numthreads(1, 1, 1)] +void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) +{ + Foo foo; + foo._value = 5; + issue1(foo); + foo._value = 42; + issue2(foo, 43); +} |
