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
This commit is contained in:
parent
05ba17fd7d
commit
4c9dbb967f
4 changed files with 33 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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.
|
||||
|
|
22
gcc/testsuite/gdc.dg/pr90601.d
Normal file
22
gcc/testsuite/gdc.dg/pr90601.d
Normal file
|
@ -0,0 +1,22 @@
|
|||
// 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);
|
||||
}
|
Loading…
Add table
Reference in a new issue