From: Jakub Jelinek Date: Sat, 12 Nov 2005 20:44:55 +0000 (+0100) Subject: re PR c++/24780 (ICE set_mem_attributes_minus_bitpos) X-Git-Tag: releases/gcc-4.1.0~904 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=73bebd55f00bd2b0c8e210c2fdd224b3987be7cd;p=thirdparty%2Fgcc.git re PR c++/24780 (ICE set_mem_attributes_minus_bitpos) PR c++/24780 * typeck.c (complete_type): Set TYPE_NEEDS_CONSTRUCTING and TYPE_HAS_NONTRIVIAL_DESTRUCTOR flags for all variants of array type. * g++.dg/opt/pr24780.C: New test. From-SVN: r106833 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5736a0d24454..6edab04fe2bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2005-11-12 Jakub Jelinek + PR c++/24780 + * typeck.c (complete_type): Set TYPE_NEEDS_CONSTRUCTING + and TYPE_HAS_NONTRIVIAL_DESTRUCTOR flags for all variants + of array type. + PR c++/24761 * pt.c (tsubst_copy_asm_operands): New function. (tsubst_expr) : Use it. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index b9be6fd694ff..31e2d6f58fc7 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -107,12 +107,18 @@ complete_type (tree type) else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type)) { tree t = complete_type (TREE_TYPE (type)); + unsigned int needs_constructing, has_nontrivial_dtor; if (COMPLETE_TYPE_P (t) && !dependent_type_p (type)) layout_type (type); - TYPE_NEEDS_CONSTRUCTING (type) + needs_constructing = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t)); - TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) + has_nontrivial_dtor = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (t)); + for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) + { + TYPE_NEEDS_CONSTRUCTING (t) = needs_constructing; + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = has_nontrivial_dtor; + } } else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type)) instantiate_class_template (TYPE_MAIN_VARIANT (type)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5500af19e5f1..e9cc432b966b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2005-11-12 Jakub Jelinek + PR c++/24780 + * g++.dg/opt/pr24780.C: New test. + PR c++/24761 * g++.dg/template/asm1.C: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr24780.C b/gcc/testsuite/g++.dg/opt/pr24780.C new file mode 100644 index 000000000000..7baad386bf51 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr24780.C @@ -0,0 +1,14 @@ +// PR c++/24780 +// { dg-do compile } + +template +struct Move { + Move(); + static Move const MOVES[2][2]; +}; +template + Move const Move::MOVES[2][2]={}; +typedef Move const MoveClass; +void moves(int x, int y) { + &MoveClass::MOVES[x][y]; +}