2008-05-23 Jakub Jelinek <jakub@redhat.com> PR c++/36237 * cp-gimplify.c (cxx_omp_clause_apply_fn): Call fold_build_cleanup_point_expr on build_call_a results. * g++.dg/gomp/pr36237.C: New test. --- gcc/cp/cp-gimplify.c (revision 135801) +++ gcc/cp/cp-gimplify.c (revision 135802) @@ -831,6 +831,8 @@ cxx_omp_clause_apply_fn (tree fn, tree a TREE_PURPOSE (parm), fn, i++), t); t = build_call (fn, nreverse (t)); + t = fold_convert (void_type_node, t); + t = fold_build_cleanup_point_expr (TREE_TYPE (t), t); append_to_statement_list (t, &ret); t = fold_convert (TREE_TYPE (p1), TYPE_SIZE_UNIT (inner_type)); @@ -863,7 +865,9 @@ cxx_omp_clause_apply_fn (tree fn, tree a t = tree_cons (NULL, convert_default_arg (TREE_VALUE (parm), TREE_PURPOSE (parm), fn, i++), t); - return build_call (fn, nreverse (t)); + t = build_call (fn, nreverse (t)); + t = fold_convert (void_type_node, t); + return fold_build_cleanup_point_expr (TREE_TYPE (t), t); } } --- gcc/testsuite/g++.dg/gomp/pr36237.C (revision 0) +++ gcc/testsuite/g++.dg/gomp/pr36237.C (revision 135802) @@ -0,0 +1,25 @@ +// PR c++/36237 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + ~A (); +}; + +struct B +{ + B (const A &x = A ()) : a (x) { } + A a; +}; + +B var; + +void bar (); + +void +foo () +{ + #pragma omp parallel private (var) + bar (); +}