aboutsummaryrefslogtreecommitdiff
path: root/gcc/d
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2019-06-16 07:48:53 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-06-16 07:48:53 +0000
commita1543fb19ba17a455b0e9df5e373a1643082f5d2 (patch)
treec8157e15adef387be9ecc8d925829a547fbcb813 /gcc/d
parent70106db92654b83cd0ea62a078805e84ef2d8ee8 (diff)
downloadgcc-a1543fb19ba17a455b0e9df5e373a1643082f5d2.zip
gcc-a1543fb19ba17a455b0e9df5e373a1643082f5d2.tar.gz
gcc-a1543fb19ba17a455b0e9df5e373a1643082f5d2.tar.bz2
re PR d/90650 (ICE in fold_convert_loc, at fold-const.c:2552)
PR d/90650 d/dmd: Merge upstream dmd ab03e2918 Fixes internal compiler error in fold_convert_loc. Reviewed-on: https://github.com/dlang/dmd/pull/9996 gcc/testsuite/ChangeLog: 2019-06-16 Iain Buclaw <ibuclaw@gdcproject.org> PR d/90650 * gdc.dg/pr90650a.d: New test. * gdc.dg/pr90650b.d: New test. From-SVN: r272344
Diffstat (limited to 'gcc/d')
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/expressionsem.c6
-rw-r--r--gcc/d/dmd/mtype.c2
-rw-r--r--gcc/d/dmd/statementsem.c12
4 files changed, 21 insertions, 1 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 4cb2bba..7258fad 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-f30c5dc790c17914463879157447acc671518735
+ab03e2918508d62efcc5ee66c9a912a331b33aa0
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/expressionsem.c b/gcc/d/dmd/expressionsem.c
index 19b7ccb..ebdfae5 100644
--- a/gcc/d/dmd/expressionsem.c
+++ b/gcc/d/dmd/expressionsem.c
@@ -2185,6 +2185,9 @@ public:
}
if (exp->e1->op == TOKslice || exp->e1->type->ty == Tarray || exp->e1->type->ty == Tsarray)
{
+ if (checkNonAssignmentArrayOp(exp->e1))
+ return setError();
+
if (exp->e1->op == TOKslice)
((SliceExp *)exp->e1)->arrayop = true;
@@ -6232,6 +6235,9 @@ public:
assert(exp->e1->type && exp->e2->type);
if (exp->e1->op == TOKslice || exp->e1->type->ty == Tarray || exp->e1->type->ty == Tsarray)
{
+ if (checkNonAssignmentArrayOp(exp->e1))
+ return setError();
+
// T[] ^^= ...
if (exp->e2->implicitConvTo(exp->e1->type->nextOf()))
{
diff --git a/gcc/d/dmd/mtype.c b/gcc/d/dmd/mtype.c
index 058738e..2562f36 100644
--- a/gcc/d/dmd/mtype.c
+++ b/gcc/d/dmd/mtype.c
@@ -4468,6 +4468,8 @@ Expression *TypeDArray::dotExp(Scope *sc, Expression *e, Identifier *ident, int
}
if (e->op == TOKnull)
return new IntegerExp(e->loc, 0, Type::tsize_t);
+ if (checkNonAssignmentArrayOp(e))
+ return new ErrorExp();
e = new ArrayLengthExp(e->loc, e);
e->type = Type::tsize_t;
return e;
diff --git a/gcc/d/dmd/statementsem.c b/gcc/d/dmd/statementsem.c
index 64cc42d..ccf141e 100644
--- a/gcc/d/dmd/statementsem.c
+++ b/gcc/d/dmd/statementsem.c
@@ -95,6 +95,8 @@ public:
s->exp = semantic(s->exp, sc);
s->exp = resolveProperties(sc, s->exp);
s->exp = s->exp->addDtorHook(sc);
+ if (checkNonAssignmentArrayOp(s->exp))
+ s->exp = new ErrorExp();
if (FuncDeclaration *f = isFuncAddress(s->exp))
{
if (f->checkForwardRef(s->exp->loc))
@@ -370,6 +372,8 @@ public:
ds->condition = semantic(ds->condition, sc);
ds->condition = resolveProperties(sc, ds->condition);
+ if (checkNonAssignmentArrayOp(ds->condition))
+ ds->condition = new ErrorExp();
ds->condition = ds->condition->optimize(WANTvalue);
ds->condition = checkGC(sc, ds->condition);
@@ -440,6 +444,8 @@ public:
fs->condition = semantic(fs->condition, sc);
fs->condition = resolveProperties(sc, fs->condition);
+ if (checkNonAssignmentArrayOp(fs->condition))
+ fs->condition = new ErrorExp();
fs->condition = fs->condition->optimize(WANTvalue);
fs->condition = checkGC(sc, fs->condition);
fs->condition = fs->condition->toBoolean(sc);
@@ -450,6 +456,8 @@ public:
((CommaExp *)fs->increment)->allowCommaExp = true;
fs->increment = semantic(fs->increment, sc);
fs->increment = resolveProperties(sc, fs->increment);
+ if (checkNonAssignmentArrayOp(fs->increment))
+ fs->increment = new ErrorExp();
fs->increment = fs->increment->optimize(WANTvalue);
fs->increment = checkGC(sc, fs->increment);
}
@@ -1723,6 +1731,8 @@ public:
ifs->condition = resolveProperties(sc, ifs->condition);
ifs->condition = ifs->condition->addDtorHook(sc);
}
+ if (checkNonAssignmentArrayOp(ifs->condition))
+ ifs->condition = new ErrorExp();
ifs->condition = checkGC(sc, ifs->condition);
// Convert to boolean after declaring prm so this works:
@@ -1971,6 +1981,8 @@ public:
break;
}
}
+ if (checkNonAssignmentArrayOp(ss->condition))
+ ss->condition = new ErrorExp();
ss->condition = ss->condition->optimize(WANTvalue);
ss->condition = checkGC(sc, ss->condition);
if (ss->condition->op == TOKerror)