From b01ae659139e62f54d4e869dd0e1ccbe7ca0326f Mon Sep 17 00:00:00 2001 From: Abul Date: Tue, 28 Jul 2026 12:14:59 +0530 Subject: [PATCH] fix --- compiler/src/dmd/funcsem.d | 7 ++++- compiler/test/fail_compilation/issue23470.d | 31 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 compiler/test/fail_compilation/issue23470.d diff --git a/compiler/src/dmd/funcsem.d b/compiler/src/dmd/funcsem.d index 657cb2f085d1..e38fe89e6857 100644 --- a/compiler/src/dmd/funcsem.d +++ b/compiler/src/dmd/funcsem.d @@ -826,10 +826,15 @@ void funcDeclarationSemantic(Scope* sc, FuncDeclaration funcdecl) if (auto id = parent.isInterfaceDeclaration()) { funcdecl.storage_class |= STC.abstract_; - if (funcdecl.isCtorDeclaration() || funcdecl.isPostBlitDeclaration() || funcdecl.isDtorDeclaration() || funcdecl.isInvariantDeclaration() || funcdecl.isNewDeclaration() || funcdecl.isDelete()) + const isSpecialFunc = funcdecl.isCtorDeclaration() || funcdecl.isPostBlitDeclaration() || funcdecl.isDtorDeclaration() || funcdecl.isInvariantDeclaration() || funcdecl.isNewDeclaration() || funcdecl.isDelete(); + if (isSpecialFunc) .error(funcdecl.loc, "%s `%s` constructors, destructors, postblits, invariants, new and delete functions are not allowed in interface `%s`", funcdecl.kind, funcdecl.toPrettyChars, id.toErrMsg()); if (funcdecl.fbody && funcdecl.isVirtual()) .error(funcdecl.loc, "%s `%s` function body only allowed in `final` functions in interface `%s`", funcdecl.kind, funcdecl.toPrettyChars, id.toErrMsg()); + // A final interface function has no vtable slot, so no class can supply its + // body. Only a foreign linkage can, from the other side. + if (!isSpecialFunc && !funcdecl.fbody && !funcdecl.isStatic() && funcdecl.isFinalFunc() && funcdecl.resolvedLinkage() == LINK.d) + .error(funcdecl.loc, "%s `%s` `final` function requires a body in interface `%s`", funcdecl.kind, funcdecl.toPrettyChars, id.toErrMsg()); } if (UnionDeclaration ud = parent.isUnionDeclaration()) diff --git a/compiler/test/fail_compilation/issue23470.d b/compiler/test/fail_compilation/issue23470.d new file mode 100644 index 000000000000..2f8e500ebde1 --- /dev/null +++ b/compiler/test/fail_compilation/issue23470.d @@ -0,0 +1,31 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/issue23470.d(14): Error: function `issue23470.A.foo` `final` function requires a body in interface `A` +--- +*/ + +// https://github.com/dlang/dmd/issues/23470 + +final: + +interface A +{ + void foo(); +} + +class B : A +{ + void foo() { } +} + +// exempt, the definition can come from the other language +extern (C++) interface C +{ + void bar(); +} + +extern (C) interface D +{ + void baz(); +}