From c75fbc7f9dfb625cf8d407ec52323244acae8c8e Mon Sep 17 00:00:00 2001 From: Julius Ikkala Date: Thu, 27 Nov 2025 21:38:30 +0200 Subject: [PATCH 1/3] Allow override keyword inside extension --- source/slang/slang-check-modifier.cpp | 6 ++++- .../interfaces/override-default-method.slang | 25 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 8be5dc39bf0..1d4241f6fa3 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -1531,7 +1531,11 @@ bool isModifierAllowedOnDecl(bool isGLSLInput, ASTNodeType modifierType, Decl* d case ASTNodeType::DynModifier: return as(decl) || as(decl) || as(decl); case ASTNodeType::OverrideModifier: - return as(decl) && as(getParentDecl(decl)); + { + Decl* parent = getParentDecl(decl); + return as(decl) && + (as(parent) || as(parent)); + } default: return true; } diff --git a/tests/language-feature/interfaces/override-default-method.slang b/tests/language-feature/interfaces/override-default-method.slang index 22ae483118e..c46f2865b16 100644 --- a/tests/language-feature/interfaces/override-default-method.slang +++ b/tests/language-feature/interfaces/override-default-method.slang @@ -25,6 +25,25 @@ struct Impl : IFoo } } +struct Other +{ + int n; +} + +extension Other: IFoo +{ + int getVal() + { + return n; + } + + // Override should also work inside an extension + override int getGreaterVal() + { + return getVal() + x + 2; + } +} + int test(T v) { return v.getGreaterVal<1>(); } //TEST_INPUT: set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) @@ -37,4 +56,8 @@ void computeMain() int result = test(impl); resultBuffer[0] = result; // CHECK: 44 -} \ No newline at end of file + + Other other = {32}; + resultBuffer[1] = test(other); + // CHECK-NEXT: 35 +} From 2bc26df63994690068a420a8c28b4025361b75a1 Mon Sep 17 00:00:00 2001 From: Julius Ikkala Date: Thu, 27 Nov 2025 21:44:27 +0200 Subject: [PATCH 2/3] Fix formatting --- source/slang/slang-check-modifier.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 1d4241f6fa3..0cc5cb55714 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -1534,7 +1534,7 @@ bool isModifierAllowedOnDecl(bool isGLSLInput, ASTNodeType modifierType, Decl* d { Decl* parent = getParentDecl(decl); return as(decl) && - (as(parent) || as(parent)); + (as(parent) || as(parent)); } default: return true; From 10ea007fb3293e11ff36846bb14674e44b802881 Mon Sep 17 00:00:00 2001 From: Julius Ikkala Date: Wed, 3 Dec 2025 01:17:29 +0200 Subject: [PATCH 3/3] Check for AggTypeDeclBase instead --- source/slang/slang-check-modifier.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 0cc5cb55714..4822d6178d7 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -1533,8 +1533,7 @@ bool isModifierAllowedOnDecl(bool isGLSLInput, ASTNodeType modifierType, Decl* d case ASTNodeType::OverrideModifier: { Decl* parent = getParentDecl(decl); - return as(decl) && - (as(parent) || as(parent)); + return as(decl) && as(parent); } default: return true;