diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-03-21 17:21:24 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-03-21 17:21:24 +0100 |
commit | fae2b46b091f4feb984ac9c51dd543f257d9dc94 (patch) | |
tree | d017f51f43b8ed4de93b45a1a613096f63eb1d5e /gcc | |
parent | aa09f986bc1d3934932225d64ebca03a7eed65b3 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 29 |
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)); } } |