diff options
| author | Yong He <yonghe@outlook.com> | 2020-07-16 13:09:17 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-16 13:09:17 -0700 |
| commit | 62079c534407abe300d24a6d759641779e48bc67 (patch) | |
| tree | e00e89f76194493e5ba425c866a8e59a5fd1925c /tests | |
| parent | 5758d16612eda0f902d7d4c02535afe44dec2ac2 (diff) | |
Support associatedtype local variables and return values in dynamic dispatch code (#1444)
* Refactor lower-generics pass into separate subpasses.
* IR pass to generate witness table wrappers.
* Support associatedtype local variables and return values in dynamic dispatch code.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/compute/dynamic-dispatch-7.slang | 85 | ||||
| -rw-r--r-- | tests/compute/dynamic-dispatch-7.slang.expected.txt | 4 |
2 files changed, 89 insertions, 0 deletions
diff --git a/tests/compute/dynamic-dispatch-7.slang b/tests/compute/dynamic-dispatch-7.slang new file mode 100644 index 000000000..62ab94e48 --- /dev/null +++ b/tests/compute/dynamic-dispatch-7.slang @@ -0,0 +1,85 @@ +//TEST(compute):COMPARE_COMPUTE:-cpu -xslang -allow-dynamic-code +//DISABLE_TEST(compute):COMPARE_COMPUTE:-cuda -xslang -allow-dynamic-code + +// Test dynamic dispatch code gen for associated-typed return values +// and local variables. +// TODO: test arguments of associated type. + +interface IAssoc +{ + int Compute(); +} + +interface IInterface +{ + associatedtype TAssoc : IAssoc; + + [mutating] + void SetVal(int inVal); + + TAssoc GetAssoc(); +}; + +T.TAssoc CreateT_Assoc_Inner<T:IInterface>(int inVal) +{ + T obj; + obj.SetVal(inVal); + return obj.GetAssoc(); +} + +T.TAssoc CreateT_Assoc<T:IInterface>(int inVal) +{ + return CreateT_Assoc_Inner<T>(inVal); +} + +T CreateT<T:IInterface>(int inVal) +{ + T obj; + obj.SetVal(inVal); + return obj; +} + +struct Impl : IInterface +{ + struct TAssoc : IAssoc + { + int base; + int Compute() + { + return base; + } + }; + + TAssoc assoc; + [mutating] + void SetVal(int inVal) + { + assoc.base = inVal; + } + + TAssoc GetAssoc() + { + return assoc; + } +}; + +int test() +{ + var obj = CreateT<Impl>(2); + var obj2 = CreateT_Assoc<Impl>(1); + // TODO: compiler crash if type parameter is missing. + // (hitting lowering logic of TypeEqualityWitness) + var obj3 = CreateT_Assoc_Inner<Impl>(1); + return obj.GetAssoc().Compute() + obj2.Compute() + obj3.Compute(); +} + +//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer : register(u0); + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint tid = dispatchThreadID.x; + int outVal = test(); + outputBuffer[tid] = outVal; +} diff --git a/tests/compute/dynamic-dispatch-7.slang.expected.txt b/tests/compute/dynamic-dispatch-7.slang.expected.txt new file mode 100644 index 000000000..e785149d2 --- /dev/null +++ b/tests/compute/dynamic-dispatch-7.slang.expected.txt @@ -0,0 +1,4 @@ +4 +4 +4 +4 |
