diff options
author | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-24 10:06:54 +0000 |
---|---|---|
committer | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-24 10:06:54 +0000 |
commit | bd9718496464a86074a40553fd7e914b2f8485f7 (patch) | |
tree | 0c12974a411269c0d5ba5e09d0d63e06d3cd121e /gcc/tree.c | |
parent | ddb9733b0fcf76b6d5bab37f36921e736dd110a5 (diff) | |
download | gcc-bd9718496464a86074a40553fd7e914b2f8485f7.tar.gz |
2004-11-24 Paolo Bonzini <bonzini@gnu.org>
PR c++/16882
* tree.c (make_vector_type): Move qualifiers to the vector type,
use the inner type's main variant and build a main variant for
the vector type if necessary.
(type_hash_eq): Check a vector type's TYPE_VECTOR_SUBPARTS.
cp:
2004-11-24 Paolo Bonzini <bonzini@gnu.org>
PR c++/16882
* call.c (standard_conversion): Move check for conversions between
vector pointers...
* typeck.c (ptr_reasonably_similar): ... here.
testsuite:
2004-11-24 Paolo Bonzini <bonzini@gnu.org>
PR c++/16882
* g++.dg/conversion/simd1.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91142 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/tree.c b/gcc/tree.c index 32ec8a54911..643f1def6e4 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -3437,11 +3437,13 @@ type_hash_eq (const void *va, const void *vb) { case VOID_TYPE: case COMPLEX_TYPE: - case VECTOR_TYPE: case POINTER_TYPE: case REFERENCE_TYPE: return 1; + case VECTOR_TYPE: + return TYPE_VECTOR_SUBPARTS (a->type) == TYPE_VECTOR_SUBPARTS (b->type); + case ENUMERAL_TYPE: if (TYPE_VALUES (a->type) != TYPE_VALUES (b->type) && !(TYPE_VALUES (a->type) @@ -5542,9 +5544,12 @@ make_vector_type (tree innertype, int nunits, enum machine_mode mode) { tree t = make_node (VECTOR_TYPE); - TREE_TYPE (t) = innertype; + TREE_TYPE (t) = TYPE_MAIN_VARIANT (innertype); TYPE_VECTOR_SUBPARTS (t) = nunits; TYPE_MODE (t) = mode; + TYPE_READONLY (t) = TYPE_READONLY (innertype); + TYPE_VOLATILE (t) = TYPE_VOLATILE (innertype); + layout_type (t); { @@ -5563,6 +5568,16 @@ make_vector_type (tree innertype, int nunits, enum machine_mode mode) TYPE_UID (rt) = TYPE_UID (t); } + /* Build our main variant, based on the main variant of the inner type. */ + if (TYPE_MAIN_VARIANT (innertype) != innertype) + { + tree innertype_main_variant = TYPE_MAIN_VARIANT (innertype); + unsigned int hash = TYPE_HASH (innertype_main_variant); + TYPE_MAIN_VARIANT (t) + = type_hash_canon (hash, make_vector_type (innertype_main_variant, + nunits, mode)); + } + return t; } |