Commit b8063b29 by Mark Mitchell Committed by Mark Mitchell

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
parent 6b2eeb54
2007-04-24 Mark Mitchell <mark@codesourcery.com>
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 <pcarlini@suse.de> 2007-04-25 Paolo Carlini <pcarlini@suse.de>
* semantics.c (classtype_has_nothrow_copy_or_assign_p): Adjust * semantics.c (classtype_has_nothrow_copy_or_assign_p): Adjust
......
...@@ -2660,14 +2660,21 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) ...@@ -2660,14 +2660,21 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
/* [basic.fundamental] /* [basic.fundamental]
Integral and floating types are collectively called arithmetic 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) \ #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] /* [basic.types]
Arithmetic types, enumeration types, pointer types, and Arithmetic types, enumeration types, pointer types, and
pointer-to-member types, are collectively called scalar types. pointer-to-member types, are collectively called scalar types.
Keep these checks in ascending code order. */ Keep these checks in ascending code order. */
#define SCALAR_TYPE_P(TYPE) \ #define SCALAR_TYPE_P(TYPE) \
(TYPE_PTRMEM_P (TYPE) \ (TYPE_PTRMEM_P (TYPE) \
......
...@@ -178,8 +178,7 @@ build_zero_init (tree type, tree nelts, bool static_storage_p) ...@@ -178,8 +178,7 @@ build_zero_init (tree type, tree nelts, bool static_storage_p)
items with static storage duration that are not otherwise items with static storage duration that are not otherwise
initialized are initialized to zero. */ initialized are initialized to zero. */
; ;
else if (SCALAR_TYPE_P (type) else if (SCALAR_TYPE_P (type))
|| TREE_CODE (type) == COMPLEX_TYPE)
init = convert (type, integer_zero_node); init = convert (type, integer_zero_node);
else if (CLASS_TYPE_P (type)) else if (CLASS_TYPE_P (type))
{ {
......
...@@ -258,11 +258,9 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2) ...@@ -258,11 +258,9 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
/* FIXME: Attributes. */ /* FIXME: Attributes. */
gcc_assert (ARITHMETIC_TYPE_P (t1) gcc_assert (ARITHMETIC_TYPE_P (t1)
|| TREE_CODE (t1) == COMPLEX_TYPE
|| TREE_CODE (t1) == VECTOR_TYPE || TREE_CODE (t1) == VECTOR_TYPE
|| TREE_CODE (t1) == ENUMERAL_TYPE); || TREE_CODE (t1) == ENUMERAL_TYPE);
gcc_assert (ARITHMETIC_TYPE_P (t2) gcc_assert (ARITHMETIC_TYPE_P (t2)
|| TREE_CODE (t2) == COMPLEX_TYPE
|| TREE_CODE (t2) == VECTOR_TYPE || TREE_CODE (t2) == VECTOR_TYPE
|| TREE_CODE (t2) == ENUMERAL_TYPE); || TREE_CODE (t2) == ENUMERAL_TYPE);
...@@ -757,9 +755,9 @@ common_type (tree t1, tree t2) ...@@ -757,9 +755,9 @@ common_type (tree t1, tree t2)
code2 = TREE_CODE (t2); code2 = TREE_CODE (t2);
if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE) || code1 == VECTOR_TYPE)
&& (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_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); return type_after_usual_arithmetic_conversions (t1, t2);
else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2)) else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
......
...@@ -702,7 +702,8 @@ digest_init (tree type, tree init) ...@@ -702,7 +702,8 @@ digest_init (tree type, tree init)
} }
/* Handle scalar types (including conversions) and references. */ /* 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, return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
"initialization", NULL_TREE, 0); "initialization", NULL_TREE, 0);
......
// PR c++/31388
// { dg-options "" }
bool b = !0i;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment