From b8063b2909a05268a1dc6863b9fb2487595b8580 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 26 Apr 2007 02:29:43 +0000 Subject: [PATCH] re PR target/31388 (ICE building libiberty multilib for mips16 multilibs) PR c++/31388 * cp-tree.h (ARITHMETIC_TYPE): Include COMPLEX_TYPE. * typeck.c (type_after_usual_arithmetic_conversions): Adjust, as COMPLEX_TYPE is now an ARITHMETIC_TYPE. * init.c (build_zero_init): Adjust, as COMPLEX_TYPE is now a SCALAR_TYPE. * typeck2.c (digest_init): Allow brace-enclosed initializers for COMPLEX_TYPE, even though that is now a SCALAR_TYPE. PR c++/31388 * g++.dg/ext/complex2.C: New test. From-SVN: r124172 --- gcc/cp/ChangeLog | 11 +++++++++++ gcc/cp/cp-tree.h | 11 +++++++++-- gcc/cp/init.c | 3 +-- gcc/cp/typeck.c | 6 ++---- gcc/cp/typeck2.c | 3 ++- gcc/testsuite/g++.dg/ext/complex2.C | 5 +++++ 6 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/complex2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37b7742734e..3846c0bb6a1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2007-04-24 Mark Mitchell + + PR c++/31388 + * cp-tree.h (ARITHMETIC_TYPE): Include COMPLEX_TYPE. + * typeck.c (type_after_usual_arithmetic_conversions): Adjust, as + COMPLEX_TYPE is now an ARITHMETIC_TYPE. + * init.c (build_zero_init): Adjust, as + COMPLEX_TYPE is now a SCALAR_TYPE. + * typeck2.c (digest_init): Allow brace-enclosed initializers for + COMPLEX_TYPE, even though that is now a SCALAR_TYPE. + 2007-04-25 Paolo Carlini * semantics.c (classtype_has_nothrow_copy_or_assign_p): Adjust diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 27f5b8caf89..fb682c7ee04 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2660,14 +2660,21 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) /* [basic.fundamental] Integral and floating types are collectively called arithmetic - types. Keep these checks in ascending code order. */ + types. + + As a GNU extension, we also accept complex types. + + Keep these checks in ascending code order. */ #define ARITHMETIC_TYPE_P(TYPE) \ - (CP_INTEGRAL_TYPE_P (TYPE) || TREE_CODE (TYPE) == REAL_TYPE) + (CP_INTEGRAL_TYPE_P (TYPE) \ + || TREE_CODE (TYPE) == REAL_TYPE \ + || TREE_CODE (TYPE) == COMPLEX_TYPE) /* [basic.types] Arithmetic types, enumeration types, pointer types, and pointer-to-member types, are collectively called scalar types. + Keep these checks in ascending code order. */ #define SCALAR_TYPE_P(TYPE) \ (TYPE_PTRMEM_P (TYPE) \ diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 679be2067e6..3023cf09d4b 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -178,8 +178,7 @@ build_zero_init (tree type, tree nelts, bool static_storage_p) items with static storage duration that are not otherwise initialized are initialized to zero. */ ; - else if (SCALAR_TYPE_P (type) - || TREE_CODE (type) == COMPLEX_TYPE) + else if (SCALAR_TYPE_P (type)) init = convert (type, integer_zero_node); else if (CLASS_TYPE_P (type)) { diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index f3358c79c6c..7e816f102f7 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -258,11 +258,9 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2) /* FIXME: Attributes. */ gcc_assert (ARITHMETIC_TYPE_P (t1) - || TREE_CODE (t1) == COMPLEX_TYPE || TREE_CODE (t1) == VECTOR_TYPE || TREE_CODE (t1) == ENUMERAL_TYPE); gcc_assert (ARITHMETIC_TYPE_P (t2) - || TREE_CODE (t2) == COMPLEX_TYPE || TREE_CODE (t2) == VECTOR_TYPE || TREE_CODE (t2) == ENUMERAL_TYPE); @@ -757,9 +755,9 @@ common_type (tree t1, tree t2) code2 = TREE_CODE (t2); if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE - || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE) + || code1 == VECTOR_TYPE) && (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE - || code2 == COMPLEX_TYPE || code2 == VECTOR_TYPE)) + || code2 == VECTOR_TYPE)) return type_after_usual_arithmetic_conversions (t1, t2); else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2)) diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 5f6cf0d35a5..9ded7bbf864 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -702,7 +702,8 @@ digest_init (tree type, tree init) } /* Handle scalar types (including conversions) and references. */ - if (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE) + if (TREE_CODE (type) != COMPLEX_TYPE + && (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE)) return convert_for_initialization (0, type, init, LOOKUP_NORMAL, "initialization", NULL_TREE, 0); diff --git a/gcc/testsuite/g++.dg/ext/complex2.C b/gcc/testsuite/g++.dg/ext/complex2.C new file mode 100644 index 00000000000..c9e8cdce59a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex2.C @@ -0,0 +1,5 @@ +// PR c++/31388 +// { dg-options "" } + +bool b = !0i; + -- 2.30.2