aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-01-03 08:49:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-01-03 08:49:48 +0100
commitb848354bf9eb605abf358a61189b3f6dfd0d10af (patch)
tree01e2e8c076fa6f4446fd5beb9f9813339d371d2b
parent32a9b8e01ad5137c23b87d9ddf8aa0277e0cd4dc (diff)
downloadgcc-b848354bf9eb605abf358a61189b3f6dfd0d10af.zip
gcc-b848354bf9eb605abf358a61189b3f6dfd0d10af.tar.gz
gcc-b848354bf9eb605abf358a61189b3f6dfd0d10af.tar.bz2
re PR c++/51669 (ICE verify-gimple with openmp)
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr51669.C32
4 files changed, 60 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9eb6882..beee3bf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 55b0a02..fbb74e1 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 79d43fa..8e84b3a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..d5294dd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr51669.C
@@ -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++)
+ ;
+}