From 3b551d3ce6d9d654ba64c11ce0c7c926b1197aa0 Mon Sep 17 00:00:00 2001 From: Atila Neves Date: Fri, 22 Dec 2017 11:10:48 -0800 Subject: [PATCH] Fix issue 18111: use fully qualified name for modules in unittest names --- src/dmd/dmodule.d | 16 ++++++++++++++++ src/dmd/func.d | 25 +++++++++++++++++++++++-- test/fail_compilation/fail7848.d | 8 ++++---- test/fail_compilation/ice14424.d | 2 +- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/dmd/dmodule.d b/src/dmd/dmodule.d index 0c8a76bd188f..6fcd9fa32c72 100644 --- a/src/dmd/dmodule.d +++ b/src/dmd/dmodule.d @@ -1318,6 +1318,22 @@ extern (C++) final class Module : Package { v.visit(this); } + + /*********************************************** + * Writes this module's fully-qualified name to buf + * Params: + * buf = The buffer to write to + */ + void fullyQualifiedName(ref OutBuffer buf) + { + buf.writestring(ident.toString()); + + for (auto package_ = parent; package_ !is null; package_ = package_.parent) + { + buf.prependstring("."); + buf.prependstring(package_.ident.toChars()); + } + } } /*********************************************************** diff --git a/src/dmd/func.d b/src/dmd/func.d index b36f11914f58..c334a78cb7b7 100644 --- a/src/dmd/func.d +++ b/src/dmd/func.d @@ -3468,8 +3468,10 @@ extern (C++) final class UnitTestDeclaration : FuncDeclaration private static Identifier createIdentifier(Loc loc, Scope* sc) { OutBuffer buf; - auto index = sc ? sc._module.unitTestCounter++ : 0; - buf.printf("__unittest_%s_%u_%d", loc.filename, loc.linnum, index); + writeModuleNameOrFileName(buf, loc, sc); + buf.prependstring("__unittest_"); + const index = sc ? sc._module.unitTestCounter++ : 0; + buf.printf("_%u_%d", loc.linnum, index); // replace characters that demangle can't handle auto str = buf.peekString; @@ -3479,6 +3481,25 @@ extern (C++) final class UnitTestDeclaration : FuncDeclaration return Identifier.idPool(buf.peekSlice()); } + /************************************************************************* + * Writes a module name to name a unittest. Tries to use the fully + * qualified name if possible to avoid mismatches when compiling separately. + * Otherwise uses the file name. + * Params: + * buf = The buffer to write to. + * loc = The location of the unit test declaration. + * scope = The scope of the unit test declaration. + */ + private static void writeModuleNameOrFileName(ref OutBuffer buf, Loc loc, Scope* scope_) + { + if (scope_ is null || scope_._module is null || scope_._module.ident is null) + { + buf.writestring(loc.filename); + return; + } + scope_._module.fullyQualifiedName(buf); + } + override AggregateDeclaration isThis() { return null; diff --git a/test/fail_compilation/fail7848.d b/test/fail_compilation/fail7848.d index 18bbb69e7668..320bf14e2c81 100644 --- a/test/fail_compilation/fail7848.d +++ b/test/fail_compilation/fail7848.d @@ -3,11 +3,11 @@ /* TEST_OUTPUT: --- -fail_compilation/fail7848.d(35): Error: pure function 'fail7848.C.__unittest_fail_compilation_fail7848_d_33_0' cannot call impure function 'fail7848.func' -fail_compilation/fail7848.d(35): Error: @safe function 'fail7848.C.__unittest_fail_compilation_fail7848_d_33_0' cannot call @system function 'fail7848.func' -fail_compilation/fail7848.d(35): Error: @nogc function 'fail7848.C.__unittest_fail_compilation_fail7848_d_33_0' cannot call non-@nogc function 'fail7848.func' +fail_compilation/fail7848.d(35): Error: pure function 'fail7848.C.__unittest_fail7848_33_0' cannot call impure function 'fail7848.func' +fail_compilation/fail7848.d(35): Error: @safe function 'fail7848.C.__unittest_fail7848_33_0' cannot call @system function 'fail7848.func' +fail_compilation/fail7848.d(35): Error: @nogc function 'fail7848.C.__unittest_fail7848_33_0' cannot call non-@nogc function 'fail7848.func' fail_compilation/fail7848.d(35): Error: function `fail7848.func` is not nothrow -fail_compilation/fail7848.d(33): Error: nothrow function `fail7848.C.__unittest_fail_compilation_fail7848_d_33_0` may throw +fail_compilation/fail7848.d(33): Error: nothrow function `fail7848.C.__unittest_fail7848_33_0` may throw fail_compilation/fail7848.d(40): Error: pure function 'fail7848.C.__invariant1' cannot call impure function 'fail7848.func' fail_compilation/fail7848.d(40): Error: @safe function 'fail7848.C.__invariant1' cannot call @system function 'fail7848.func' fail_compilation/fail7848.d(40): Error: @nogc function 'fail7848.C.__invariant1' cannot call non-@nogc function 'fail7848.func' diff --git a/test/fail_compilation/ice14424.d b/test/fail_compilation/ice14424.d index f110820df647..249607b5fb77 100644 --- a/test/fail_compilation/ice14424.d +++ b/test/fail_compilation/ice14424.d @@ -2,7 +2,7 @@ /* TEST_OUTPUT: --- -fail_compilation/ice14424.d(12): Error: `tuple(__unittest_fail_compilation_imports_a14424_d_3_0)` has no effect +fail_compilation/ice14424.d(12): Error: `tuple(__unittest_imports_a14424_3_0)` has no effect --- */