diff options
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr31598.C | 59 | ||||
-rw-r--r-- | gcc/tree-inline.c | 2 |
6 files changed, 74 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b99d5272091..bc48621e093 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2007-04-26 Jakub Jelinek <jakub@redhat.com> + PR c++/31598 + * tree-inline.c (copy_body_r): Don't touch TREE_TYPE of OMP_CLAUSE. + PR tree-optimization/30558 * tree-eh.c (lower_eh_filter): If EH_FILTER_MUST_NOT_THROW clear this_state.prev_try. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cb9840f4342..6fea3c6b649 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-04-26 Jakub Jelinek <jakub@redhat.com> + + PR c++/31598 + * semantics.c (finish_omp_clauses): Don't create CP_OMP_CLAUSE_INFO + for type dependent OMP_CLAUSE_DECLs. + 2007-04-24 Mark Mitchell <mark@codesourcery.com> PR c++/31338 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c683ba298ff..a920bfb6ce7 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3627,7 +3627,8 @@ finish_omp_clauses (tree clauses) Save the results, because later we won't be in the right context for making these queries. */ if (CLASS_TYPE_P (inner_type) - && (need_default_ctor || need_copy_ctor || need_copy_assignment)) + && (need_default_ctor || need_copy_ctor || need_copy_assignment) + && !type_dependent_expression_p (t)) { int save_errorcount = errorcount; tree info; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d75284ce407..4667c9da9b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-04-26 Jakub Jelinek <jakub@redhat.com> + PR c++/31598 + * g++.dg/gomp/pr31598.C: New test. + PR tree-optimization/30558 * g++.dg/gomp/pr30558.C: New test. diff --git a/gcc/testsuite/g++.dg/gomp/pr31598.C b/gcc/testsuite/g++.dg/gomp/pr31598.C new file mode 100644 index 00000000000..3ebcead5ac9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr31598.C @@ -0,0 +1,59 @@ +// PR c++/31598 +// { dg-do compile } +// +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Theodore.Papadopoulo +// 16 Apr 2007 <Theodore.Papadopoulo@sophia.inria.fr> + +int i; +template <typename> struct A { A() {} }; +template <typename> struct C { C() { i++; } C(const C &) { i += 2; } }; +struct D { D() {} }; + +struct M { typedef double E; }; + +template <typename T> +struct R +{ + R() + { + typedef A<typename T::E> B; + B b; + #pragma omp parallel for firstprivate(b) schedule(guided) + for (int t = 0; t < 10; ++t) + ; + } +}; + +template <typename T> +struct S +{ + S() + { + typedef C<typename T::E> B; + B b; + #pragma omp parallel for firstprivate(b) + for (int t = 0; t < 10; ++t) + ; + } +}; + +struct U +{ + U() + { + D b; + #pragma omp parallel for firstprivate(b) + for (int t = 0; t < 10; ++t) + ; + } +}; + +int +main () +{ + R<M> r; + S<M> s; + U u; + return 0; +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index ff76b7557c1..77d38646054 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -731,7 +731,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data) (NULL_TREE, id->eh_region_offset + TREE_INT_CST_LOW (TREE_OPERAND (*tp, 0))); - if (!GIMPLE_TUPLE_P (*tp)) + if (!GIMPLE_TUPLE_P (*tp) && TREE_CODE (*tp) != OMP_CLAUSE) TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id); /* The copied TARGET_EXPR has never been expanded, even if the |