aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-03-21 17:21:24 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2006-03-21 17:21:24 +0100
commitfae2b46b091f4feb984ac9c51dd543f257d9dc94 (patch)
treed017f51f43b8ed4de93b45a1a613096f63eb1d5e /gcc
parentaa09f986bc1d3934932225d64ebca03a7eed65b3 (diff)
downloadgcc-fae2b46b091f4feb984ac9c51dd543f257d9dc94.zip
gcc-fae2b46b091f4feb984ac9c51dd543f257d9dc94.tar.gz
gcc-fae2b46b091f4feb984ac9c51dd543f257d9dc94.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-gimplify.c29
2 files changed, 28 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d754dd0..6a8c846 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index bd8f1a0..be85ebb 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));
}
}