Commit 4c9dbb96 by Iain Buclaw Committed by Iain Buclaw

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
parent 05ba17fd
2019-08-11 Iain Buclaw <ibuclaw@gdcproject.org>
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.
2019-08-10 Iain Buclaw <ibuclaw@gdcproject.org>
PR d/91238
......
......@@ -588,7 +588,6 @@ convert_expr (tree exp, Type *etype, Type *totype)
return compound_expr (exp, build_zero_cst (build_ctype (tbtype)));
}
exp = fold_convert (build_ctype (etype), exp);
gcc_assert (TREE_CODE (exp) != STRING_CST);
break;
}
......
2019-08-11 Iain Buclaw <ibuclaw@gdcproject.org>
PR d/90601
* gdc.dg/pr90601.d: New test.
2019-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
* gfortran.dg/boz_8.f90: Adjust error messages.
......
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90601
// { dg-do compile }
int postincr(int a)
{
return (a += 1.0)++;
}
int postdecr(int a)
{
return (a -= 1.0)--;
}
int preincr(int a)
{
return ++(a += 1.0);
}
int predecr(int a)
{
return --(a -= 1.0);
}
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