summaryrefslogtreecommitdiff
path: root/gcc/cp/cvt.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/cvt.c')
-rw-r--r--gcc/cp/cvt.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 6f61218b232..f09f7086069 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -1103,7 +1103,6 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
return expr;
/* else fall through... */
- case VECTOR_TYPE:
case BOOLEAN_TYPE:
return (desires & WANT_INT) ? expr : NULL_TREE;
case ENUMERAL_TYPE:
@@ -1117,6 +1116,23 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
case ARRAY_TYPE:
return (desires & WANT_POINTER) ? decay_conversion (expr)
: NULL_TREE;
+
+ case VECTOR_TYPE:
+ if ((desires & WANT_VECTOR) == 0)
+ return NULL_TREE;
+ switch (TREE_CODE (TREE_TYPE (basetype)))
+ {
+ case INTEGER_TYPE:
+ case BOOLEAN_TYPE:
+ return (desires & WANT_INT) ? expr : NULL_TREE;
+ case ENUMERAL_TYPE:
+ return (desires & WANT_ENUM) ? expr : NULL_TREE;
+ case REAL_TYPE:
+ return (desires & WANT_FLOAT) ? expr : NULL_TREE;
+ default:
+ return NULL_TREE;
+ }
+
default:
return NULL_TREE;
}
@@ -1151,6 +1167,23 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
case POINTER_TYPE:
win = (desires & WANT_POINTER); break;
+ case VECTOR_TYPE:
+ if ((desires & WANT_VECTOR) == 0)
+ break;
+ switch (TREE_CODE (TREE_TYPE (candidate)))
+ {
+ case BOOLEAN_TYPE:
+ case INTEGER_TYPE:
+ win = (desires & WANT_INT); break;
+ case ENUMERAL_TYPE:
+ win = (desires & WANT_ENUM); break;
+ case REAL_TYPE:
+ win = (desires & WANT_FLOAT); break;
+ default:
+ break;
+ }
+ break;
+
default:
break;
}