re PR c++/51669 (ICE verify-gimple with openmp)
authorJakub Jelinek <jakub@redhat.com>
Tue, 3 Jan 2012 07:49:48 +0000 (08:49 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 3 Jan 2012 07:49:48 +0000 (08:49 +0100)
PR c++/51669
* semantics.c (finish_omp_clauses): Call fold_build_cleanup_point_expr
on OMP_CLAUSE_{IF,FINAL,NUM_THREADS,SCHEDULE_CHUNK}_EXPR.

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

From-SVN: r182828

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

index 9eb6882..beee3bf 100644 (file)
@@ -1,3 +1,9 @@
+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,FINAL,NUM_THREADS,SCHEDULE_CHUNK}_EXPR.
+
 2012-01-02  Jason Merrill  <jason@redhat.com>
 
        DR 1359
index 55b0a02..fbb74e1 100644 (file)
@@ -4,7 +4,7 @@
    and during the instantiation of template functions.
 
    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-                2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+                2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
    Written by Mark Mitchell (mmitchell@usa.net) based on code found
    formerly in parse.y and pt.c.
 
@@ -4067,6 +4067,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;
 
@@ -4075,6 +4077,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_FINAL_EXPR (c) = t;
          break;
 
@@ -4089,7 +4093,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:
@@ -4105,7 +4114,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 79d43fa..8e84b3a 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/51669
+       * g++.dg/gomp/pr51669.C: New test.
+
 2012-01-02  Jason Merrill  <jason@redhat.com>
 
        PR c++/51675
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..d5294dd
--- /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 ())) final (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++)
+    ;
+}