aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2012-10-25 15:02:42 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2012-10-25 13:02:42 +0000
commit93100c6b5b45c39b54b25beb5d77e50ea9caa047 (patch)
treec59298c0a1950703d2a7fcb4db22f59f20b81981 /gcc/tree.c
parent6ced940d172f65be316637f4945fbf633a79ab90 (diff)
downloadgcc-93100c6b5b45c39b54b25beb5d77e50ea9caa047.zip
gcc-93100c6b5b45c39b54b25beb5d77e50ea9caa047.tar.gz
gcc-93100c6b5b45c39b54b25beb5d77e50ea9caa047.tar.bz2
re PR c++/54427 (Expose more vector extensions)
2012-10-25 Marc Glisse <marc.glisse@inria.fr> PR c++/54427 gcc/ * tree.c (signed_or_unsigned_type_for): Handle vectors. gcc/cp/ * typeck.c (build_x_conditional_expr): Handle VEC_COND_EXPR. * call.c (build_conditional_expr_1): Likewise. gcc/c-family/ * c-common.c (scalar_to_vector): Handle VEC_COND_EXPR. gcc/testsuite/ * g++.dg/ext/vector19.C: New testcase. From-SVN: r192808
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 7cb1ea1..c3642e3 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -10241,6 +10241,17 @@ signed_or_unsigned_type_for (int unsignedp, tree type)
if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type) == unsignedp)
return type;
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ {
+ tree inner = TREE_TYPE (type);
+ tree inner2 = signed_or_unsigned_type_for (unsignedp, inner);
+ if (!inner2)
+ return NULL_TREE;
+ if (inner == inner2)
+ return type;
+ return build_vector_type (inner2, TYPE_VECTOR_SUBPARTS (type));
+ }
+
if (!INTEGRAL_TYPE_P (type)
&& !POINTER_TYPE_P (type))
return NULL_TREE;