re PR fortran/27446 (ICE on OpenMP array REDUCTION clause)
authorJakub Jelinek <jakub@redhat.com>
Mon, 15 May 2006 09:57:54 +0000 (11:57 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 15 May 2006 09:57:54 +0000 (11:57 +0200)
PR fortran/27446
* trans-openmp.c (gfc_trans_omp_array_reduction): Ensure
OMP_CLAUSE_REDUCTION_{INIT,MERGE} are set to BIND_EXPR.

From-SVN: r113787

gcc/fortran/ChangeLog
gcc/fortran/trans-openmp.c

index fadf75031f7b65593679e3aec19f03eeb9460e7b..f5c36e7a70414d7a8e587643857df266b05f3763 100644 (file)
@@ -1,3 +1,9 @@
+2006-05-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/27446
+       * trans-openmp.c (gfc_trans_omp_array_reduction): Ensure
+       OMP_CLAUSE_REDUCTION_{INIT,MERGE} are set to BIND_EXPR.
+
 2006-05-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Make-lang.in (fortran/options.o): Depend on $(TARGET_H).
index bd57836713a88b041c53b821c036d8c3b2e384a6..f33f1bd374104fff20e3184fc01f75894647e91a 100644 (file)
@@ -262,7 +262,7 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
   gfc_symbol init_val_sym, outer_sym, intrinsic_sym;
   gfc_expr *e1, *e2, *e3, *e4;
   gfc_ref *ref;
-  tree decl, backend_decl;
+  tree decl, backend_decl, stmt;
   locus old_loc = gfc_current_locus;
   const char *iname;
   try t;
@@ -400,10 +400,22 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
   gcc_assert (t == SUCCESS);
 
   /* Create the init statement list.  */
-  OMP_CLAUSE_REDUCTION_INIT (c) = gfc_trans_assignment (e1, e2);
+  pushlevel (0);
+  stmt = gfc_trans_assignment (e1, e2);
+  if (TREE_CODE (stmt) != BIND_EXPR)
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+  else
+    poplevel (0, 0, 0);
+  OMP_CLAUSE_REDUCTION_INIT (c) = stmt;
 
   /* Create the merge statement list.  */
-  OMP_CLAUSE_REDUCTION_MERGE (c) = gfc_trans_assignment (e3, e4);
+  pushlevel (0);
+  stmt = gfc_trans_assignment (e3, e4);
+  if (TREE_CODE (stmt) != BIND_EXPR)
+    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0));
+  else
+    poplevel (0, 0, 0);
+  OMP_CLAUSE_REDUCTION_MERGE (c) = stmt;
 
   /* And stick the placeholder VAR_DECL into the clause as well.  */
   OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = outer_sym.backend_decl;