]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/6944 (missing feature on default copy-constructor for class with multi...
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Wed, 3 Jul 2002 15:02:15 +0000 (15:02 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Wed, 3 Jul 2002 15:02:15 +0000 (15:02 +0000)
PR c++/6944
* init.c (build_aggr_init): Remove qualifiers of init before calling
build_vec_init.
(build_vec_init): Flatten multi-dimensional array during cleanup.
(build_vec_delete_1): Abort if the type of each element is array.

* g++.dg/init/array4.C: New test.
* g++.dg/init/array5.C: New test.

From-SVN: r55213

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/array4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/array5.C [new file with mode: 0644]

index ed2af18cf5383ffe015f6f45bea50c35b8c40cbc..bbb5eb344ce114ab781088b5e98d051a6fbcd2d0 100644 (file)
@@ -1,3 +1,11 @@
+2002-07-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/6944
+       * init.c (build_aggr_init): Remove qualifiers of init before calling
+       build_vec_init.
+       (build_vec_init): Flatten multi-dimensional array during cleanup.
+       (build_vec_delete_1): Abort if the type of each element is array.
+
 2002-07-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/6716
index c663da9649af9a2c7603d7aa7d9476e6b2c104f8..369e511edd7f3442b195693ad0fc33cab6de848c 100644 (file)
@@ -1183,11 +1183,9 @@ build_aggr_init (exp, init, flags)
          return error_mark_node;
        }
       if (cp_type_quals (type) != TYPE_UNQUALIFIED)
-       {
-         TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
-         if (init)
-           TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
-       }
+       TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
+      if (itype && cp_type_quals (itype) != TYPE_UNQUALIFIED)
+       TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
       stmt_expr = build_vec_init (exp, init,
                                  init && same_type_p (TREE_TYPE (init),
                                                       TREE_TYPE (exp)));
@@ -2593,6 +2591,10 @@ build_vec_delete_1 (base, maxindex, type, auto_delete_vec, use_global_delete)
      This is also the containing expression returned by this function.  */
   tree controller = NULL_TREE;
 
+  /* We should only have 1-D arrays here.  */
+  if (TREE_CODE (type) == ARRAY_TYPE)
+    abort ();
+
   if (! IS_AGGR_TYPE (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
     {
       loop = integer_zero_node;
@@ -3006,12 +3008,20 @@ build_vec_init (base, init, from_array)
       && from_array != 2)
     {
       tree e;
+      tree m = cp_build_binary_op (MINUS_EXPR, maxindex, iterator);
+
+      /* Flatten multi-dimensional array since build_vec_delete only
+        expects one-dimensional array.  */
+      if (TREE_CODE (type) == ARRAY_TYPE)
+       {
+         m = cp_build_binary_op (MULT_EXPR, m,
+                                 array_type_nelts_total (type));
+         type = strip_array_types (type);
+       }
 
       finish_compound_stmt (/*has_no_scope=*/1, try_body);
       finish_cleanup_try_block (try_block);
-      e = build_vec_delete_1 (rval,
-                             cp_build_binary_op (MINUS_EXPR, maxindex, 
-                                                 iterator),
+      e = build_vec_delete_1 (rval, m,
                              type,
                              sfk_base_destructor,
                              /*use_global_delete=*/0);
index 8c1d0b0e8e7f5997e3c032c1cc09633e0abca72d..56d9ea13c244a0a6cd4419416e7307ce6b501fa1 100644 (file)
@@ -1,3 +1,9 @@
+2002-07-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/6944
+       * g++.dg/init/array4.C: New test.
+       * g++.dg/init/array5.C: New test.
+
 2002-07-02  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/6716
diff --git a/gcc/testsuite/g++.dg/init/array4.C b/gcc/testsuite/g++.dg/init/array4.C
new file mode 100644 (file)
index 0000000..67519bf
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-do compile }
+// Origin: Markus Breuer <markus.breuer@materna.de>
+
+// PR c++/6944
+// Fail to synthesize copy constructor of multi-dimensional
+// array of class.
+
+#include <string>
+
+class Array
+{
+public:
+   std::string m_array[10][20][30];
+};
+
+Array func()
+{
+   Array result;
+   return result; // sorry, not implemented: cannot initialize multi-dimensional array with initializer
+}
+
+
+int main()
+{
+   Array arr = func();
+}
+
diff --git a/gcc/testsuite/g++.dg/init/array5.C b/gcc/testsuite/g++.dg/init/array5.C
new file mode 100644 (file)
index 0000000..aeacb31
--- /dev/null
@@ -0,0 +1,52 @@
+// { dg-do run }
+// Copyright (C) 2002 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+// Incorrect construction and destruction of multi-dimensional
+// array of class.
+
+extern "C" void abort();
+extern "C" int printf(const char *, ...);
+
+int count;
+int num;
+
+struct A
+{
+       A()
+       {
+               if (count == num)
+                       throw "";
+               count++;
+#ifdef PRINT
+               printf("ctor %p\n", static_cast<void *>(this));
+#endif
+       }
+
+       ~A()
+       {
+               count--;
+#ifdef PRINT
+               printf("dtor %p\n", static_cast<void *>(this));
+#endif
+       }
+};
+
+struct Array
+{
+       A array[2][2][2];
+};
+
+int main()
+{
+       for (num = 0; num <= 8; ++num) {
+               count = 0;
+               try {
+                       Array A;
+               }
+               catch (...) {
+               }
+               if (count != 0)
+                       abort();
+       }
+}