The C FE fails to handle VIEW_CONVERT_EXPR properly when folding
it in a lvalue context.  Fixed as follows.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Will commit as obvious.

Thanks,
Richard.

2017-12-14  Richard Biener  <rguent...@suse.de>

        PR c/83415
        c/
        * c-fold.c (c_fully_fold_internal): Treat VIEW_CONVERT_EXPR
        like REALPART_EXPR for the behavior of whether its operand
        is an lvalue.

        * gcc.dg/pr83415.c: New testcase.

Index: gcc/c/c-fold.c
===================================================================
--- gcc/c/c-fold.c      (revision 255622)
+++ gcc/c/c-fold.c      (working copy)
@@ -434,6 +434,7 @@ c_fully_fold_internal (tree expr, bool i
       goto unary;
     case REALPART_EXPR:
     case IMAGPART_EXPR:
+    case VIEW_CONVERT_EXPR:
       op0_lval = lval;
       /* FALLTHRU */
     case INDIRECT_REF:
@@ -441,7 +442,6 @@ c_fully_fold_internal (tree expr, bool i
     case FLOAT_EXPR:
     CASE_CONVERT:
     case ADDR_SPACE_CONVERT_EXPR:
-    case VIEW_CONVERT_EXPR:
     case NON_LVALUE_EXPR:
     case NEGATE_EXPR:
     case BIT_NOT_EXPR:
Index: gcc/testsuite/gcc.dg/pr83415.c
===================================================================
--- gcc/testsuite/gcc.dg/pr83415.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/pr83415.c      (working copy)
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+const short __attribute__((vector_size(16))) y = { 0, 1, 2, 3, 4, 5, 6, 7 };
+
+int
+main (int argc, short *argv[])
+{
+  int i = argc;
+  y[i] = 7 - i; /* { dg-warning "read-only" } */
+  return 0;
+}

Reply via email to