re PR c++/26691 (Wrong code for constructor with default value)
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Mar 2006 16:21:24 +0000 (17:21 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 21 Mar 2006 16:21:24 +0000 (17:21 +0100)
PR c++/26691
* cp-gimplify.c (cxx_omp_clause_apply_fn): Handle default arguments.

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

From-SVN: r112251

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr26691.C [new file with mode: 0644]

index d754dd00de589ea7aaf51cc842f429d7a1ad7d4c..6a8c8461fdc838ddd9bfcc5de2c2c524e71f1fe6 100644 (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
index bd8f1a0569f52aff8eb3b45e2a761f6a68bf7a86..be85ebb56f1d57a8d418580d2e26da9340df5041 100644 (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));
     }
 }
 
index f93bfa56371300276e867a9a26f4490b9453661d..33d1e78da2ee371ff0a9864f5c01065cd945a913 100644 (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.
diff --git a/libgomp/testsuite/libgomp.c++/pr26691.C b/libgomp/testsuite/libgomp.c++/pr26691.C
new file mode 100644 (file)
index 0000000..776b31e
--- /dev/null
@@ -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;
+ }
+