From b5ddf51ea87e43a00441eed2185961baf29e7eab Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Wed, 8 May 2024 08:11:38 +0100 Subject: [PATCH] Improve `@__future` deprecation message (#16447) Show location of base method. Remove duplicate content in compilable/future.d. --- compiler/src/dmd/funcsem.d | 5 +++- compiler/test/compilable/future.d | 47 ------------------------------- compiler/test/runnable/future.d | 3 +- 3 files changed, 6 insertions(+), 49 deletions(-) delete mode 100644 compiler/test/compilable/future.d diff --git a/compiler/src/dmd/funcsem.d b/compiler/src/dmd/funcsem.d index e058deb0f9..31ed744d92 100644 --- a/compiler/src/dmd/funcsem.d +++ b/compiler/src/dmd/funcsem.d @@ -742,7 +742,10 @@ void funcDeclarationSemantic(Scope* sc, FuncDeclaration funcdecl) { if (fdv.isFuture()) { - deprecation(funcdecl.loc, "`@__future` base class method `%s` is being overridden by `%s`; rename the latter", fdv.toPrettyChars(), funcdecl.toPrettyChars()); + deprecation(funcdecl.loc, "method `%s` implicitly overrides `@__future` base class method; rename the former", + funcdecl.toPrettyChars()); + deprecationSupplemental(fdv.loc, "base method `%s` defined here", + fdv.toPrettyChars()); // Treat 'this' as an introducing function, giving it a separate hierarchy in the vtbl[] goto Lintro; } diff --git a/compiler/test/compilable/future.d b/compiler/test/compilable/future.d deleted file mode 100644 index 30439847ef..0000000000 --- a/compiler/test/compilable/future.d +++ /dev/null @@ -1,47 +0,0 @@ -/* PERMUTE_ARGS: - * TEST_OUTPUT: ---- -compilable/future.d(15): Deprecation: `@__future` base class method `future.A.msg` is being overridden by `future.B.msg`; rename the latter ---- - */ - -class A -{ - @__future char msg() { return 'a'; } -} - -class B : A -{ - char msg() { return 'b'; } -} - -class C : B -{ - override char msg() { return 'c'; } -} - -class D : A -{ - override char msg() { return 'd'; } -} - -int main() -{ - auto a = new A(); - assert(a.msg() == 'a'); - auto b = new B(); - assert(b.msg() == 'b'); - auto c = new C(); - assert(c.msg() == 'c'); - auto d = new D(); - assert(d.msg() == 'd'); - - assert(b.A.msg() == 'a'); - - auto ba = cast(A)b; - assert(ba.msg() == 'a'); - - auto da = cast(A)d; - assert(da.msg() == 'd'); - return 0; -} diff --git a/compiler/test/runnable/future.d b/compiler/test/runnable/future.d index 1a91d30535..e0ef466395 100644 --- a/compiler/test/runnable/future.d +++ b/compiler/test/runnable/future.d @@ -1,7 +1,8 @@ /* PERMUTE_ARGS: TEST_OUTPUT: --- -runnable/future.d(15): Deprecation: `@__future` base class method `future.A.msg` is being overridden by `future.B.msg`; rename the latter +runnable/future.d(16): Deprecation: method `future.B.msg` implicitly overrides `@__future` base class method; rename the former +runnable/future.d(11): base method `future.A.msg` defined here --- */