summaryrefslogtreecommitdiffstats
path: root/tests/language-feature
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-08-30 16:32:34 -0700
committerGitHub <noreply@github.com>2024-08-30 16:32:34 -0700
commit24df5515d6c2f8537683d0e48d27a161c394e7cd (patch)
treebbe71d5622514da5d7b60a55906adadf08f66639 /tests/language-feature
parent49862e764c6c873d7ee694663f226631b8a41353 (diff)
Support extension on generic type. (#4968)
Diffstat (limited to 'tests/language-feature')
-rw-r--r--tests/language-feature/extensions/generic-extension-1.slang49
-rw-r--r--tests/language-feature/extensions/generic-extension-2.slang30
-rw-r--r--tests/language-feature/extensions/interface-extension.slang3
-rw-r--r--tests/language-feature/extensions/this-in-extension.slang38
4 files changed, 119 insertions, 1 deletions
diff --git a/tests/language-feature/extensions/generic-extension-1.slang b/tests/language-feature/extensions/generic-extension-1.slang
new file mode 100644
index 000000000..47940e31a
--- /dev/null
+++ b/tests/language-feature/extensions/generic-extension-1.slang
@@ -0,0 +1,49 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
+interface IFoo
+{
+ int getVal();
+}
+
+interface IBar
+{
+ int getValPlusOne();
+}
+
+interface IBaz
+{
+ int getValPlusTwo();
+}
+
+struct MyInt { int v; }
+
+extension MyInt : IFoo
+{
+ int getVal() { return v; }
+}
+
+// Since MyInt:IFoo, the following extension will make MyInt:IBar.
+extension<T: IFoo> T : IBar
+{
+ int getValPlusOne() { return this.getVal() + 1; }
+}
+
+// Since MyInt:IBar, the following extension will make MyInt:IBaz.
+extension<T: IBar> T : IBaz
+{
+ int getValPlusTwo() { return this.getValPlusOne() + 1; }
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ MyInt v = {1};
+
+ // Check that the extensions applied to MyInt correctly, i.e.
+ // MyInt.getValPlusTwo() eixsts.
+
+ // CHECK: 3
+ outputBuffer[0] = v.getValPlusTwo();
+} \ No newline at end of file
diff --git a/tests/language-feature/extensions/generic-extension-2.slang b/tests/language-feature/extensions/generic-extension-2.slang
new file mode 100644
index 000000000..2728a73d6
--- /dev/null
+++ b/tests/language-feature/extensions/generic-extension-2.slang
@@ -0,0 +1,30 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
+interface IFoo<T>
+{
+ T getFirst();
+}
+
+__generic<S, T : IArray<S>>
+extension T : IFoo<S>
+{
+ S getFirst()
+ {
+ return this[0];
+ }
+}
+
+T getFirstOuter<T>(IFoo<T> arr)
+{
+ return arr.getFirst();
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ int arr[] = {1,2,3};
+ // CHECK: 1
+ outputBuffer[0] = getFirstOuter(arr);
+} \ No newline at end of file
diff --git a/tests/language-feature/extensions/interface-extension.slang b/tests/language-feature/extensions/interface-extension.slang
index 1d84ba844..50bbbe22a 100644
--- a/tests/language-feature/extensions/interface-extension.slang
+++ b/tests/language-feature/extensions/interface-extension.slang
@@ -16,7 +16,8 @@ struct MyCounter : ICounter
[mutating] void add(int value) { _state += value; }
}
-extension ICounter
+__generic<T : ICounter>
+extension T
{
[mutating] void increment()
{
diff --git a/tests/language-feature/extensions/this-in-extension.slang b/tests/language-feature/extensions/this-in-extension.slang
new file mode 100644
index 000000000..374eabe6f
--- /dev/null
+++ b/tests/language-feature/extensions/this-in-extension.slang
@@ -0,0 +1,38 @@
+// this-in-extension.slang
+
+// Test that an `This` type works correctly when there is an extension.
+
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
+
+interface IFoo
+{
+ static const This identity;
+}
+
+__generic<T:IFoo>
+extension T
+{
+ This getIdentity()
+ {
+ return identity;
+ }
+}
+
+struct FooImpl : IFoo
+{
+ int v = 1;
+ static const This identity = This();
+}
+
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[numthreads(1, 1, 1)]
+void computeMain(int3 dispatchThreadID : SV_DispatchThreadID)
+{
+ FooImpl foo;
+ var ident = foo.getIdentity();
+ // CHECK: 1
+ outputBuffer[0] = ident.v;
+}