From dbf05f8dca79d7bb166038652d968554d486c9fd Mon Sep 17 00:00:00 2001 From: Ronan Date: Fri, 9 May 2025 21:34:08 +0200 Subject: Fixed name mangling of generic extensions (#6671) * Fixed name mangling of generic extensions * Added tests for generic extensions linking. - Disabled bugs/gh-6331.slang since it now triggers an assertion error revealed by the new version of the mangler. * Re-enabled test gh-6331 (fixed by a5efbb1b775afb2f6b29b37d39947c41744bb005) --------- Co-authored-by: Yong He --- .../extensions/generic-extension-3.slang | 42 ++++++++++++++++ .../extensions/generic-extension-4.slang | 58 ++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 tests/language-feature/extensions/generic-extension-3.slang create mode 100644 tests/language-feature/extensions/generic-extension-4.slang (limited to 'tests') diff --git a/tests/language-feature/extensions/generic-extension-3.slang b/tests/language-feature/extensions/generic-extension-3.slang new file mode 100644 index 000000000..358c3facd --- /dev/null +++ b/tests/language-feature/extensions/generic-extension-3.slang @@ -0,0 +1,42 @@ +// Test that multiple functions from different extensions are properly linked. + +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj +interface IValuable +{ + int getValue(); +}; + +__generic +extension Int : IValuable +{ + int getValue() + { + return 0; + } +}; + +__generic +extension Float : IValuable +{ + int getValue() + { + return 1; + } +}; + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +[shader("compute")] +[numthreads(1, 1, 1)] +void computeMain() +{ + uint i = 0; + float f = float(i) / float(10); + + // CHECK: 0 + outputBuffer[0] = i.getValue(); + + // CHECK: 1 + outputBuffer[1] = f.getValue(); +} \ No newline at end of file diff --git a/tests/language-feature/extensions/generic-extension-4.slang b/tests/language-feature/extensions/generic-extension-4.slang new file mode 100644 index 000000000..61e1c1386 --- /dev/null +++ b/tests/language-feature/extensions/generic-extension-4.slang @@ -0,0 +1,58 @@ +// Test that multiple functions from different extensions are properly linked through their respective witness table. + +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj +interface IValuableImpl +{ + int getValue(); +} + +interface IValuable +{ + associatedtype Impl : IValuableImpl; + Impl getImpl(); +}; + +__generic +extension Int : IValuableImpl +{ + int getValue() + { + return 0; + } +}; + +__generic +extension Float : IValuableImpl +{ + int getValue() + { + return 1; + } +}; + +__generic +extension ValuableImpl : IValuable +{ + typealias Impl = ValuableImpl; + ValuableImpl getImpl() + { + return this; + } +}; + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +[shader("compute")] +[numthreads(1, 1, 1)] +void computeMain() +{ + uint i = 0; + float f = float(i) / float(10); + + // CHECK: 0 + outputBuffer[0] = i.getImpl().getValue(); + + // CHECK: 1 + outputBuffer[1] = f.getImpl().getValue(); +} \ No newline at end of file -- cgit v1.2.3