summaryrefslogtreecommitdiffstats
path: root/tests/language-feature/extensions
diff options
context:
space:
mode:
authorkaizhangNV <149626564+kaizhangNV@users.noreply.github.com>2025-08-03 23:35:08 -0400
committerGitHub <noreply@github.com>2025-08-03 20:35:08 -0700
commit34840bb69fd6b124e772535ffb3f223743870467 (patch)
treeaaeebd69517d41bd014e729465dcddec8f308fb4 /tests/language-feature/extensions
parent8a15efb37a33d3c2943be87a19cbf9b5e2e8432b (diff)
fix overload in extension issue (#7999)
close #7931. For a generic callable, we have two passes overload resolution, in first pass, we will resolve the generic by only checking the generic parameters, while in the second pass, we will resolve the function signature to resolve the overload. But in our candidate comparison logic, we pick a preferred generic even two generics are equally good. However, we should not make this decision in the first pass, because we don't know about the function arguments in this pass yet. So we just return OverloadEpxr2 in this case, and let the function overload resolution to break the tie.
Diffstat (limited to 'tests/language-feature/extensions')
-rw-r--r--tests/language-feature/extensions/extension-override-3.slang28
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/language-feature/extensions/extension-override-3.slang b/tests/language-feature/extensions/extension-override-3.slang
new file mode 100644
index 000000000..2a023bca3
--- /dev/null
+++ b/tests/language-feature/extensions/extension-override-3.slang
@@ -0,0 +1,28 @@
+//TEST:SIMPLE(filecheck=CHECK):-target spirv
+
+// This test verifies that a generic method defined in an extension can be found.
+
+// CHECK: OpEntryPoint
+struct Test {
+ void genericMethod<int u>(float2 x) {}
+ __subscript<T:__BuiltinIntegerType>(T idx1, T idx2) -> int
+ {
+ get { return 0; }
+ }
+}
+
+extension Test {
+ void genericMethod<int u>() {}
+ __subscript<T:__BuiltinIntegerType>(T idx1) -> int
+ {
+ get { return 1; }
+ }
+}
+
+[shader("compute")]
+void main()
+{
+ Test t;
+ t.genericMethod<3>(); // Should work - calls extension method
+ int a = t[0]; // Should work - calls extension method
+}