diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-01-03 08:49:48 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-01-03 08:49:48 +0100 |
commit | b848354bf9eb605abf358a61189b3f6dfd0d10af (patch) | |
tree | 01e2e8c076fa6f4446fd5beb9f9813339d371d2b /gcc | |
parent | 32a9b8e01ad5137c23b87d9ddf8aa0277e0cd4dc (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr51669.C | 32 |
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++) + ; +} |