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)
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]

index 04eaccf3fed52af6ae81da927c1d701199147e85..5aa50a26ab506fdf106646ba07e3b580eba07b1b 100644 (file)
@@ -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
index b020eab902f801609eb2abd213919a915d9b1c5b..fd4fc3c692dbf94f90eef2408e6f0ec724cd7ff5 100644 (file)
@@ -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;
     }
index adf661130bc60432f6522cc76d786bfd54a2e37c..fdcb620c3be6e37d4176a222d64db11dc85ef7d4 100644 (file)
@@ -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.
diff --git a/gcc/testsuite/gdc.dg/pr90601.d b/gcc/testsuite/gdc.dg/pr90601.d
new file mode 100644 (file)
index 0000000..88cdaf8
--- /dev/null
@@ -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);
+}