Commit 6ba50b2c by Iain Buclaw

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
parent 4b23af6d
e21c07e84bd9668e1c0fc1f45e514c5fd76988e7 39edbe17e7b5c761d780c9d1d4376a06df7bf3d8
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository. merge done from the dlang/dmd repository.
...@@ -723,7 +723,14 @@ bool AggregateDeclaration::fill(Loc loc, Expressions *elements, bool ctorinit) ...@@ -723,7 +723,14 @@ bool AggregateDeclaration::fill(Loc loc, Expressions *elements, bool ctorinit)
else if (vx->_init) else if (vx->_init)
{ {
assert(!vx->_init->isVoidInitializer()); 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 else
{ {
......
...@@ -7731,3 +7731,14 @@ bool foo17407() ...@@ -7731,3 +7731,14 @@ bool foo17407()
static assert(!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; }));
/**
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;
/**
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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment