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 | |
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')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/call.c | 5 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/conversion/simd1.C | 22 | ||||
-rw-r--r-- | gcc/tree.c | 19 |
7 files changed, 66 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ada5b335c19..4ca7cf5996b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +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. + 2004-11-24 Eric Botcazou <ebotcazou@libertysurf.fr> * target.h (late_rtl_prologue_epilogue): Remove. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a8ed1ae6ddd..4f9c1d89bf4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +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. + 2004-11-23 Ben Elliston <bje@au.ibm.com> * cp-tree.h (context_as_string): Remove extern. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 613d0d4493e..c67b16f2537 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -652,11 +652,6 @@ standard_conversion (tree to, tree from, tree expr) if ((tcode == POINTER_TYPE || TYPE_PTR_TO_MEMBER_P (to)) && expr && null_ptr_cst_p (expr)) conv = build_conv (ck_std, to, conv); - else if (tcode == POINTER_TYPE && fcode == POINTER_TYPE - && TREE_CODE (TREE_TYPE (to)) == VECTOR_TYPE - && TREE_CODE (TREE_TYPE (from)) == VECTOR_TYPE - && vector_types_convertible_p (TREE_TYPE (to), TREE_TYPE (from))) - conv = build_conv (ck_std, to, conv); else if ((tcode == INTEGER_TYPE && fcode == POINTER_TYPE) || (tcode == POINTER_TYPE && fcode == INTEGER_TYPE)) { diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 4caf051075c..60f03c97387 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6425,6 +6425,10 @@ ptr_reasonably_similar (tree to, tree from) COMPARE_BASE | COMPARE_DERIVED)) continue; + if (TREE_CODE (to) == VECTOR_TYPE + && vector_types_convertible_p (to, from)) + return 1; + if (TREE_CODE (to) == INTEGER_TYPE && TYPE_PRECISION (to) == TYPE_PRECISION (from)) return 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c6fcacbfb9c..6c75fd8d9ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2004-11-24 Paolo Bonzini <bonzini@gnu.org> + + PR c++/16882 + + * g++.dg/conversion/simd1.C: New test. + 2004-11-23 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * lib/target-libpath.exp: New file defining set_ld_library_path_env_vars diff --git a/gcc/testsuite/g++.dg/conversion/simd1.C b/gcc/testsuite/g++.dg/conversion/simd1.C new file mode 100644 index 00000000000..a1ae3a7eae9 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd1.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +/* Test overload resolution of vector types. + From Janis Johnson and Paolo Bonzini, based on PR/16882 */ + +#define vector __attribute__((vector_size(16))) + +vector signed int vld (int a1, const vector signed int *a2) { return *a2; } /* { dg-error "near match" } */ +vector signed short vld (int a1, const vector signed short *a2) { return *a2; } /* { dg-error "near match" } */ + +extern int i; +extern vector signed short vss; +extern vector signed char *vscp; +extern vector signed short *vssp; +extern const vector signed short *cvssp; + +void foo () +{ + vss = vld(i, vscp); /* { dg-error "no match" } */ + vss = vld(i, vssp); + vss = vld(i, cvssp); +} 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; } |