d: Fix ICE: gimplification failed (gimplify.c at 13436)
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 11 Aug 2019 06:53:14 +0000 (06:53 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sun, 11 Aug 2019 06:53:14 +0000 (06:53 +0000)
commit4c9dbb967f3948630ae9cc79283c62e01399737f
tree5aad5abb160dfa1ca76d34d25bdb39aeece848d2
parent05ba17fd7daf3174083989947bdc1c45de5bd7b8
d: Fix ICE: gimplification failed (gimplify.c at 13436)

The expression that caused the ICE

++(a += 1.0);

The D front-end rewrites and applies implicit type conversions so the
expression gets simplified as

(int)((double) a += 1.0) += 1

The codegen pass would subsequently generate the following invalid code

(int)(double) a = (int)((double) a + 1.0) + 1

The LHS expression `(int)(double) a', represented as a FIX_TRUNC_EXPR
being what trips as it is not a valid lvalue for assignment.

While LHS casts are stripped away, convert_expr adds a double cast
because it converts the expression to its original type before
converting it to its target type.  There is no valid reason why this is
done, so it has been removed.

gcc/d/ChangeLog:

PR d/90601
* d-convert.cc (convert_expr): Don't convert an expression to its
original front-end type before converting to its target type.

gcc/testsuite/ChangeLog:

PR d/90601
* gdc.dg/pr90601.d: New test.

From-SVN: r274263
gcc/d/ChangeLog
gcc/d/d-convert.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gdc.dg/pr90601.d [new file with mode: 0644]