re PR c++/6944 (missing feature on default copy-constructor for class with multi-dim arrays)

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: r55214
This commit is contained in:
Kriang Lerdsuwanakij 2002-07-03 15:46:21 +00:00 committed by Kriang Lerdsuwanakij
parent 61c07d3c9b
commit b2153b98f2
5 changed files with 111 additions and 8 deletions

View 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-03 Graham Stott <graham.stott@btinternet.com>
* pt.c (instantiate_class_template): Fix typo.

View File

@ -1161,11 +1161,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)));
@ -2586,6 +2584,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;
@ -3002,12 +3004,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);

View 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.
Wed Jul 3 10:25:41 2002 J"orn Rennecke <joern.rennecke@superh.com>
* gcc.c-torture/execute/simd-1.c (main): Also test &, |, ^, ~.

View File

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

View File

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