From ea9c68353e04513d806035f75b03e39e75b0737b Mon Sep 17 00:00:00 2001 From: 0-v-0 Date: Tue, 30 Jun 2026 14:26:03 +0800 Subject: [PATCH] Fix #18981 - Propagate TemplateThisParameter through inheritance --- compiler/src/dmd/expressionsem.d | 5 +++-- compiler/test/compilable/test14484.d | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 compiler/test/compilable/test14484.d diff --git a/compiler/src/dmd/expressionsem.d b/compiler/src/dmd/expressionsem.d index 995a003aad96..ec79d1ef3991 100644 --- a/compiler/src/dmd/expressionsem.d +++ b/compiler/src/dmd/expressionsem.d @@ -8373,13 +8373,14 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor { s = (cast(TemplateExp)exp.e1).td; L2: - exp.f = resolveFuncCall(exp.loc, sc, s, tiargs, null, exp.argumentList, + auto fdthis = hasThis(sc); + exp.f = resolveFuncCall(exp.loc, sc, s, tiargs, fdthis ? fdthis.vthis.type : null, exp.argumentList, exp.isUfcsRewrite ? FuncResolveFlag.ufcs : FuncResolveFlag.standard); if (!exp.f || exp.f.errors) return setError(); if (exp.f.needThis()) { - if (hasThis(sc)) + if (fdthis) { // Supply an implicit 'this', as in // this.ident diff --git a/compiler/test/compilable/test14484.d b/compiler/test/compilable/test14484.d new file mode 100644 index 000000000000..da2a68e181fb --- /dev/null +++ b/compiler/test/compilable/test14484.d @@ -0,0 +1,17 @@ +// https://issues.dlang.org/show_bug.cgi?id=14484 + +class A +{ + final void f(this This)() + { + static assert(This.stringof == "B"); + } +} + +class B : A +{ + void x() + { + f(); + } +}