re PR c++/26691 (Wrong code for constructor with default value)

PR c++/26691
	* cp-gimplify.c (cxx_omp_clause_apply_fn): Handle default arguments.

	* testsuite/libgomp.c++/pr26691.C: New test.

From-SVN: r112251
This commit is contained in:
Jakub Jelinek 2006-03-21 17:21:24 +01:00 committed by Jakub Jelinek
parent aa09f986bc
commit fae2b46b09
4 changed files with 53 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2006-03-21 Jakub Jelinek <jakub@redhat.com>
PR c++/26691
* cp-gimplify.c (cxx_omp_clause_apply_fn): Handle default arguments.
2006-03-21 Jason Merrill <jason@redhat.com>
PR c++/21581

View File

@ -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));
}
}

View File

@ -1,3 +1,8 @@
2006-03-21 Jakub Jelinek <jakub@redhat.com>
PR c++/26691
* testsuite/libgomp.c++/pr26691.C: New test.
2006-03-13 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.fortran/retval2.f90: New test.

View File

@ -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;
}