aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog11
-rw-r--r--gcc/cp/cp-tree.h11
-rw-r--r--gcc/cp/init.c3
-rw-r--r--gcc/cp/typeck.c6
-rw-r--r--gcc/cp/typeck2.c3
5 files changed, 25 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 37b7742..3846c0b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,14 @@
+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>
* 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 27f5b8c..fb682c7 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 679be20..3023cf0 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 f3358c7..7e816f1 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 5f6cf0d..9ded7bb 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);