diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d754dd00de58..6a8c8461fdc8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-03-21 Jakub Jelinek + + PR c++/26691 + * cp-gimplify.c (cxx_omp_clause_apply_fn): Handle default arguments. + 2006-03-21 Jason Merrill PR c++/21581 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index bd8f1a0569f5..be85ebb56f1d 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -712,9 +712,16 @@ cp_genericize (tree fndecl) static tree cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2) { + tree defparm, parm; + int i; + if (fn == NULL) return NULL; + defparm = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn))); + if (arg2) + defparm = TREE_CHAIN (defparm); + if (TREE_CODE (TREE_TYPE (arg1)) == ARRAY_TYPE) { tree inner_type = TREE_TYPE (arg1); @@ -757,11 +764,16 @@ cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2) t = build1 (LABEL_EXPR, void_type_node, lab); append_to_statement_list (t, &ret); - t = NULL; + t = tree_cons (NULL, p1, NULL); if (arg2) t = tree_cons (NULL, p2, t); - t = tree_cons (NULL, p1, t); - t = build_call (fn, t); + /* Handle default arguments. */ + i = 1 + (arg2 != NULL); + for (parm = defparm; parm != void_list_node; parm = TREE_CHAIN (parm)) + t = tree_cons (NULL, convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), + fn, i++), t); + t = build_call (fn, nreverse (t)); append_to_statement_list (t, &ret); t = fold_convert (TREE_TYPE (p1), TYPE_SIZE_UNIT (inner_type)); @@ -785,11 +797,16 @@ cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2) } else { - tree t = NULL; + tree t = tree_cons (NULL, build_fold_addr_expr (arg1), NULL); if (arg2) t = tree_cons (NULL, build_fold_addr_expr (arg2), t); - t = tree_cons (NULL, build_fold_addr_expr (arg1), t); - return build_call (fn, t); + /* Handle default arguments. */ + i = 1 + (arg2 != NULL); + for (parm = defparm; parm != void_list_node; parm = TREE_CHAIN (parm)) + t = tree_cons (NULL, convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), + fn, i++), t); + return build_call (fn, nreverse (t)); } } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index f93bfa563713..33d1e78da2ee 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2006-03-21 Jakub Jelinek + + PR c++/26691 + * testsuite/libgomp.c++/pr26691.C: New test. + 2006-03-13 Jakub Jelinek * testsuite/libgomp.fortran/retval2.f90: New test. diff --git a/libgomp/testsuite/libgomp.c++/pr26691.C b/libgomp/testsuite/libgomp.c++/pr26691.C new file mode 100644 index 000000000000..776b31e24fb1 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/pr26691.C @@ -0,0 +1,20 @@ +// PR c++/26691 + +struct A +{ + int n; + A (int i = 3) : n (i) {} +}; + +int +main () +{ + A a; + int err = 0; +#pragma omp parallel private (a) reduction (+:err) + if (a.n != 3) + err++; + + return err; + } +