From 71c462f5f8688bdfe398e14c4c3f576ce40f8ef2 Mon Sep 17 00:00:00 2001 From: RazvanN7 Date: Fri, 26 Jan 2018 15:33:22 +0200 Subject: [PATCH] Fix Issue 17625 - Confusing error message for private functions in different modules --- src/dmd/dsymbol.d | 8 +++++++- src/dmd/func.d | 3 +-- test/compilable/checkimports3.d | 11 +++++++++++ .../imports/checkimports3a.d | 0 .../imports/checkimports3b.d | 0 .../imports/checkimports3c.d | 0 test/fail_compilation/checkimports3.d | 15 --------------- test/fail_compilation/dip22e.d | 2 +- test/fail_compilation/fail17625.d | 17 +++++++++++++++++ test/fail_compilation/imports/a17625.d | 3 +++ test/fail_compilation/imports/b17625.d | 3 +++ 11 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 test/compilable/checkimports3.d rename test/{fail_compilation => compilable}/imports/checkimports3a.d (100%) rename test/{fail_compilation => compilable}/imports/checkimports3b.d (100%) rename test/{fail_compilation => compilable}/imports/checkimports3c.d (100%) delete mode 100644 test/fail_compilation/checkimports3.d create mode 100644 test/fail_compilation/fail17625.d create mode 100644 test/fail_compilation/imports/a17625.d create mode 100644 test/fail_compilation/imports/b17625.d diff --git a/src/dmd/dsymbol.d b/src/dmd/dsymbol.d index 0cc19b80d5c2..132bcc3c9691 100644 --- a/src/dmd/dsymbol.d +++ b/src/dmd/dsymbol.d @@ -1357,9 +1357,15 @@ public: /* If both s2 and s are overloadable (though we only * need to check s once) */ + if ((s2.isOverloadSet() || s2.isOverloadable()) && (a || s.isOverloadable())) { - a = mergeOverloadSet(ident, a, s2); + if (symbolIsVisible(this, s2)) + { + a = mergeOverloadSet(ident, a, s2); + } + if (!symbolIsVisible(this, s)) + s = s2; continue; } if (flags & IgnoreAmbiguous) // if return NULL on ambiguity diff --git a/src/dmd/func.d b/src/dmd/func.d index 49d8e76d3e14..9313b09ff518 100644 --- a/src/dmd/func.d +++ b/src/dmd/func.d @@ -2341,6 +2341,7 @@ extern (D) int overloadApply(Dsymbol fstart, scope int delegate(Dsymbol) dg, Sco Dsymbol next; for (Dsymbol d = fstart; d; d = next) { + import dmd.access : checkSymbolAccess; if (auto od = d.isOverDeclaration()) { if (od.hasOverloads) @@ -2353,7 +2354,6 @@ extern (D) int overloadApply(Dsymbol fstart, scope int delegate(Dsymbol) dg, Sco */ if (sc) { - import dmd.access : checkSymbolAccess; if (checkSymbolAccess(sc, od)) { if (int r = overloadApply(od.aliassym, dg, sc)) @@ -2393,7 +2393,6 @@ extern (D) int overloadApply(Dsymbol fstart, scope int delegate(Dsymbol) dg, Sco { if (sc) { - import dmd.access : checkSymbolAccess; if (checkSymbolAccess(sc, ad)) next = ad.toAlias(); } diff --git a/test/compilable/checkimports3.d b/test/compilable/checkimports3.d new file mode 100644 index 000000000000..1f5cf115c0d5 --- /dev/null +++ b/test/compilable/checkimports3.d @@ -0,0 +1,11 @@ +/* +REQUIRED_ARGS: -transition=checkimports -de +*/ +import imports.checkimports3a; +import imports.checkimports3b; +import imports.checkimports3c; + +void test() +{ + foo(); +} diff --git a/test/fail_compilation/imports/checkimports3a.d b/test/compilable/imports/checkimports3a.d similarity index 100% rename from test/fail_compilation/imports/checkimports3a.d rename to test/compilable/imports/checkimports3a.d diff --git a/test/fail_compilation/imports/checkimports3b.d b/test/compilable/imports/checkimports3b.d similarity index 100% rename from test/fail_compilation/imports/checkimports3b.d rename to test/compilable/imports/checkimports3b.d diff --git a/test/fail_compilation/imports/checkimports3c.d b/test/compilable/imports/checkimports3c.d similarity index 100% rename from test/fail_compilation/imports/checkimports3c.d rename to test/compilable/imports/checkimports3c.d diff --git a/test/fail_compilation/checkimports3.d b/test/fail_compilation/checkimports3.d deleted file mode 100644 index 8fdc231ee0c1..000000000000 --- a/test/fail_compilation/checkimports3.d +++ /dev/null @@ -1,15 +0,0 @@ -/* -REQUIRED_ARGS: -transition=checkimports -de -TEST_OUTPUT: ---- -fail_compilation/checkimports3.d(14): Deprecation: local import search method found overloadset `checkimports3.foo` (3 overloads) instead of overloadset `checkimports3.foo` (2 overloads) ---- -*/ -import imports.checkimports3a; -import imports.checkimports3b; -import imports.checkimports3c; - -void test() -{ - foo(); -} diff --git a/test/fail_compilation/dip22e.d b/test/fail_compilation/dip22e.d index 7aa4d1e4cb3f..8786b899253f 100644 --- a/test/fail_compilation/dip22e.d +++ b/test/fail_compilation/dip22e.d @@ -4,7 +4,7 @@ TEST_OUTPUT: --- fail_compilation/dip22e.d(16): Deprecation: `imports.dip22d.foo` is not visible from module `dip22e` fail_compilation/dip22e.d(16): Error: function `imports.dip22d.foo` is not accessible from module `dip22e` -fail_compilation/dip22e.d(17): Deprecation: local import search method found overloadset `dip22e.bar` (2 overloads) instead of function `imports.dip22e.bar` +fail_compilation/dip22e.d(17): Deprecation: local import search method found overloadset `dip22e.bar` (1 overloads) instead of function `imports.dip22e.bar` --- */ diff --git a/test/fail_compilation/fail17625.d b/test/fail_compilation/fail17625.d new file mode 100644 index 000000000000..da1736656797 --- /dev/null +++ b/test/fail_compilation/fail17625.d @@ -0,0 +1,17 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/fail17625.d(16): Deprecation: `b17625.boo` is not visible from module `fail17625` +fail_compilation/fail17625.d(16): Error: function `b17625.boo` is not accessible from module `fail17625` +--- +*/ + +module fail17625; + +import imports.a17625; +import imports.b17625; + +void main() +{ + boo(); +} diff --git a/test/fail_compilation/imports/a17625.d b/test/fail_compilation/imports/a17625.d new file mode 100644 index 000000000000..d8a457c3e8d6 --- /dev/null +++ b/test/fail_compilation/imports/a17625.d @@ -0,0 +1,3 @@ +module a17625; + +private int boo() { return 69; } diff --git a/test/fail_compilation/imports/b17625.d b/test/fail_compilation/imports/b17625.d new file mode 100644 index 000000000000..02946b0c506e --- /dev/null +++ b/test/fail_compilation/imports/b17625.d @@ -0,0 +1,3 @@ +module b17625; + +private int boo() { return 45; }