aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gcc.gnu.org>2019-02-10 09:13:26 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-02-10 09:13:26 +0000
commit6ba50b2cb963a8c820d79aeceaf36285d14b7b26 (patch)
tree7f127bc17780a0cbca2c72fb7d901c8aebfd4a1c
parent4b23af6dae69976a50c038f44b335db96c1a286a (diff)
downloadgcc-6ba50b2cb963a8c820d79aeceaf36285d14b7b26.zip
gcc-6ba50b2cb963a8c820d79aeceaf36285d14b7b26.tar.gz
gcc-6ba50b2cb963a8c820d79aeceaf36285d14b7b26.tar.bz2
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 From-SVN: r268740
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/dstruct.c9
-rw-r--r--gcc/testsuite/gdc.test/compilable/interpret3.d11
-rw-r--r--gcc/testsuite/gdc.test/fail_compilation/fail18057.d16
-rw-r--r--gcc/testsuite/gdc.test/fail_compilation/fail18057b.d13
5 files changed, 49 insertions, 2 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index c1c6cc1..8b37701 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 b44d632..d35b005 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 8e7025c..386743e 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 0000000..5e2bab7
--- /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 0000000..14abbfd
--- /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();
+}