diff mbox

[2/3,Cilk+] Fix for PR61455

Message ID 0EFAB2BDD0F67E4FB6CCC8B9F87D756969A815B1@IRSMSX101.ger.corp.intel.com
State New
Headers show

Commit Message

Zamyatin, Igor July 12, 2014, 9:51 a.m. UTC
Hi!

This patch adds correct handling of declarations whit initializations that contain array notation. 
It fixes ICE in PR61455.

Regtested for x86_64 (along with the first patch in the chain).

Ok for trunk/4.9?

Thanks,
Igor 


gcc/c-family/ChangeLog:

2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>

      PR middle-end/61455
      * array-notation-common.c (extract_array_notation_exprs): Handling 
      of DECL_EXPR added.

gcc/c/ChangeLog:

2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>

      PR middle-end/61455
      * c-array-notation.c (expand_array_notations): Handling
      of DECL_EXPR added.
      
gcc/cp/ChangeLog:

2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>

      PR middle-end/61455
      * cp-array-notation.c (expand_array_notation_exprs): Handling of 
      DECL_EXPR improved. Changed handling for INIT_EXPR.

gcc/testsuite/ChangeLog:

2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>

      PR middle-end/61455
      * c-c++-common/cilk-plus/AN/pr61455.c: New test.
      * c-c++-common/cilk-plus/AN/pr61455-2.c: Likewise.

Comments

Jeff Law July 17, 2014, 1:42 a.m. UTC | #1
On 07/12/14 03:51, Zamyatin, Igor wrote:
> Hi!
>
> This patch adds correct handling of declarations whit initializations that contain array notation.
> It fixes ICE in PR61455.
>
> Regtested for x86_64 (along with the first patch in the chain).
>
> Ok for trunk/4.9?
>
> Thanks,
> Igor
>
>
> gcc/c-family/ChangeLog:
>
> 2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>
>
>        PR middle-end/61455
>        * array-notation-common.c (extract_array_notation_exprs): Handling
>        of DECL_EXPR added.
>
> gcc/c/ChangeLog:
>
> 2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>
>
>        PR middle-end/61455
>        * c-array-notation.c (expand_array_notations): Handling
>        of DECL_EXPR added.
>
> gcc/cp/ChangeLog:
>
> 2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>
>
>        PR middle-end/61455
>        * cp-array-notation.c (expand_array_notation_exprs): Handling of
>        DECL_EXPR improved. Changed handling for INIT_EXPR.
>
> gcc/testsuite/ChangeLog:
>
> 2014-07-08  Igor Zamyatin  <igor.zamyatin@intel.com>
>
>        PR middle-end/61455
>        * c-c++-common/cilk-plus/AN/pr61455.c: New test.
>        * c-c++-common/cilk-plus/AN/pr61455-2.c: Likewise.
This is fine for the trunk/4.9.  Thanks,
Jeff
diff mbox

Patch

diff --git a/gcc/c-family/array-notation-common.c b/gcc/c-family/array-notation-common.c
index c010039..84f6f45 100644
--- a/gcc/c-family/array-notation-common.c
+++ b/gcc/c-family/array-notation-common.c
@@ -329,6 +329,14 @@  extract_array_notation_exprs (tree node, bool ignore_builtin_fn,
       vec_safe_push (*array_list, node);
       return;
     }
+  if (TREE_CODE (node) == DECL_EXPR)
+    {
+      tree x = DECL_EXPR_DECL (node);
+      if (DECL_INITIAL (x))
+       extract_array_notation_exprs (DECL_INITIAL (x),
+                                     ignore_builtin_fn,
+                                     array_list);
+    }
   else if (TREE_CODE (node) == STATEMENT_LIST)
     {
       tree_stmt_iterator ii_tsi;
diff --git a/gcc/c/c-array-notation.c b/gcc/c/c-array-notation.c
index 67a8931..597adc9 100644
--- a/gcc/c/c-array-notation.c
+++ b/gcc/c/c-array-notation.c
@@ -1265,6 +1265,25 @@  expand_array_notations (tree *tp, int *walk_subtrees, void *)
                                         rhs_loc, rhs, TREE_TYPE (rhs));
       }
       break;
