OSDN Git Service

PR c++/32177
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jun 2007 23:11:23 +0000 (23:11 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jun 2007 23:11:23 +0000 (23:11 +0000)
* semantics.c (finish_omp_for): Call fold_build_cleanup_point_expr
on init, the non-decl cond operand and increment value.

* g++.dg/gomp/pr32177.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125544 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr32177.C [new file with mode: 0644]

index bc6bdd1..509f8ad 100644 (file)
@@ -1,3 +1,9 @@
+2007-06-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/32177
+       * semantics.c (finish_omp_for): Call fold_build_cleanup_point_expr
+       on init, the non-decl cond operand and increment value.
+
 2007-06-07  Simon Martin  <simartin@users.sourceforge.net>
 
        PR c++/30759
index 4a9ea8c..dc4a9f7 100644 (file)
@@ -3806,6 +3806,8 @@ tree
 finish_omp_for (location_t locus, tree decl, tree init, tree cond,
                tree incr, tree body, tree pre_body)
 {
+  tree omp_for;
+
   if (decl == NULL)
     {
       if (init != NULL)
@@ -3883,8 +3885,31 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
       add_stmt (pre_body);
       pre_body = NULL;
     }
+
+  init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
   init = build_modify_expr (decl, NOP_EXPR, init);
-  return c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body);
+  if (cond && TREE_SIDE_EFFECTS (cond) && COMPARISON_CLASS_P (cond))
+    {
+      int n = TREE_SIDE_EFFECTS (TREE_OPERAND (cond, 1)) != 0;
+      tree t = TREE_OPERAND (cond, n);
+
+      TREE_OPERAND (cond, n)
+       = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
+    }
+  omp_for = c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body);
+  if (omp_for != NULL
+      && TREE_CODE (OMP_FOR_INCR (omp_for)) == MODIFY_EXPR
+      && TREE_SIDE_EFFECTS (TREE_OPERAND (OMP_FOR_INCR (omp_for), 1))
+      && BINARY_CLASS_P (TREE_OPERAND (OMP_FOR_INCR (omp_for), 1)))
+    {
+      tree t = TREE_OPERAND (OMP_FOR_INCR (omp_for), 1);
+      int n = TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)) != 0;
+
+      TREE_OPERAND (t, n)
+       = fold_build_cleanup_point_expr (TREE_TYPE (TREE_OPERAND (t, n)),
+                                        TREE_OPERAND (t, n));
+    }
+  return omp_for;
 }
 
 void
index e315740..4c51713 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/32177
+       * g++.dg/gomp/pr32177.C: New test.
+
 2007-06-07  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
        PR testsuite/25241
diff --git a/gcc/testsuite/g++.dg/gomp/pr32177.C b/gcc/testsuite/g++.dg/gomp/pr32177.C
new file mode 100644 (file)
index 0000000..55c8483
--- /dev/null
@@ -0,0 +1,46 @@
+// PR c++/32177
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+//
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo 1 Jun 2007 <Theodore.Papadopoulo@sophia.inria.fr>
+
+struct A
+{
+  A () {}
+  ~A () {}
+  int s () const { return 1; }
+};
+
+void
+f1 ()
+{
+  #pragma omp parallel for
+    for (int i = 1; i <= A ().s (); ++i)
+      ;
+}
+
+void
+f2 ()
+{
+  #pragma omp parallel for
+    for (int i = A ().s (); i <= 20; ++i)
+      ;
+}
+
+void
+f3 ()
+{
+  #pragma omp parallel for
+    for (int i = 1; i <= 20; i += A ().s ())
+      ;
+}
+
+void
+f4 ()
+{
+  int i;
+  #pragma omp parallel for
+    for (i = A ().s (); i <= 20; i++)
+      ;
+}