From a4345725a083651c16795d27fedd769f2d7e55ae Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 16 Jun 2025 20:37:27 -0700 Subject: Require `override` keyword for overriding default interface methods. (#7458) * Require `override` keyword for overriding default interface methods. * Update doc. * Fix test. --- tests/diagnostics/missing-override.slang | 20 +++++++++++ .../default-method-generic-interface.slang | 2 +- .../interfaces/override-default-method.slang | 40 ++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/diagnostics/missing-override.slang create mode 100644 tests/language-feature/interfaces/override-default-method.slang (limited to 'tests') diff --git a/tests/diagnostics/missing-override.slang b/tests/diagnostics/missing-override.slang new file mode 100644 index 000000000..cc2cbcad3 --- /dev/null +++ b/tests/diagnostics/missing-override.slang @@ -0,0 +1,20 @@ +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): + +interface IFoo +{ + int getVal() { return 0; } +} + +struct Impl : IFoo +{ + // Missing override for getVal, which should trigger a diagnostic. + // CHECK: ([[# @LINE+1]]): error 30853 + int getVal() { return 1; } +} + +struct Impl2 : IFoo +{ + // Overriding getVal with a different signature should also trigger a diagnostic. + // CHECK: ([[# @LINE+1]]): error 30854 + override int getVal(int x) { return x; } +} \ No newline at end of file diff --git a/tests/language-feature/interfaces/default-method-generic-interface.slang b/tests/language-feature/interfaces/default-method-generic-interface.slang index fb32b2001..f33950a82 100644 --- a/tests/language-feature/interfaces/default-method-generic-interface.slang +++ b/tests/language-feature/interfaces/default-method-generic-interface.slang @@ -30,7 +30,7 @@ struct Impl2 : IFoo<2> } // overriding default implementation. - int getGreaterVal() + override int getGreaterVal() { return 100 + x; } diff --git a/tests/language-feature/interfaces/override-default-method.slang b/tests/language-feature/interfaces/override-default-method.slang new file mode 100644 index 000000000..22ae48311 --- /dev/null +++ b/tests/language-feature/interfaces/override-default-method.slang @@ -0,0 +1,40 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +// Test that a generic interface method can have a body providing default implementation. + +interface IFoo +{ + int getVal(); + int getGreaterVal() + { + return getVal() + x; + } +} + +struct Impl : IFoo +{ + int getVal() + { + return 42; + } + + // override default implementation for getGreaterVal. + override int getGreaterVal() + { + return getVal() + x + 1; // Adding 1 to differentiate from the default implementation. + } +} + +int test(T v) { return v.getGreaterVal<1>(); } + +//TEST_INPUT: set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer resultBuffer; + +[numthreads(1,1,1)] +void computeMain() +{ + Impl impl = {}; + int result = test(impl); + resultBuffer[0] = result; + // CHECK: 44 +} \ No newline at end of file -- cgit v1.2.3