+    case DECL_EXPR:
+      {
+       tree x = DECL_EXPR_DECL (*tp);
+       if (DECL_INITIAL (x))
+         {
+           location_t loc = DECL_SOURCE_LOCATION (x);
+           tree lhs = x;
+           tree rhs = DECL_INITIAL (x);
+           DECL_INITIAL (x) = NULL;
+           tree new_modify_expr = build_modify_expr (loc, lhs,
+                                                     TREE_TYPE (lhs),
+                                                     NOP_EXPR,
+                                                     loc, rhs,
+                                                     TREE_TYPE(rhs));
+           expand_array_notations (&new_modify_expr, walk_subtrees, NULL);
+           *tp = new_modify_expr;
+         }
+      }
+      break;
     case CALL_EXPR:
       *tp = fix_array_notation_call_expr (*tp);
       break;
diff --git a/gcc/cp/cp-array-notation.c b/gcc/cp/cp-array-notation.c
index b45449b..31253ff 100644
--- a/gcc/cp/cp-array-notation.c
+++ b/gcc/cp/cp-array-notation.c
@@ -1148,13 +1148,13 @@  expand_array_notation_exprs (tree t)
     case PARM_DECL:
     case NON_LVALUE_EXPR:
     case NOP_EXPR:
-    case INIT_EXPR:
     case ADDR_EXPR:
     case ARRAY_REF:
     case BIT_FIELD_REF:
     case VECTOR_CST:
     case COMPLEX_CST:
       return t;
+    case INIT_EXPR:
     case MODIFY_EXPR:
       if (contains_array_notation_expr (t))
        t = expand_an_in_modify_expr (loc, TREE_OPERAND (t, 0), NOP_EXPR, 
@@ -1176,13 +1176,24 @@  expand_array_notation_exprs (tree t)
        return t;
       }
     case DECL_EXPR:
-      {
-       tree x = DECL_EXPR_DECL (t);
-       if (t && TREE_CODE (x) != FUNCTION_DECL)
+      if (contains_array_notation_expr (t))
+       {
+         tree x = DECL_EXPR_DECL (t);
          if (DECL_INITIAL (x))
-           t = expand_unary_array_notation_exprs (t);
+           {
+             location_t loc = DECL_SOURCE_LOCATION (x);
+             tree lhs = x;
+             tree rhs = DECL_INITIAL (x);
+             DECL_INITIAL (x) = NULL;
+             tree new_modify_expr = build_modify_expr (loc, lhs,
+                                                       TREE_TYPE (lhs),
+                                                       NOP_EXPR,
+                                                       loc, rhs,
+                                                       TREE_TYPE(rhs));
+             t = expand_array_notation_exprs (new_modify_expr);
+           }
+       }
       return t;
-      }
     case STATEMENT_LIST:
       {
        tree_stmt_iterator i;
diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61455-2.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61455-2.c
new file mode 100644
index 0000000..60b4248
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61455-2.c
@@ -0,0 +1,13 @@ 
+/* PR c++/61455 */
+/* { dg-options "-fcilkplus" } */
+
+int a[3] = {2, 3, 4};
+
+int main ()
+{
+  int c = 10;
+  int b = __sec_reduce_add(a[:]);
+  if (b+c != 19)
+    __builtin_abort();
+  return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61455.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61455.c
new file mode 100644
index 0000000..35a11b6
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61455.c
@@ -0,0 +1,9 @@ 
+/* PR c++/61455 */
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+void foo ()
+{
+  int a[2];
+  int b = a[:]; /* { dg-error "cannot be scalar" } */
+}