summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>2004-11-24 10:06:54 +0000
committerbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>2004-11-24 10:06:54 +0000
commitbd9718496464a86074a40553fd7e914b2f8485f7 (patch)
tree0c12974a411269c0d5ba5e09d0d63e06d3cd121e /gcc
parentddb9733b0fcf76b6d5bab37f36921e736dd110a5 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/call.c5
-rw-r--r--gcc/cp/typeck.c4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/conversion/simd1.C22
-rw-r--r--gcc/tree.c19
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;
}