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:
parent
61c07d3c9b
commit
b2153b98f2
|
@ -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>
|
2002-07-03 Graham Stott <graham.stott@btinternet.com>
|
||||||
|
|
||||||
* pt.c (instantiate_class_template): Fix typo.
|
* pt.c (instantiate_class_template): Fix typo.
|
||||||
|
|
|
@ -1161,11 +1161,9 @@ build_aggr_init (exp, init, flags)
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
}
|
}
|
||||||
if (cp_type_quals (type) != TYPE_UNQUALIFIED)
|
if (cp_type_quals (type) != TYPE_UNQUALIFIED)
|
||||||
{
|
TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
|
||||||
TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
|
if (itype && cp_type_quals (itype) != TYPE_UNQUALIFIED)
|
||||||
if (init)
|
TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
|
||||||
TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
|
|
||||||
}
|
|
||||||
stmt_expr = build_vec_init (exp, init,
|
stmt_expr = build_vec_init (exp, init,
|
||||||
init && same_type_p (TREE_TYPE (init),
|
init && same_type_p (TREE_TYPE (init),
|
||||||
TREE_TYPE (exp)));
|
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. */
|
This is also the containing expression returned by this function. */
|
||||||
tree controller = NULL_TREE;
|
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))
|
if (! IS_AGGR_TYPE (type) || TYPE_HAS_TRIVIAL_DESTRUCTOR (type))
|
||||||
{
|
{
|
||||||
loop = integer_zero_node;
|
loop = integer_zero_node;
|
||||||
|
@ -3002,12 +3004,20 @@ build_vec_init (base, init, from_array)
|
||||||
&& from_array != 2)
|
&& from_array != 2)
|
||||||
{
|
{
|
||||||
tree e;
|
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_compound_stmt (/*has_no_scope=*/1, try_body);
|
||||||
finish_cleanup_try_block (try_block);
|
finish_cleanup_try_block (try_block);
|
||||||
e = build_vec_delete_1 (rval,
|
e = build_vec_delete_1 (rval, m,
|
||||||
cp_build_binary_op (MINUS_EXPR, maxindex,
|
|
||||||
iterator),
|
|
||||||
type,
|
type,
|
||||||
sfk_base_destructor,
|
sfk_base_destructor,
|
||||||
/*use_global_delete=*/0);
|
/*use_global_delete=*/0);
|
||||||
|
|
|
@ -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>
|
Wed Jul 3 10:25:41 2002 J"orn Rennecke <joern.rennecke@superh.com>
|
||||||
|
|
||||||
* gcc.c-torture/execute/simd-1.c (main): Also test &, |, ^, ~.
|
* gcc.c-torture/execute/simd-1.c (main): Also test &, |, ^, ~.
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue