]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/51669 (ICE verify-gimple with openmp)
authorJakub Jelinek <jakub@redhat.com>
Thu, 9 Feb 2012 17:17:36 +0000 (18:17 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 9 Feb 2012 17:17:36 +0000 (18:17 +0100)
Backported from mainline
2012-01-03  Jakub Jelinek  <jakub@redhat.com>

PR c++/51669
* semantics.c (finish_omp_clauses): Call fold_build_cleanup_point_expr
on OMP_CLAUSE_{IF,NUM_THREADS,SCHEDULE_CHUNK}_EXPR.

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

From-SVN: r184051

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

index cd1881a95a8c435c3223e8b5959d65f77cd31f4b..15e93a5ed804b9c9af9c81964922f538c91bf48a 100644 (file)
@@ -1,6 +1,12 @@
 2012-02-09  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2012-01-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/51669
+       * semantics.c (finish_omp_clauses): Call fold_build_cleanup_point_expr
+       on OMP_CLAUSE_{IF,NUM_THREADS,SCHEDULE_CHUNK}_EXPR.
+
        2011-12-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/51360
index 3af9bb9ceac251b7b68c5d14f68eed7fec03ff8d..cf4f5c883903722bbeee4a319519812cd284ab4f 100644 (file)
@@ -3804,6 +3804,8 @@ finish_omp_clauses (tree clauses)
          t = maybe_convert_cond (t);
          if (t == error_mark_node)
            remove = true;
+         else if (!processing_template_decl)
+           t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
          OMP_CLAUSE_IF_EXPR (c) = t;
          break;
 
@@ -3818,7 +3820,12 @@ finish_omp_clauses (tree clauses)
              remove = true;
            }
          else
-           OMP_CLAUSE_NUM_THREADS_EXPR (c) = mark_rvalue_use (t);
+           {
+             t = mark_rvalue_use (t);
+             if (!processing_template_decl)
+               t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
+             OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
+           }
          break;
 
        case OMP_CLAUSE_SCHEDULE:
@@ -3834,7 +3841,12 @@ finish_omp_clauses (tree clauses)
              remove = true;
            }
          else
-           OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = mark_rvalue_use (t);
+           {
+             t = mark_rvalue_use (t);
+             if (!processing_template_decl)
+               t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
+             OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
+           }
          break;
 
        case OMP_CLAUSE_NOWAIT:
index 1c5a1b7071eda49159f554081684dc3a4d4eb6c3..26d0900dad1690e7dabb518503e30a3a0d5fdd86 100644 (file)
@@ -1,6 +1,11 @@
 2012-02-09  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2012-01-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/51669
+       * g++.dg/gomp/pr51669.C: New test.
+
        2011-12-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/51360
diff --git a/gcc/testsuite/g++.dg/gomp/pr51669.C b/gcc/testsuite/g++.dg/gomp/pr51669.C
new file mode 100644 (file)
index 0000000..ab99d93
--- /dev/null
@@ -0,0 +1,32 @@
+// PR c++/51669
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T> const T & min (const T &, const T &);
+
+void
+f1 ()
+{
+#pragma omp parallel num_threads (min (4, 5))
+  ;
+}
+
+struct A { A (); ~A (); };
+int foo (const A &);
+
+void
+f2 ()
+{
+  int i;
+#pragma omp parallel if (foo (A ())) num_threads (foo (A ()))
+  ;
+#pragma omp task if (foo (A ()))
+  ;
+#pragma omp for schedule (static, foo (A ()))
+  for (i = 0; i < 10; i++)
+    ;
+#pragma omp parallel for schedule (static, foo (A ())) \
+  if (foo (A ())) num_threads (foo (A ()))
+  for (i = 0; i < 10; i++)
+    ;
+}