diff options
| author | kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> | 2025-08-03 23:35:08 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-03 20:35:08 -0700 |
| commit | 34840bb69fd6b124e772535ffb3f223743870467 (patch) | |
| tree | aaeebd69517d41bd014e729465dcddec8f308fb4 /tests/language-feature/extensions | |
| parent | 8a15efb37a33d3c2943be87a19cbf9b5e2e8432b (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.slang | 28 |
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 +} |
