summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-check-constraint.cpp4
-rw-r--r--tests/language-feature/generics/nested-gen-value-param-inference-2.slang41
-rw-r--r--tests/language-feature/generics/nested-gen-value-param-inference.slang32
3 files changed, 75 insertions, 2 deletions
diff --git a/source/slang/slang-check-constraint.cpp b/source/slang/slang-check-constraint.cpp
index 90b0e44f5..b21365338 100644
--- a/source/slang/slang-check-constraint.cpp
+++ b/source/slang/slang-check-constraint.cpp
@@ -779,8 +779,8 @@ namespace Slang
SLANG_ASSERT(constraintDecl2);
return TryUnifyTypes(constraints,
unifyCtx,
- constraintDecl1.getDecl()->getSup().type,
- constraintDecl2.getDecl()->getSup().type);
+ getSup(m_astBuilder, constraintDecl1),
+ getSup(m_astBuilder, constraintDecl2));
}
}
diff --git a/tests/language-feature/generics/nested-gen-value-param-inference-2.slang b/tests/language-feature/generics/nested-gen-value-param-inference-2.slang
new file mode 100644
index 000000000..038329e87
--- /dev/null
+++ b/tests/language-feature/generics/nested-gen-value-param-inference-2.slang
@@ -0,0 +1,41 @@
+//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
+
+interface IValueGeneric<let D : int> {}
+struct ValGenericImpl<let D : int> : IValueGeneric<D> {}
+
+struct NestedValueGeneric<let D : int, S : IValueGeneric<D>>
+{
+ int x;
+}
+
+void acceptor<let D : int, S : IValueGeneric<D>>(NestedValueGeneric<D, S> x)
+{
+ outputBuffer[0] = D + x.x;
+}
+
+extension<let D : int, S : IValueGeneric<D>> NestedValueGeneric<D, S>
+{
+ void foo()
+ {
+ acceptor(this);
+ }
+}
+void test2(NestedValueGeneric<2, ValGenericImpl<2>> x)
+{
+ // 'foo' should be a member of 'NestedValueGeneric<2, ValGenericImpl<2>>' through
+ // the extension above.
+ x.foo();
+}
+
+//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)
+{
+ NestedValueGeneric<2, ValGenericImpl<2>> x;
+ x.x = 1;
+ test2(x);
+ // CHECK: 3
+} \ No newline at end of file
diff --git a/tests/language-feature/generics/nested-gen-value-param-inference.slang b/tests/language-feature/generics/nested-gen-value-param-inference.slang
new file mode 100644
index 000000000..cf7e5faf8
--- /dev/null
+++ b/tests/language-feature/generics/nested-gen-value-param-inference.slang
@@ -0,0 +1,32 @@
+//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
+
+interface IValueGeneric<let D : int> {}
+struct ValGenericImpl<let D : int> : IValueGeneric<D> {}
+
+struct NestedValueGeneric<let D : int, S : IValueGeneric<D>>
+{
+ int x;
+}
+
+void acceptor<let D : int, S : IValueGeneric<D>>(NestedValueGeneric<D, S> x)
+{
+ outputBuffer[0] = D + x.x;
+}
+void test(NestedValueGeneric<2, ValGenericImpl<2>> x)
+{
+ // Test that we can correctly infer acceptor.D and acceptor.S from `x`.
+ acceptor(x);
+}
+
+//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)
+{
+ NestedValueGeneric<2, ValGenericImpl<2>> x;
+ x.x = 1;
+ test(x);
+ // CHECK: 3
+} \ No newline at end of file