Hi, This patch merges the D front-end implementation with dmd upstream da26db819, backporting a supplementary fix for ICE on importing modules marked as deprecated, but with a non-string message.
Bootstrapped and regression tested on x86_64-linux-gnu. Committed to trunk as r269560. -- Iain ---
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index 98bf8254554..313748f70ae 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -0fc786f4908aa6bdd4220af87995333b1f24c3d7 +da26db81943952c7e35dab98650df589ec122485 The first line of this file holds the git revision number of the last merge done from the dlang/dmd repository. diff --git a/gcc/d/dmd/dimport.c b/gcc/d/dmd/dimport.c index cd2c5b22a74..3d899f09b52 100644 --- a/gcc/d/dmd/dimport.c +++ b/gcc/d/dmd/dimport.c @@ -23,8 +23,6 @@ #include "attrib.h" #include "hdrgen.h" -StringExp *semanticString(Scope *sc, Expression *exp, const char *s); - /********************************* Import ****************************/ Import::Import(Loc loc, Identifiers *packages, Identifier *id, Identifier *aliasId, @@ -175,19 +173,17 @@ void Import::importAll(Scope *sc) load(sc); if (mod) // if successfully loaded module { + mod->importAll(NULL); + if (mod->md && mod->md->isdeprecated) { Expression *msg = mod->md->msg; - if (msg) - msg = semanticString(sc, msg, "deprecation message"); if (StringExp *se = msg ? msg->toStringExp() : NULL) mod->deprecation(loc, "is deprecated - %s", se->string); else mod->deprecation(loc, "is deprecated"); } - mod->importAll(NULL); - if (sc->explicitProtection) protection = sc->protection; if (!isstatic && !aliasId && !names.dim) diff --git a/gcc/testsuite/gdc.test/fail_compilation/fail19609.d b/gcc/testsuite/gdc.test/fail_compilation/fail19609.d index 64d080ac5d0..26ef57693b7 100644 --- a/gcc/testsuite/gdc.test/fail_compilation/fail19609.d +++ b/gcc/testsuite/gdc.test/fail_compilation/fail19609.d @@ -3,16 +3,17 @@ TEST_OUTPUT --- fail_compilation/imports/fail19609a.d(1): Error: `string` expected for deprecation message, not `([""])` of type `string[]` -fail_compilation/fail19609.d(16): Deprecation: module `imports.fail19609a` is deprecated -fail_compilation/imports/fail19609a.d(1): Error: `string` expected for deprecation message, not `([""])` of type `string[]` -fail_compilation/imports/fail19609b.d(1): Error: `string` expected for deprecation message, not `([1])` of type `int[]` -fail_compilation/fail19609.d(17): Deprecation: module `imports.fail19609b` is deprecated +fail_compilation/fail19609.d(15): Deprecation: module `imports.fail19609a` is deprecated fail_compilation/imports/fail19609b.d(1): Error: `string` expected for deprecation message, not `([1])` of type `int[]` +fail_compilation/fail19609.d(16): Deprecation: module `imports.fail19609b` is deprecated fail_compilation/imports/fail19609c.d(1): Error: `string` expected for deprecation message, not `(123.4F)` of type `float` -fail_compilation/fail19609.d(18): Deprecation: module `imports.fail19609c` is deprecated -fail_compilation/imports/fail19609c.d(1): Error: `string` expected for deprecation message, not `(123.4F)` of type `float` +fail_compilation/fail19609.d(17): Deprecation: module `imports.fail19609c` is deprecated +fail_compilation/imports/fail19609d.d(1): Error: undefined identifier `msg` +fail_compilation/fail19609.d(19): Deprecation: module `imports.fail19609d` is deprecated --- */ import imports.fail19609a; import imports.fail19609b; import imports.fail19609c; +enum msg = "You should not be able to see me"; +import imports.fail19609d; diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/fail19609d.d b/gcc/testsuite/gdc.test/fail_compilation/imports/fail19609d.d new file mode 100644 index 00000000000..0955ca4fac2 --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/imports/fail19609d.d @@ -0,0 +1,2 @@ +deprecated(msg) module imports.fail19609d; +enum msg = "You won't see this either";