From 8663b6dcdcdccfbbed23278ea0b6b42e237892cb Mon Sep 17 00:00:00 2001 From: Abul Hossain Khan <140191921+abulgit@users.noreply.github.com> Date: Tue, 18 Mar 2025 05:58:57 +0530 Subject: [PATCH] Fix : Improved error message on override mismatch (#21023) --- compiler/src/dmd/funcsem.d | 37 ++++++++++++++++++++++ compiler/test/fail_compilation/test20489.d | 20 ++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 compiler/test/fail_compilation/test20489.d diff --git a/compiler/src/dmd/funcsem.d b/compiler/src/dmd/funcsem.d index e70cffb321..71d3dfa5f0 100644 --- a/compiler/src/dmd/funcsem.d +++ b/compiler/src/dmd/funcsem.d @@ -983,6 +983,43 @@ void funcDeclarationSemantic(Scope* sc, FuncDeclaration funcdecl) error(funcdecl.loc, "function `%s` does not override any function, did you mean to override `%s`?", funcdeclToChars, buf1.peekChars()); + + // Supplemental error for parameter scope differences + auto tf1 = cast(TypeFunction)funcdecl.type; + auto tf2 = cast(TypeFunction)fd.type; + + if (tf1 && tf2) + { + auto params1 = tf1.parameterList; + auto params2 = tf2.parameterList; + + if (params1.length == params2.length) + { + bool hasScopeDifference = false; + + for (size_t i = 0; i < params1.length; i++) + { + auto p1 = params1[i]; + auto p2 = params2[i]; + + if ((p1.storageClass & STC.scope_) == (p2.storageClass & STC.scope_)) + continue; + + if (!(p2.storageClass & STC.scope_)) + continue; + + if (!hasScopeDifference) + { + // Intended signature + errorSupplemental(funcdecl.loc, "Did you intend to override:"); + errorSupplemental(funcdecl.loc, "`%s`", buf1.peekChars()); + hasScopeDifference = true; + } + errorSupplemental(funcdecl.loc, "Parameter %d is missing `scope`", + cast(int)(i + 1)); + } + } + } } } else diff --git a/compiler/test/fail_compilation/test20489.d b/compiler/test/fail_compilation/test20489.d new file mode 100644 index 0000000000..1cd5350959 --- /dev/null +++ b/compiler/test/fail_compilation/test20489.d @@ -0,0 +1,20 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/test20489.d(19): Error: function `pure nothrow @nogc @safe int test20489.D.f(int delegate(int) pure nothrow @nogc @safe body)` does not override any function, did you mean to override `pure nothrow @nogc @safe int test20489.B.f(scope int delegate(int) pure nothrow @nogc @safe)`? +fail_compilation/test20489.d(19): Did you intend to override: +fail_compilation/test20489.d(19): `pure nothrow @nogc @safe int test20489.B.f(scope int delegate(int) pure nothrow @nogc @safe)` +fail_compilation/test20489.d(19): Parameter 1 is missing `scope` +--- +*/ + +// Test case for https://github.com/dlang/dmd/issues/20489 +// Improved error message on override mismatches + +class B { + pure nothrow @nogc @safe int f(scope int delegate(int) pure nothrow @nogc @safe) { return 0; } +} + +class D : B { + override pure nothrow @nogc @safe int f(int delegate(int) pure nothrow @nogc @safe body) { return 0; } +}