From 34840bb69fd6b124e772535ffb3f223743870467 Mon Sep 17 00:00:00 2001 From: kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> Date: Sun, 3 Aug 2025 23:35:08 -0400 Subject: 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. --- .../extensions/extension-override-3.slang | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/language-feature/extensions/extension-override-3.slang (limited to 'tests') 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(float2 x) {} + __subscript(T idx1, T idx2) -> int + { + get { return 0; } + } +} + +extension Test { + void genericMethod() {} + __subscript(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 +} -- cgit v1.2.3