From: Jakub Jelinek Date: Tue, 19 Feb 2008 10:18:29 +0000 (+0100) Subject: re PR c++/35028 (ICE with strange ctor and firstprivate) X-Git-Tag: releases/gcc-4.4.0~6421 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d2ee546fd6d04c56754647e5c21d3fa7e4f11294;p=thirdparty%2Fgcc.git re PR c++/35028 (ICE with strange ctor and firstprivate) PR c++/35028 * cp-gimplify.c (cxx_omp_clause_apply_fn): Handle vararg copy ctors. * g++.dg/gomp/pr35028.C: New test. From-SVN: r132426 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 386ff722c53e..6f016fcfce5f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2008-02-19 Jakub Jelinek + PR c++/35028 + * cp-gimplify.c (cxx_omp_clause_apply_fn): Handle vararg copy ctors. + PR c++/34964 PR c++/35244 * semantics.c (finish_omp_threadprivate): Do nothing for error_operand_p diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 50b40484413d..498ecc5379aa 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -844,7 +844,8 @@ cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2) if (arg2) argarray[i++] = p2; /* Handle default arguments. */ - for (parm = defparm; parm != void_list_node; parm = TREE_CHAIN (parm), i++) + for (parm = defparm; parm && parm != void_list_node; + parm = TREE_CHAIN (parm), i++) argarray[i] = convert_default_arg (TREE_VALUE (parm), TREE_PURPOSE (parm), fn, i); t = build_call_a (fn, i, argarray); @@ -875,7 +876,7 @@ cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2) if (arg2) argarray[i++] = build_fold_addr_expr (arg2); /* Handle default arguments. */ - for (parm = defparm; parm != void_list_node; + for (parm = defparm; parm && parm != void_list_node; parm = TREE_CHAIN (parm), i++) argarray[i] = convert_default_arg (TREE_VALUE (parm), TREE_PURPOSE (parm), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b5ab00f0b670..5e2d40c1d69a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2008-02-19 Jakub Jelinek + PR c++/35028 + * g++.dg/gomp/pr35028.C: New test. + PR c++/34964 PR c++/35244 * gcc.dg/gomp/pr34964.c: New test. diff --git a/gcc/testsuite/g++.dg/gomp/pr35028.C b/gcc/testsuite/g++.dg/gomp/pr35028.C new file mode 100644 index 000000000000..ef7ba07de178 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35028.C @@ -0,0 +1,19 @@ +// PR c++/35028 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + A (); + A (const A &, ...); + ~A (); + A operator++ (int); +}; + +void +foo () +{ + A a; + #pragma omp parallel firstprivate (a) + a++; +}