aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gcc.gnu.org>2019-04-11 21:10:49 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-04-11 21:10:49 +0000
commit258ad81197cbd24452286d38975b0302342cffe0 (patch)
treea810310c1446a69e5fcff424692321ca05cd806d /gcc
parent9eda9f9231f287599413c684351b16576f2ee4d2 (diff)
downloadgcc-258ad81197cbd24452286d38975b0302342cffe0.zip
gcc-258ad81197cbd24452286d38975b0302342cffe0.tar.gz
gcc-258ad81197cbd24452286d38975b0302342cffe0.tar.bz2
d/dmd: Merge upstream dmd d7ed327ed
Fixes ICE when accessing empty array in CTFE. Reviewed-on: https://github.com/dlang/dmd/pull/9563 From-SVN: r270294
Diffstat (limited to 'gcc')
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/dinterpret.c7
-rw-r--r--gcc/testsuite/gdc.test/compilable/test19778.d6
3 files changed, 12 insertions, 3 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 31ea106..800be95 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-5dd3eccc3b0758346f77bee3cdc3f6bd15de339b
+d7ed327edb0b01ad56e7e73e77b3401cd565675e
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/dinterpret.c b/gcc/d/dmd/dinterpret.c
index 777f89c..40f3e77 100644
--- a/gcc/d/dmd/dinterpret.c
+++ b/gcc/d/dmd/dinterpret.c
@@ -6272,11 +6272,14 @@ Expression *scrubReturnValue(Loc loc, Expression *e)
/* Returns: true if e is void,
* or is an array literal or struct literal of void elements.
*/
-static bool isVoid(Expression *e)
+static bool isVoid(Expression *e, bool checkArray = false)
{
if (e->op == TOKvoid)
return true;
+ if (checkArray && e->type->ty != Tsarray)
+ return false;
+
if (e->op == TOKarrayliteral)
return isEntirelyVoid(((ArrayLiteralExp *)e)->elements);
@@ -6314,7 +6317,7 @@ Expression *scrubArray(Loc loc, Expressions *elems, bool structlit)
// A struct .init may contain void members.
// Static array members are a weird special case (bug 10994).
- if (structlit && isVoid(e))
+ if (structlit && isVoid(e, true))
{
e = NULL;
}
diff --git a/gcc/testsuite/gdc.test/compilable/test19778.d b/gcc/testsuite/gdc.test/compilable/test19778.d
new file mode 100644
index 0000000..87905fa
--- /dev/null
+++ b/gcc/testsuite/gdc.test/compilable/test19778.d
@@ -0,0 +1,6 @@
+struct S
+{
+ int[] data;
+}
+immutable X = S([]);
+enum len = X.data.length;