diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 8be5dc39bf0..0cc5cb55714 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 +}