From: ibuclaw Date: Sun, 10 Feb 2019 09:13:26 +0000 (+0000) Subject: d/dmd: Merge upstream dmd 39edbe17e X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4285bd7de964c349d5de6faeac72795601b3cc4;p=thirdparty%2Fgcc.git d/dmd: Merge upstream dmd 39edbe17e Backported fix from upstream dmd 2.079 for an internal compiler error that occurred during semantic analysis on a recursive field initializer. Fixes https://gcc.gnu.org/PR88989 Reviewed-on: https://github.com/dlang/dmd/pull/9284 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@268740 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index c1c6cc145c4b..8b377015129e 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -e21c07e84bd9668e1c0fc1f45e514c5fd76988e7 +39edbe17e7b5c761d780c9d1d4376a06df7bf3d8 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/dstruct.c b/gcc/d/dmd/dstruct.c index b44d63298e66..d35b005a47d2 100644 --- a/gcc/d/dmd/dstruct.c +++ b/gcc/d/dmd/dstruct.c @@ -723,7 +723,14 @@ bool AggregateDeclaration::fill(Loc loc, Expressions *elements, bool ctorinit) else if (vx->_init) { assert(!vx->_init->isVoidInitializer()); - e = vx->getConstInitializer(false); + if (vx->inuse) // https://issues.dlang.org/show_bug.cgi?id=18057 + { + vx->error(loc, "recursive initialization of field"); + errors = true; + e = NULL; + } + else + e = vx->getConstInitializer(false); } else { diff --git a/gcc/testsuite/gdc.test/compilable/interpret3.d b/gcc/testsuite/gdc.test/compilable/interpret3.d index 8e7025c7f59f..386743e6ddc4 100644 --- a/gcc/testsuite/gdc.test/compilable/interpret3.d +++ b/gcc/testsuite/gdc.test/compilable/interpret3.d @@ -7731,3 +7731,14 @@ bool foo17407() static assert(!foo17407); +/**************************************************/ +// https://issues.dlang.org/show_bug.cgi?id=18057 +// Recursive field initializer causes segfault. + +struct RBNode(T) +{ + RBNode!T *copy = new RBNode!T; +} + +static assert(!__traits(compiles, { alias bug18057 = RBNode!int; })); + diff --git a/gcc/testsuite/gdc.test/fail_compilation/fail18057.d b/gcc/testsuite/gdc.test/fail_compilation/fail18057.d new file mode 100644 index 000000000000..5e2bab7f796e --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/fail18057.d @@ -0,0 +1,16 @@ +/** +TEST_OUTPUT: +--- +fail_compilation/fail18057.d(16): Error: template instance RBNode!int `RBNode` is not a template declaration, it is a struct +fail_compilation/fail18057.d(13): Error: variable fail18057.RBNode.copy recursive initialization of field +--- +*/ + +// https://issues.dlang.org/show_bug.cgi?id=18057 +// Recursive field initializer causes segfault. +struct RBNode +{ + RBNode *copy = new RBNode; +} + +alias bug18057 = RBNode!int; diff --git a/gcc/testsuite/gdc.test/fail_compilation/fail18057b.d b/gcc/testsuite/gdc.test/fail_compilation/fail18057b.d new file mode 100644 index 000000000000..14abbfd346ff --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/fail18057b.d @@ -0,0 +1,13 @@ +/** +TEST_OUTPUT: +--- +fail_compilation/fail18057b.d(12): Error: variable `fail18057b.Recursive.field` recursive initialization of field +--- +*/ + +// https://issues.dlang.org/show_bug.cgi?id=18057 +// Recursive field initializer causes segfault. +struct Recursive +{ + int field = Recursive(); +}