+2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * tree-core.h (tree_type_common::indivisible_p): New member variable.
+ * tree.h (TYPE_INDIVISIBLE_P): New macro.
+ * config/aarch64/aarch64-sve-builtins.cc (register_builtin_types):
+ Treat the vector types as indivisible.
+
2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
* optabs.def (gather_load_optab, mask_gather_load_optab)
+2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * c-common.h (gnu_vector_type_p): New function.
+ * c-common.c (c_build_vec_perm_expr): Require __builtin_shuffle
+ vectors to satisfy gnu_vector_type_p.
+ (c_build_vec_convert): Likewise __builtin_convertvector.
+ (convert_vector_to_array_for_subscript): Likewise when applying
+ implicit vector to array conversion.
+ (scalar_to_vector): Likewise when converting vector-scalar
+ operations to vector-vector operations.
+
2019-11-08 Joseph Myers <joseph@codesourcery.com>
* c.opt (Wold-style-definition): Initialize to -1.
|| mask == error_mark_node)
return error_mark_node;
- if (!VECTOR_INTEGER_TYPE_P (TREE_TYPE (mask)))
+ if (!gnu_vector_type_p (TREE_TYPE (mask))
+ || !VECTOR_INTEGER_TYPE_P (TREE_TYPE (mask)))
{
if (complain)
error_at (loc, "%<__builtin_shuffle%> last argument must "
return error_mark_node;
}
- if (!VECTOR_TYPE_P (TREE_TYPE (v0))
- || !VECTOR_TYPE_P (TREE_TYPE (v1)))
+ if (!gnu_vector_type_p (TREE_TYPE (v0))
+ || !gnu_vector_type_p (TREE_TYPE (v1)))
{
if (complain)
error_at (loc, "%<__builtin_shuffle%> arguments must be vectors");
if (error_operand_p (expr))
return error_mark_node;
- if (!VECTOR_INTEGER_TYPE_P (TREE_TYPE (expr))
- && !VECTOR_FLOAT_TYPE_P (TREE_TYPE (expr)))
+ if (!gnu_vector_type_p (TREE_TYPE (expr))
+ || (!VECTOR_INTEGER_TYPE_P (TREE_TYPE (expr))
+ && !VECTOR_FLOAT_TYPE_P (TREE_TYPE (expr))))
{
if (complain)
error_at (loc1, "%<__builtin_convertvector%> first argument must "
return error_mark_node;
}
- if (!VECTOR_INTEGER_TYPE_P (type) && !VECTOR_FLOAT_TYPE_P (type))
+ if (!gnu_vector_type_p (type)
+ || (!VECTOR_INTEGER_TYPE_P (type) && !VECTOR_FLOAT_TYPE_P (type)))
{
if (complain)
error_at (loc2, "%<__builtin_convertvector%> second argument must "
tree *vecp, tree index)
{
bool ret = false;
- if (VECTOR_TYPE_P (TREE_TYPE (*vecp)))
+ if (gnu_vector_type_p (TREE_TYPE (*vecp)))
{
tree type = TREE_TYPE (*vecp);
bool integer_only_op = false;
enum stv_conv ret = stv_firstarg;
- gcc_assert (VECTOR_TYPE_P (type0) || VECTOR_TYPE_P (type1));
+ gcc_assert (gnu_vector_type_p (type0) || gnu_vector_type_p (type1));
switch (code)
{
/* Most GENERIC binary expressions require homogeneous arguments.
case LT_EXPR:
case GT_EXPR:
/* What about UNLT_EXPR? */
- if (VECTOR_TYPE_P (type0))
+ if (gnu_vector_type_p (type0))
{
ret = stv_secondarg;
std::swap (type0, type1);
#define C_TYPE_OBJECT_OR_INCOMPLETE_P(type) \
(!C_TYPE_FUNCTION_P (type))
+/* Return true if TYPE is a vector type that should be subject to the GNU
+ vector extensions (as opposed to a vector type that is used only for
+ the purposes of defining target-specific built-in functions). */
+
+inline bool
+gnu_vector_type_p (const_tree type)
+{
+ return TREE_CODE (type) == VECTOR_TYPE && !TYPE_INDIVISIBLE_P (type);
+}
+
struct visibility_flags
{
unsigned inpragma : 1; /* True when in #pragma GCC visibility. */
+2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * c-convert.c (convert): Only handle vector conversions if one of
+ the types satisfies gnu_vector_type_p or if -flax-vector-conversions
+ allows it.
+ * c-typeck.c (build_array_ref): Only allow vector indexing if the
+ vectors satisfy gnu_vector_type_p.
+ (build_unary_op): Only allow unary operators to be applied to
+ vectors if they satisfy gnu_vector_type_p.
+ (digest_init): Only allow by-element initialization of vectors
+ if they satisfy gnu_vector_type_p.
+ (really_start_incremental_init): Likewise.
+ (push_init_level): Likewise.
+ (pop_init_level): Likewise.
+ (process_init_element): Likewise.
+ (build_binary_op): Only allow binary operators to be applied to
+ vectors if they satisfy gnu_vector_type_p.
+
2019-11-08 Joseph Myers <joseph@codesourcery.com>
* c-decl.c (grokparms): Convert () in a function definition to
goto maybe_fold;
case VECTOR_TYPE:
- ret = convert_to_vector (type, e);
- goto maybe_fold;
+ if (gnu_vector_type_p (type)
+ || gnu_vector_type_p (TREE_TYPE (e))
+ /* Allow conversions between compatible non-GNU vector types
+ when -flax-vector-conversions is passed. The whole purpose
+ of the option is to bend the normal type rules and accept
+ nonconforming code. */
+ || (flag_lax_vector_conversions
+ && VECTOR_TYPE_P (TREE_TYPE (e))
+ && vector_types_convertible_p (type, TREE_TYPE (e), false)))
+ {
+ ret = convert_to_vector (type, e);
+ goto maybe_fold;
+ }
+ break;
case RECORD_TYPE:
case UNION_TYPE:
if (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE
&& TREE_CODE (TREE_TYPE (array)) != POINTER_TYPE
/* Allow vector[index] but not index[vector]. */
- && !VECTOR_TYPE_P (TREE_TYPE (array)))
+ && !gnu_vector_type_p (TREE_TYPE (array)))
{
if (TREE_CODE (TREE_TYPE (index)) != ARRAY_TYPE
&& TREE_CODE (TREE_TYPE (index)) != POINTER_TYPE)
associativity, but won't generate any code. */
if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
|| typecode == FIXED_POINT_TYPE || typecode == COMPLEX_TYPE
- || typecode == VECTOR_TYPE))
+ || gnu_vector_type_p (TREE_TYPE (arg))))
{
error_at (location, "wrong type argument to unary plus");
return error_mark_node;
case NEGATE_EXPR:
if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
|| typecode == FIXED_POINT_TYPE || typecode == COMPLEX_TYPE
- || typecode == VECTOR_TYPE))
+ || gnu_vector_type_p (TREE_TYPE (arg))))
{
error_at (location, "wrong type argument to unary minus");
return error_mark_node;
case BIT_NOT_EXPR:
/* ~ works on integer types and non float vectors. */
if (typecode == INTEGER_TYPE
- || (typecode == VECTOR_TYPE
+ || (gnu_vector_type_p (TREE_TYPE (arg))
&& !VECTOR_FLOAT_TYPE_P (TREE_TYPE (arg))))
{
tree e = arg;
if (typecode != POINTER_TYPE && typecode != FIXED_POINT_TYPE
&& typecode != INTEGER_TYPE && typecode != REAL_TYPE
- && typecode != COMPLEX_TYPE && typecode != VECTOR_TYPE)
+ && typecode != COMPLEX_TYPE
+ && !gnu_vector_type_p (TREE_TYPE (arg)))
{
if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
error_at (location, "wrong type argument to increment");
TYPE_MAIN_VARIANT (type))
|| (code == ARRAY_TYPE
&& comptypes (TREE_TYPE (inside_init), type))
- || (code == VECTOR_TYPE
+ || (gnu_vector_type_p (type)
&& comptypes (TREE_TYPE (inside_init), type))
|| (code == POINTER_TYPE
&& TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
constructor_unfilled_index = constructor_index;
}
- else if (VECTOR_TYPE_P (constructor_type))
+ else if (gnu_vector_type_p (constructor_type))
{
/* Vectors are like simple fixed-size arrays. */
constructor_max_index =
constructor_unfilled_fields = constructor_fields;
constructor_bit_index = bitsize_zero_node;
}
- else if (VECTOR_TYPE_P (constructor_type))
+ else if (gnu_vector_type_p (constructor_type))
{
/* Vectors are like simple fixed-size arrays. */
constructor_max_index =
;
else if (!RECORD_OR_UNION_TYPE_P (constructor_type)
&& TREE_CODE (constructor_type) != ARRAY_TYPE
- && !VECTOR_TYPE_P (constructor_type))
+ && !gnu_vector_type_p (constructor_type))
{
/* A nonincremental scalar initializer--just return
the element, after verifying there is just one. */
last_init_list_comma),
true, braced_init_obstack);
else if ((TREE_CODE (constructor_type) == ARRAY_TYPE
- || VECTOR_TYPE_P (constructor_type))
+ || gnu_vector_type_p (constructor_type))
&& constructor_max_index
&& tree_int_cst_lt (constructor_max_index,
constructor_index))
&& value.value != error_mark_node
&& TYPE_MAIN_VARIANT (TREE_TYPE (value.value)) != fieldtype
&& (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE
- || fieldcode == UNION_TYPE || fieldcode == VECTOR_TYPE))
+ || fieldcode == UNION_TYPE
+ || gnu_vector_type_p (fieldtype)))
{
push_init_level (loc, 1, braced_init_obstack);
continue;
&& value.value != error_mark_node
&& TYPE_MAIN_VARIANT (TREE_TYPE (value.value)) != fieldtype
&& (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE
- || fieldcode == UNION_TYPE || fieldcode == VECTOR_TYPE))
+ || fieldcode == UNION_TYPE
+ || gnu_vector_type_p (fieldtype)))
{
push_init_level (loc, 1, braced_init_obstack);
continue;
&& value.value != error_mark_node
&& TYPE_MAIN_VARIANT (TREE_TYPE (value.value)) != elttype
&& (eltcode == RECORD_TYPE || eltcode == ARRAY_TYPE
- || eltcode == UNION_TYPE || eltcode == VECTOR_TYPE))
+ || eltcode == UNION_TYPE
+ || gnu_vector_type_p (elttype)))
{
push_init_level (loc, 1, braced_init_obstack);
continue;
constructor_unfilled_index. */
constructor_unfilled_index = constructor_index;
}
- else if (VECTOR_TYPE_P (constructor_type))
+ else if (gnu_vector_type_p (constructor_type))
{
tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
/* In case when one of the operands of the binary operation is
a vector and another is a scalar -- convert scalar to vector. */
- if ((code0 == VECTOR_TYPE) != (code1 == VECTOR_TYPE))
+ if ((gnu_vector_type_p (type0) && code1 != VECTOR_TYPE)
+ || (gnu_vector_type_p (type1) && code0 != VECTOR_TYPE))
{
enum stv_conv convert_flag = scalar_to_vector (location, code, op0, op1,
true);
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == FIXED_POINT_TYPE
- || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
+ || code0 == COMPLEX_TYPE
+ || gnu_vector_type_p (type0))
&& (code1 == INTEGER_TYPE || code1 == REAL_TYPE
|| code1 == FIXED_POINT_TYPE
- || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
+ || code1 == COMPLEX_TYPE
+ || gnu_vector_type_p (type1)))
{
enum tree_code tcode0 = code0, tcode1 = code1;
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
shorten = -1;
/* Allow vector types which are not floating point types. */
- else if (code0 == VECTOR_TYPE
- && code1 == VECTOR_TYPE
+ else if (gnu_vector_type_p (type0)
+ && gnu_vector_type_p (type1)
&& !VECTOR_FLOAT_TYPE_P (type0)
&& !VECTOR_FLOAT_TYPE_P (type1))
common = 1;
doing_div_or_mod = true;
warn_for_div_by_zero (location, op1);
- if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ if (gnu_vector_type_p (type0)
+ && gnu_vector_type_p (type1)
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE)
common = 1;
Also set SHORT_SHIFT if shifting rightward. */
case RSHIFT_EXPR:
- if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ if (gnu_vector_type_p (type0)
+ && gnu_vector_type_p (type1)
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
&& known_eq (TYPE_VECTOR_SUBPARTS (type0),
converted = 1;
}
else if ((code0 == INTEGER_TYPE || code0 == FIXED_POINT_TYPE
- || (code0 == VECTOR_TYPE
+ || (gnu_vector_type_p (type0)
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE))
&& code1 == INTEGER_TYPE)
{
break;
case LSHIFT_EXPR:
- if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ if (gnu_vector_type_p (type0)
+ && gnu_vector_type_p (type1)
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
&& TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
&& known_eq (TYPE_VECTOR_SUBPARTS (type0),
converted = 1;
}
else if ((code0 == INTEGER_TYPE || code0 == FIXED_POINT_TYPE
- || (code0 == VECTOR_TYPE
+ || (gnu_vector_type_p (type0)
&& TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE))
&& code1 == INTEGER_TYPE)
{
case EQ_EXPR:
case NE_EXPR:
- if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+ if (gnu_vector_type_p (type0) && gnu_vector_type_p (type1))
{
tree intt;
if (!vector_types_compatible_elements_p (type0, type1))
case GE_EXPR:
case LT_EXPR:
case GT_EXPR:
- if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+ if (gnu_vector_type_p (type0) && gnu_vector_type_p (type1))
{
tree intt;
if (!vector_types_compatible_elements_p (type0, type1))
if (code0 == ERROR_MARK || code1 == ERROR_MARK)
return error_mark_node;
- if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ if (gnu_vector_type_p (type0)
+ && gnu_vector_type_p (type1)
&& (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
|| !vector_types_compatible_elements_p (type0, type1)))
{
}
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE
- || code0 == FIXED_POINT_TYPE || code0 == VECTOR_TYPE)
+ || code0 == FIXED_POINT_TYPE
+ || gnu_vector_type_p (type0))
&&
(code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE
- || code1 == FIXED_POINT_TYPE || code1 == VECTOR_TYPE))
+ || code1 == FIXED_POINT_TYPE
+ || gnu_vector_type_p (type1)))
{
bool first_complex = (code0 == COMPLEX_TYPE);
bool second_complex = (code1 == COMPLEX_TYPE);
gcc_assert (vectype == TYPE_MAIN_VARIANT (vectype));
SET_TYPE_STRUCTURAL_EQUALITY (vectype);
TYPE_ARTIFICIAL (vectype) = 1;
+ TYPE_INDIVISIBLE_P (vectype) = 1;
abi_vector_types[i] = vectype;
lang_hooks.types.register_builtin_type (vectype,
vector_types[i].abi_name);
+2019-11-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * gcc.target/aarch64/sve/acle/general-c/gnu_vectors_1.c: New test.
+ * gcc.target/aarch64/sve/acle/general-c/gnu_vectors_2.c: Likewise.
+
2019-11-08 Kewen Lin <linkw@gcc.gnu.org>
PR target/92132
--- /dev/null
+/* { dg-options "-msve-vector-bits=256" } */
+
+#include <arm_sve.h>
+
+typedef uint8_t gnu_uint8_t __attribute__ ((vector_size (32)));
+typedef int8_t gnu_int8_t __attribute__ ((vector_size (32)));
+
+void
+f (svuint8_t sve_u1, svint8_t sve_s1,
+ gnu_uint8_t gnu_u1, gnu_int8_t gnu_s1, int n, unsigned char uc)
+{
+ /* Initialization. */
+
+ svuint8_t init_sve_u1 = 0; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'int'} } */
+ svuint8_t init_sve_u2 = {}; /* { dg-error {empty scalar initializer} } */
+ svuint8_t init_sve_u3 = { sve_u1 };
+ svuint8_t init_sve_u4 = { gnu_u1 };
+ svuint8_t init_sve_u5 = { sve_s1 }; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'svint8_t'} } */
+ svuint8_t init_sve_u6 = { gnu_s1 }; /* { dg-error {incompatible types when initializing type 'svuint8_t'} } */
+ svuint8_t init_sve_u7 = { 0 }; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'int'} } */
+ svuint8_t init_sve_u8 = { sve_u1, sve_u1 }; /* { dg-warning {excess elements in scalar initializer} } */
+ svuint8_t init_sve_u9 = { gnu_u1, gnu_u1 }; /* { dg-warning {excess elements in scalar initializer} } */
+
+ gnu_uint8_t init_gnu_u1 = 0; /* { dg-error {incompatible types when initializing type 'gnu_uint8_t'[^\n]* using type 'int'} } */
+ gnu_uint8_t init_gnu_u2 = {};
+ gnu_uint8_t init_gnu_u3 = { sve_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u4 = { gnu_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u5 = { sve_s1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u6 = { gnu_s1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u7 = { 0 };
+
+ /* Compound literals. */
+
+ (svuint8_t) {}; /* { dg-error {empty scalar initializer} } */
+ (svuint8_t) { 0 }; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'int'} } */
+ (svuint8_t) { sve_u1 };
+ (svuint8_t) { gnu_u1 };
+ (svuint8_t) { sve_s1 }; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'svint8_t'} } */
+ (svuint8_t) { gnu_s1 }; /* { dg-error {incompatible types when initializing type 'svuint8_t'} } */
+
+ (gnu_uint8_t) {};
+ (gnu_uint8_t) { 0 };
+ (gnu_uint8_t) { sve_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ (gnu_uint8_t) { gnu_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+
+ /* Assignment. */
+
+ sve_u1 = 0; /* { dg-error {incompatible types when assigning to type 'svuint8_t' from type 'int'} } */
+ sve_u1 = sve_u1;
+ sve_u1 = gnu_u1;
+ sve_u1 = sve_s1; /* { dg-error {incompatible types when assigning to type 'svuint8_t' from type 'svint8_t'} } */
+ sve_u1 = gnu_s1; /* { dg-error {incompatible types when assigning to type 'svuint8_t' from type 'gnu_int8_t'} } */
+
+ gnu_u1 = 0; /* { dg-error {incompatible types when assigning to type 'gnu_uint8_t'[^\n]* from type 'int'} } */
+ gnu_u1 = sve_u1;
+ gnu_u1 = gnu_u1;
+ gnu_u1 = sve_s1; /* { dg-error {incompatible types when assigning to type 'gnu_uint8_t'[^\n]* from type 'svint8_t'} } */
+ gnu_u1 = gnu_s1; /* { dg-error {incompatible types when assigning to type 'gnu_uint8_t'[^\n]* from type 'gnu_int8_t'} } */
+
+ /* Casts. */
+
+ (void) sve_u1;
+ (svuint8_t) sve_u1;
+ (svuint8_t) gnu_u1;
+ (svuint8_t) 0; /* { dg-error {conversion to non-scalar type requested} } */
+ (svuint8_t) n; /* { dg-error {conversion to non-scalar type requested} } */
+ (svint8_t) sve_u1; /* { dg-error {conversion to non-scalar type requested} } */
+ (svint8_t) gnu_u1;
+
+ (void) gnu_u1;
+ (gnu_uint8_t) sve_u1;
+ (gnu_uint8_t) gnu_u1;
+ (gnu_uint8_t) 0; /* { dg-error {cannot convert a value of type 'int' to vector type '[^']*' which has different size} } */
+ (gnu_uint8_t) n; /* { dg-error {cannot convert a value of type 'int' to vector type '[^']*' which has different size} } */
+ (gnu_int8_t) sve_u1;
+ (gnu_int8_t) gnu_u1;
+
+ /* Vector indexing. */
+
+ sve_u1[0]; /* { dg-error {subscripted value is neither array nor pointer} } */
+ &sve_u1[0]; /* { dg-error {subscripted value is neither array nor pointer} } */
+
+ gnu_u1[0];
+ &gnu_u1[0];
+
+ /* Unary operators. */
+
+ +sve_u1; /* { dg-error {wrong type argument to unary plus} } */
+ -sve_u1; /* { dg-error {wrong type argument to unary minus} } */
+ ~sve_u1; /* { dg-error {wrong type argument to bit-complement} } */
+ !sve_u1; /* { dg-error {wrong type argument to unary exclamation mark} } */
+ *sve_u1; /* { dg-error {invalid type argument of unary '\*'} } */
+ __real sve_u1; /* { dg-error {wrong type argument to __real} } */
+ __imag sve_u1; /* { dg-error {wrong type argument to __imag} } */
+ ++sve_u1; /* { dg-error {wrong type argument to increment} } */
+ --sve_u1; /* { dg-error {wrong type argument to decrement} } */
+ sve_u1++; /* { dg-error {wrong type argument to increment} } */
+ sve_u1--; /* { dg-error {wrong type argument to decrement} } */
+
+ +gnu_u1;
+ -gnu_u1;
+ ~gnu_u1;
+ !gnu_u1; /* { dg-error {wrong type argument to unary exclamation mark} } */
+ *gnu_u1; /* { dg-error {invalid type argument of unary '\*'} } */
+ __real gnu_u1; /* { dg-error {wrong type argument to __real} } */
+ __imag gnu_u1; /* { dg-error {wrong type argument to __imag} } */
+ ++gnu_u1;
+ --gnu_u1;
+ gnu_u1++;
+ gnu_u1--;
+
+ /* Vector-vector binary arithmetic. */
+
+ sve_u1 + sve_u1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - sve_u1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * sve_u1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / sve_u1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % sve_u1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & sve_u1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | sve_u1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ sve_u1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == sve_u1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != sve_u1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= sve_u1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < sve_u1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > sve_u1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= sve_u1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << sve_u1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> sve_u1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || sve_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ sve_u1 + gnu_u1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - gnu_u1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * gnu_u1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / gnu_u1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % gnu_u1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & gnu_u1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | gnu_u1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ gnu_u1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == gnu_u1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != gnu_u1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= gnu_u1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < gnu_u1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > gnu_u1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= gnu_u1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << gnu_u1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> gnu_u1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + sve_u1; /* { dg-error {invalid operands to binary \+} } */
+ gnu_u1 - sve_u1; /* { dg-error {invalid operands to binary -} } */
+ gnu_u1 * sve_u1; /* { dg-error {invalid operands to binary \*} } */
+ gnu_u1 / sve_u1; /* { dg-error {invalid operands to binary /} } */
+ gnu_u1 % sve_u1; /* { dg-error {invalid operands to binary %} } */
+ gnu_u1 & sve_u1; /* { dg-error {invalid operands to binary \&} } */
+ gnu_u1 | sve_u1; /* { dg-error {invalid operands to binary \|} } */
+ gnu_u1 ^ sve_u1; /* { dg-error {invalid operands to binary \^} } */
+ gnu_u1 == sve_u1; /* { dg-error {invalid operands to binary ==} } */
+ gnu_u1 != sve_u1; /* { dg-error {invalid operands to binary !=} } */
+ gnu_u1 <= sve_u1; /* { dg-error {invalid operands to binary <=} } */
+ gnu_u1 < sve_u1; /* { dg-error {invalid operands to binary <} } */
+ gnu_u1 > sve_u1; /* { dg-error {invalid operands to binary >} } */
+ gnu_u1 >= sve_u1; /* { dg-error {invalid operands to binary >=} } */
+ gnu_u1 << sve_u1; /* { dg-error {invalid operands to binary <<} } */
+ gnu_u1 >> sve_u1; /* { dg-error {invalid operands to binary >>} } */
+ gnu_u1 && sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || sve_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + gnu_u1;
+ gnu_u1 - gnu_u1;
+ gnu_u1 * gnu_u1;
+ gnu_u1 / gnu_u1;
+ gnu_u1 % gnu_u1;
+ gnu_u1 & gnu_u1;
+ gnu_u1 | gnu_u1;
+ gnu_u1 ^ gnu_u1;
+ gnu_u1 == gnu_u1;
+ gnu_u1 != gnu_u1;
+ gnu_u1 <= gnu_u1;
+ gnu_u1 < gnu_u1;
+ gnu_u1 > gnu_u1;
+ gnu_u1 >= gnu_u1;
+ gnu_u1 << gnu_u1;
+ gnu_u1 >> gnu_u1;
+ gnu_u1 && gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Vector-scalar binary arithmetic. */
+
+ sve_u1 + 2; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - 2; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * 2; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / 2; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % 2; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & 2; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | 2; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ 2; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == 2; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != 2; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= 2; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < 2; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > 2; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= 2; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << 2; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> 2; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && 2; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || 2; /* { dg-error {used vector type where scalar is required} } */
+
+ sve_u1 + uc; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - uc; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * uc; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / uc; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % uc; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & uc; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | uc; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ uc; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == uc; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != uc; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= uc; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < uc; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > uc; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= uc; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << uc; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> uc; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && uc; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || uc; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + 2;
+ gnu_u1 - 2;
+ gnu_u1 * 2;
+ gnu_u1 / 2;
+ gnu_u1 % 2;
+ gnu_u1 & 2;
+ gnu_u1 | 2;
+ gnu_u1 ^ 2;
+ gnu_u1 == 2;
+ gnu_u1 != 2;
+ gnu_u1 <= 2;
+ gnu_u1 < 2;
+ gnu_u1 > 2;
+ gnu_u1 >= 2;
+ gnu_u1 << 2;
+ gnu_u1 >> 2;
+ gnu_u1 && 2; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || 2; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + uc;
+ gnu_u1 - uc;
+ gnu_u1 * uc;
+ gnu_u1 / uc;
+ gnu_u1 % uc;
+ gnu_u1 & uc;
+ gnu_u1 | uc;
+ gnu_u1 ^ uc;
+ gnu_u1 == uc;
+ gnu_u1 != uc;
+ gnu_u1 <= uc;
+ gnu_u1 < uc;
+ gnu_u1 > uc;
+ gnu_u1 >= uc;
+ gnu_u1 << uc;
+ gnu_u1 >> uc;
+ gnu_u1 && uc; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || uc; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Scalar-vector binary arithmetic. */
+
+ 3 + sve_u1; /* { dg-error {invalid operands to binary \+} } */
+ 3 - sve_u1; /* { dg-error {invalid operands to binary -} } */
+ 3 * sve_u1; /* { dg-error {invalid operands to binary \*} } */
+ 3 / sve_u1; /* { dg-error {invalid operands to binary /} } */
+ 3 % sve_u1; /* { dg-error {invalid operands to binary %} } */
+ 3 & sve_u1; /* { dg-error {invalid operands to binary \&} } */
+ 3 | sve_u1; /* { dg-error {invalid operands to binary \|} } */
+ 3 ^ sve_u1; /* { dg-error {invalid operands to binary \^} } */
+ 3 == sve_u1; /* { dg-error {invalid operands to binary ==} } */
+ 3 != sve_u1; /* { dg-error {invalid operands to binary !=} } */
+ 3 <= sve_u1; /* { dg-error {invalid operands to binary <=} } */
+ 3 < sve_u1; /* { dg-error {invalid operands to binary <} } */
+ 3 > sve_u1; /* { dg-error {invalid operands to binary >} } */
+ 3 >= sve_u1; /* { dg-error {invalid operands to binary >=} } */
+ 3 << sve_u1; /* { dg-error {invalid operands to binary <<} } */
+ 3 >> sve_u1; /* { dg-error {invalid operands to binary >>} } */
+ 3 && sve_u1; /* { dg-error {invalid operands to binary \&\&} } */
+ 3 || sve_u1; /* { dg-error {invalid operands to binary \|\|} } */
+
+ 3 + gnu_u1;
+ 3 - gnu_u1;
+ 3 * gnu_u1;
+ 3 / gnu_u1;
+ 3 % gnu_u1;
+ 3 & gnu_u1;
+ 3 | gnu_u1;
+ 3 ^ gnu_u1;
+ 3 == gnu_u1;
+ 3 != gnu_u1;
+ 3 <= gnu_u1;
+ 3 < gnu_u1;
+ 3 > gnu_u1;
+ 3 >= gnu_u1;
+ 3 << gnu_u1;
+ 3 >> gnu_u1;
+ 3 && gnu_u1; /* { dg-error {invalid operands to binary \&\&} } */
+ 3 || gnu_u1; /* { dg-error {invalid operands to binary \|\|} } */
+
+ /* Mismatched types. */
+
+ sve_u1 + sve_s1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - sve_s1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * sve_s1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / sve_s1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % sve_s1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & sve_s1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | sve_s1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ sve_s1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == sve_s1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != sve_s1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= sve_s1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < sve_s1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > sve_s1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= sve_s1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << sve_s1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> sve_s1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && sve_s1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || sve_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ sve_u1 + gnu_s1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - gnu_s1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * gnu_s1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / gnu_s1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % gnu_s1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & gnu_s1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | gnu_s1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ gnu_s1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == gnu_s1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != gnu_s1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= gnu_s1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < gnu_s1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > gnu_s1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= gnu_s1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << gnu_s1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> gnu_s1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + sve_s1; /* { dg-error {invalid operands to binary \+} } */
+ gnu_u1 - sve_s1; /* { dg-error {invalid operands to binary -} } */
+ gnu_u1 * sve_s1; /* { dg-error {invalid operands to binary \*} } */
+ gnu_u1 / sve_s1; /* { dg-error {invalid operands to binary /} } */
+ gnu_u1 % sve_s1; /* { dg-error {invalid operands to binary %} } */
+ gnu_u1 & sve_s1; /* { dg-error {invalid operands to binary \&} } */
+ gnu_u1 | sve_s1; /* { dg-error {invalid operands to binary \|} } */
+ gnu_u1 ^ sve_s1; /* { dg-error {invalid operands to binary \^} } */
+ gnu_u1 == sve_s1; /* { dg-error {invalid operands to binary ==} } */
+ gnu_u1 != sve_s1; /* { dg-error {invalid operands to binary !=} } */
+ gnu_u1 <= sve_s1; /* { dg-error {invalid operands to binary <=} } */
+ gnu_u1 < sve_s1; /* { dg-error {invalid operands to binary <} } */
+ gnu_u1 > sve_s1; /* { dg-error {invalid operands to binary >} } */
+ gnu_u1 >= sve_s1; /* { dg-error {invalid operands to binary >=} } */
+ gnu_u1 << sve_s1; /* { dg-error {invalid operands to binary <<} } */
+ gnu_u1 >> sve_s1; /* { dg-error {invalid operands to binary >>} } */
+ gnu_u1 && sve_s1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || sve_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + gnu_s1;
+ gnu_u1 - gnu_s1;
+ gnu_u1 * gnu_s1;
+ gnu_u1 / gnu_s1;
+ gnu_u1 % gnu_s1;
+ gnu_u1 & gnu_s1;
+ gnu_u1 | gnu_s1;
+ gnu_u1 ^ gnu_s1;
+ gnu_u1 == gnu_s1;
+ gnu_u1 != gnu_s1;
+ gnu_u1 <= gnu_s1;
+ gnu_u1 < gnu_s1;
+ gnu_u1 > gnu_s1;
+ gnu_u1 >= gnu_s1;
+ gnu_u1 << gnu_s1;
+ gnu_u1 >> gnu_s1;
+ gnu_u1 && gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Conditional expressions. */
+
+ uc ? sve_u1 : sve_u1;
+ uc ? gnu_u1 : sve_u1; /* { dg-error {type mismatch in conditional expression} } */
+ uc ? sve_u1 : gnu_u1; /* { dg-error {type mismatch in conditional expression} } */
+ uc ? gnu_u1 : gnu_u1;
+
+ sve_u1 ? sve_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 ? gnu_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 ? sve_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 ? gnu_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 ? sve_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 ? gnu_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 ? sve_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 ? gnu_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Vector built-ins. */
+
+ __builtin_shuffle (sve_u1, sve_u1, sve_u1); /* { dg-error {'__builtin_shuffle' last argument must be an integer vector} } */
+ __builtin_shuffle (sve_u1, gnu_u1, gnu_u1); /* { dg-error {'__builtin_shuffle' arguments must be vectors} } */
+ __builtin_shuffle (gnu_u1, sve_u1, gnu_u1); /* { dg-error {'__builtin_shuffle' arguments must be vectors} } */
+ __builtin_shuffle (gnu_u1, gnu_u1, sve_u1); /* { dg-error {'__builtin_shuffle' last argument must be an integer vector} } */
+ __builtin_shuffle (gnu_u1, gnu_u1, gnu_u1);
+
+ __builtin_convertvector (sve_u1, svuint8_t); /* { dg-error {'__builtin_convertvector' first argument must be an integer or floating vector} } */
+ __builtin_convertvector (gnu_u1, svuint8_t); /* { dg-error {'__builtin_convertvector' second argument must be an integer or floating vector type} } */
+ __builtin_convertvector (sve_u1, gnu_uint8_t); /* { dg-error {'__builtin_convertvector' first argument must be an integer or floating vector} } */
+ __builtin_convertvector (gnu_u1, gnu_uint8_t);
+}
--- /dev/null
+/* { dg-options "-msve-vector-bits=256 -flax-vector-conversions" } */
+
+#include <arm_sve.h>
+
+typedef uint8_t gnu_uint8_t __attribute__ ((vector_size (32)));
+typedef int8_t gnu_int8_t __attribute__ ((vector_size (32)));
+
+void
+f (svuint8_t sve_u1, svint8_t sve_s1,
+ gnu_uint8_t gnu_u1, gnu_int8_t gnu_s1, int n, unsigned char uc)
+{
+ /* Initialization. */
+
+ svuint8_t init_sve_u1 = 0; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'int'} } */
+ svuint8_t init_sve_u2 = {}; /* { dg-error {empty scalar initializer} } */
+ svuint8_t init_sve_u3 = { sve_u1 };
+ svuint8_t init_sve_u4 = { gnu_u1 };
+ svuint8_t init_sve_u5 = { sve_s1 };
+ svuint8_t init_sve_u6 = { gnu_s1 };
+ svuint8_t init_sve_u7 = { 0 }; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'int'} } */
+ svuint8_t init_sve_u8 = { sve_u1, sve_u1 }; /* { dg-warning {excess elements in scalar initializer} } */
+ svuint8_t init_sve_u9 = { gnu_u1, gnu_u1 }; /* { dg-warning {excess elements in scalar initializer} } */
+
+ gnu_uint8_t init_gnu_u1 = 0; /* { dg-error {incompatible types when initializing type 'gnu_uint8_t'[^\n]* using type 'int'} } */
+ gnu_uint8_t init_gnu_u2 = {};
+ gnu_uint8_t init_gnu_u3 = { sve_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u4 = { gnu_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u5 = { sve_s1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u6 = { gnu_s1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ gnu_uint8_t init_gnu_u7 = { 0 };
+
+ /* Compound literals. */
+
+ (svuint8_t) {}; /* { dg-error {empty scalar initializer} } */
+ (svuint8_t) { 0 }; /* { dg-error {incompatible types when initializing type 'svuint8_t' using type 'int'} } */
+ (svuint8_t) { sve_u1 };
+ (svuint8_t) { gnu_u1 };
+ (svuint8_t) { sve_s1 };
+ (svuint8_t) { gnu_s1 };
+
+ (gnu_uint8_t) {};
+ (gnu_uint8_t) { 0 };
+ (gnu_uint8_t) { sve_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+ (gnu_uint8_t) { gnu_u1 }; /* { dg-error {incompatible types when initializing type 'unsigned char'} } */
+
+ /* Assignment. */
+
+ sve_u1 = 0; /* { dg-error {incompatible types when assigning to type 'svuint8_t' from type 'int'} } */
+ sve_u1 = sve_u1;
+ sve_u1 = gnu_u1;
+ sve_u1 = sve_s1;
+ sve_u1 = gnu_s1;
+
+ gnu_u1 = 0; /* { dg-error {incompatible types when assigning to type 'gnu_uint8_t'[^\n]* from type 'int'} } */
+ gnu_u1 = sve_u1;
+ gnu_u1 = gnu_u1;
+ gnu_u1 = sve_s1;
+ gnu_u1 = gnu_s1;
+
+ /* Casts. */
+
+ (void) sve_u1;
+ (svuint8_t) sve_u1;
+ (svuint8_t) gnu_u1;
+ (svuint8_t) 0; /* { dg-error {conversion to non-scalar type requested} } */
+ (svuint8_t) n; /* { dg-error {conversion to non-scalar type requested} } */
+ (svint8_t) sve_u1;
+ (svint8_t) gnu_u1;
+
+ (void) gnu_u1;
+ (gnu_uint8_t) sve_u1;
+ (gnu_uint8_t) gnu_u1;
+ (gnu_uint8_t) 0; /* { dg-error {cannot convert a value of type 'int' to vector type '[^']*' which has different size} } */
+ (gnu_uint8_t) n; /* { dg-error {cannot convert a value of type 'int' to vector type '[^']*' which has different size} } */
+ (gnu_int8_t) sve_u1;
+ (gnu_int8_t) gnu_u1;
+
+ /* Vector indexing. */
+
+ sve_u1[0]; /* { dg-error {subscripted value is neither array nor pointer} } */
+ &sve_u1[0]; /* { dg-error {subscripted value is neither array nor pointer} } */
+
+ gnu_u1[0];
+ &gnu_u1[0];
+
+ /* Unary operators. */
+
+ +sve_u1; /* { dg-error {wrong type argument to unary plus} } */
+ -sve_u1; /* { dg-error {wrong type argument to unary minus} } */
+ ~sve_u1; /* { dg-error {wrong type argument to bit-complement} } */
+ !sve_u1; /* { dg-error {wrong type argument to unary exclamation mark} } */
+ *sve_u1; /* { dg-error {invalid type argument of unary '\*'} } */
+ __real sve_u1; /* { dg-error {wrong type argument to __real} } */
+ __imag sve_u1; /* { dg-error {wrong type argument to __imag} } */
+ ++sve_u1; /* { dg-error {wrong type argument to increment} } */
+ --sve_u1; /* { dg-error {wrong type argument to decrement} } */
+ sve_u1++; /* { dg-error {wrong type argument to increment} } */
+ sve_u1--; /* { dg-error {wrong type argument to decrement} } */
+
+ +gnu_u1;
+ -gnu_u1;
+ ~gnu_u1;
+ !gnu_u1; /* { dg-error {wrong type argument to unary exclamation mark} } */
+ *gnu_u1; /* { dg-error {invalid type argument of unary '\*'} } */
+ __real gnu_u1; /* { dg-error {wrong type argument to __real} } */
+ __imag gnu_u1; /* { dg-error {wrong type argument to __imag} } */
+ ++gnu_u1;
+ --gnu_u1;
+ gnu_u1++;
+ gnu_u1--;
+
+ /* Vector-vector binary arithmetic. */
+
+ sve_u1 + sve_u1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - sve_u1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * sve_u1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / sve_u1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % sve_u1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & sve_u1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | sve_u1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ sve_u1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == sve_u1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != sve_u1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= sve_u1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < sve_u1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > sve_u1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= sve_u1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << sve_u1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> sve_u1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || sve_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ sve_u1 + gnu_u1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - gnu_u1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * gnu_u1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / gnu_u1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % gnu_u1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & gnu_u1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | gnu_u1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ gnu_u1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == gnu_u1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != gnu_u1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= gnu_u1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < gnu_u1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > gnu_u1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= gnu_u1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << gnu_u1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> gnu_u1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + sve_u1; /* { dg-error {invalid operands to binary \+} } */
+ gnu_u1 - sve_u1; /* { dg-error {invalid operands to binary -} } */
+ gnu_u1 * sve_u1; /* { dg-error {invalid operands to binary \*} } */
+ gnu_u1 / sve_u1; /* { dg-error {invalid operands to binary /} } */
+ gnu_u1 % sve_u1; /* { dg-error {invalid operands to binary %} } */
+ gnu_u1 & sve_u1; /* { dg-error {invalid operands to binary \&} } */
+ gnu_u1 | sve_u1; /* { dg-error {invalid operands to binary \|} } */
+ gnu_u1 ^ sve_u1; /* { dg-error {invalid operands to binary \^} } */
+ gnu_u1 == sve_u1; /* { dg-error {invalid operands to binary ==} } */
+ gnu_u1 != sve_u1; /* { dg-error {invalid operands to binary !=} } */
+ gnu_u1 <= sve_u1; /* { dg-error {invalid operands to binary <=} } */
+ gnu_u1 < sve_u1; /* { dg-error {invalid operands to binary <} } */
+ gnu_u1 > sve_u1; /* { dg-error {invalid operands to binary >} } */
+ gnu_u1 >= sve_u1; /* { dg-error {invalid operands to binary >=} } */
+ gnu_u1 << sve_u1; /* { dg-error {invalid operands to binary <<} } */
+ gnu_u1 >> sve_u1; /* { dg-error {invalid operands to binary >>} } */
+ gnu_u1 && sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || sve_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + gnu_u1;
+ gnu_u1 - gnu_u1;
+ gnu_u1 * gnu_u1;
+ gnu_u1 / gnu_u1;
+ gnu_u1 % gnu_u1;
+ gnu_u1 & gnu_u1;
+ gnu_u1 | gnu_u1;
+ gnu_u1 ^ gnu_u1;
+ gnu_u1 == gnu_u1;
+ gnu_u1 != gnu_u1;
+ gnu_u1 <= gnu_u1;
+ gnu_u1 < gnu_u1;
+ gnu_u1 > gnu_u1;
+ gnu_u1 >= gnu_u1;
+ gnu_u1 << gnu_u1;
+ gnu_u1 >> gnu_u1;
+ gnu_u1 && gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Vector-scalar binary arithmetic. */
+
+ sve_u1 + 2; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - 2; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * 2; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / 2; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % 2; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & 2; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | 2; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ 2; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == 2; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != 2; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= 2; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < 2; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > 2; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= 2; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << 2; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> 2; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && 2; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || 2; /* { dg-error {used vector type where scalar is required} } */
+
+ sve_u1 + uc; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - uc; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * uc; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / uc; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % uc; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & uc; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | uc; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ uc; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == uc; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != uc; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= uc; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < uc; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > uc; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= uc; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << uc; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> uc; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && uc; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || uc; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + 2;
+ gnu_u1 - 2;
+ gnu_u1 * 2;
+ gnu_u1 / 2;
+ gnu_u1 % 2;
+ gnu_u1 & 2;
+ gnu_u1 | 2;
+ gnu_u1 ^ 2;
+ gnu_u1 == 2;
+ gnu_u1 != 2;
+ gnu_u1 <= 2;
+ gnu_u1 < 2;
+ gnu_u1 > 2;
+ gnu_u1 >= 2;
+ gnu_u1 << 2;
+ gnu_u1 >> 2;
+ gnu_u1 && 2; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || 2; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + uc;
+ gnu_u1 - uc;
+ gnu_u1 * uc;
+ gnu_u1 / uc;
+ gnu_u1 % uc;
+ gnu_u1 & uc;
+ gnu_u1 | uc;
+ gnu_u1 ^ uc;
+ gnu_u1 == uc;
+ gnu_u1 != uc;
+ gnu_u1 <= uc;
+ gnu_u1 < uc;
+ gnu_u1 > uc;
+ gnu_u1 >= uc;
+ gnu_u1 << uc;
+ gnu_u1 >> uc;
+ gnu_u1 && uc; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || uc; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Scalar-vector binary arithmetic. */
+
+ 3 + sve_u1; /* { dg-error {invalid operands to binary \+} } */
+ 3 - sve_u1; /* { dg-error {invalid operands to binary -} } */
+ 3 * sve_u1; /* { dg-error {invalid operands to binary \*} } */
+ 3 / sve_u1; /* { dg-error {invalid operands to binary /} } */
+ 3 % sve_u1; /* { dg-error {invalid operands to binary %} } */
+ 3 & sve_u1; /* { dg-error {invalid operands to binary \&} } */
+ 3 | sve_u1; /* { dg-error {invalid operands to binary \|} } */
+ 3 ^ sve_u1; /* { dg-error {invalid operands to binary \^} } */
+ 3 == sve_u1; /* { dg-error {invalid operands to binary ==} } */
+ 3 != sve_u1; /* { dg-error {invalid operands to binary !=} } */
+ 3 <= sve_u1; /* { dg-error {invalid operands to binary <=} } */
+ 3 < sve_u1; /* { dg-error {invalid operands to binary <} } */
+ 3 > sve_u1; /* { dg-error {invalid operands to binary >} } */
+ 3 >= sve_u1; /* { dg-error {invalid operands to binary >=} } */
+ 3 << sve_u1; /* { dg-error {invalid operands to binary <<} } */
+ 3 >> sve_u1; /* { dg-error {invalid operands to binary >>} } */
+ 3 && sve_u1; /* { dg-error {invalid operands to binary \&\&} } */
+ 3 || sve_u1; /* { dg-error {invalid operands to binary \|\|} } */
+
+ 3 + gnu_u1;
+ 3 - gnu_u1;
+ 3 * gnu_u1;
+ 3 / gnu_u1;
+ 3 % gnu_u1;
+ 3 & gnu_u1;
+ 3 | gnu_u1;
+ 3 ^ gnu_u1;
+ 3 == gnu_u1;
+ 3 != gnu_u1;
+ 3 <= gnu_u1;
+ 3 < gnu_u1;
+ 3 > gnu_u1;
+ 3 >= gnu_u1;
+ 3 << gnu_u1;
+ 3 >> gnu_u1;
+ 3 && gnu_u1; /* { dg-error {invalid operands to binary \&\&} } */
+ 3 || gnu_u1; /* { dg-error {invalid operands to binary \|\|} } */
+
+ /* Mismatched types. */
+
+ sve_u1 + sve_s1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - sve_s1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * sve_s1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / sve_s1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % sve_s1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & sve_s1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | sve_s1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ sve_s1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == sve_s1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != sve_s1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= sve_s1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < sve_s1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > sve_s1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= sve_s1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << sve_s1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> sve_s1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && sve_s1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || sve_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ sve_u1 + gnu_s1; /* { dg-error {invalid operands to binary \+} } */
+ sve_u1 - gnu_s1; /* { dg-error {invalid operands to binary -} } */
+ sve_u1 * gnu_s1; /* { dg-error {invalid operands to binary \*} } */
+ sve_u1 / gnu_s1; /* { dg-error {invalid operands to binary /} } */
+ sve_u1 % gnu_s1; /* { dg-error {invalid operands to binary %} } */
+ sve_u1 & gnu_s1; /* { dg-error {invalid operands to binary \&} } */
+ sve_u1 | gnu_s1; /* { dg-error {invalid operands to binary \|} } */
+ sve_u1 ^ gnu_s1; /* { dg-error {invalid operands to binary \^} } */
+ sve_u1 == gnu_s1; /* { dg-error {invalid operands to binary ==} } */
+ sve_u1 != gnu_s1; /* { dg-error {invalid operands to binary !=} } */
+ sve_u1 <= gnu_s1; /* { dg-error {invalid operands to binary <=} } */
+ sve_u1 < gnu_s1; /* { dg-error {invalid operands to binary <} } */
+ sve_u1 > gnu_s1; /* { dg-error {invalid operands to binary >} } */
+ sve_u1 >= gnu_s1; /* { dg-error {invalid operands to binary >=} } */
+ sve_u1 << gnu_s1; /* { dg-error {invalid operands to binary <<} } */
+ sve_u1 >> gnu_s1; /* { dg-error {invalid operands to binary >>} } */
+ sve_u1 && gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 || gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + sve_s1; /* { dg-error {invalid operands to binary \+} } */
+ gnu_u1 - sve_s1; /* { dg-error {invalid operands to binary -} } */
+ gnu_u1 * sve_s1; /* { dg-error {invalid operands to binary \*} } */
+ gnu_u1 / sve_s1; /* { dg-error {invalid operands to binary /} } */
+ gnu_u1 % sve_s1; /* { dg-error {invalid operands to binary %} } */
+ gnu_u1 & sve_s1; /* { dg-error {invalid operands to binary \&} } */
+ gnu_u1 | sve_s1; /* { dg-error {invalid operands to binary \|} } */
+ gnu_u1 ^ sve_s1; /* { dg-error {invalid operands to binary \^} } */
+ gnu_u1 == sve_s1; /* { dg-error {invalid operands to binary ==} } */
+ gnu_u1 != sve_s1; /* { dg-error {invalid operands to binary !=} } */
+ gnu_u1 <= sve_s1; /* { dg-error {invalid operands to binary <=} } */
+ gnu_u1 < sve_s1; /* { dg-error {invalid operands to binary <} } */
+ gnu_u1 > sve_s1; /* { dg-error {invalid operands to binary >} } */
+ gnu_u1 >= sve_s1; /* { dg-error {invalid operands to binary >=} } */
+ gnu_u1 << sve_s1; /* { dg-error {invalid operands to binary <<} } */
+ gnu_u1 >> sve_s1; /* { dg-error {invalid operands to binary >>} } */
+ gnu_u1 && sve_s1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || sve_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 + gnu_s1;
+ gnu_u1 - gnu_s1;
+ gnu_u1 * gnu_s1;
+ gnu_u1 / gnu_s1;
+ gnu_u1 % gnu_s1;
+ gnu_u1 & gnu_s1;
+ gnu_u1 | gnu_s1;
+ gnu_u1 ^ gnu_s1;
+ gnu_u1 == gnu_s1;
+ gnu_u1 != gnu_s1;
+ gnu_u1 <= gnu_s1;
+ gnu_u1 < gnu_s1;
+ gnu_u1 > gnu_s1;
+ gnu_u1 >= gnu_s1;
+ gnu_u1 << gnu_s1;
+ gnu_u1 >> gnu_s1;
+ gnu_u1 && gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 || gnu_s1; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Conditional expressions. */
+
+ uc ? sve_u1 : sve_u1;
+ uc ? gnu_u1 : sve_u1; /* { dg-error {type mismatch in conditional expression} } */
+ uc ? sve_u1 : gnu_u1; /* { dg-error {type mismatch in conditional expression} } */
+ uc ? gnu_u1 : gnu_u1;
+
+ sve_u1 ? sve_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 ? gnu_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 ? sve_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ sve_u1 ? gnu_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ gnu_u1 ? sve_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 ? gnu_u1 : sve_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 ? sve_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+ gnu_u1 ? gnu_u1 : gnu_u1; /* { dg-error {used vector type where scalar is required} } */
+
+ /* Vector built-ins. */
+
+ __builtin_shuffle (sve_u1, sve_u1, sve_u1); /* { dg-error {'__builtin_shuffle' last argument must be an integer vector} } */
+ __builtin_shuffle (sve_u1, gnu_u1, gnu_u1); /* { dg-error {'__builtin_shuffle' arguments must be vectors} } */
+ __builtin_shuffle (gnu_u1, sve_u1, gnu_u1); /* { dg-error {'__builtin_shuffle' arguments must be vectors} } */
+ __builtin_shuffle (gnu_u1, gnu_u1, sve_u1); /* { dg-error {'__builtin_shuffle' last argument must be an integer vector} } */
+ __builtin_shuffle (gnu_u1, gnu_u1, gnu_u1);
+
+ __builtin_convertvector (sve_u1, svuint8_t); /* { dg-error {'__builtin_convertvector' first argument must be an integer or floating vector} } */
+ __builtin_convertvector (gnu_u1, svuint8_t); /* { dg-error {'__builtin_convertvector' second argument must be an integer or floating vector type} } */
+ __builtin_convertvector (sve_u1, gnu_uint8_t); /* { dg-error {'__builtin_convertvector' first argument must be an integer or floating vector} } */
+ __builtin_convertvector (gnu_u1, gnu_uint8_t);
+}
unsigned warn_if_not_align : 6;
unsigned typeless_storage : 1;
unsigned empty_flag : 1;
- unsigned spare : 17;
+ unsigned indivisible_p : 1;
+ unsigned spare : 16;
alias_set_type alias_set;
tree pointer_to;
/* Used to indicate that this TYPE represents a compiler-generated entity. */
#define TYPE_ARTIFICIAL(NODE) (TYPE_CHECK (NODE)->base.nowarning_flag)
+/* True if the type is indivisible at the source level, i.e. if its
+ component parts cannot be accessed directly. This is used to suppress
+ normal GNU extensions for target-specific vector types. */
+#define TYPE_INDIVISIBLE_P(NODE) (TYPE_CHECK (NODE)->type_common.indivisible_p)
+
/* In an IDENTIFIER_NODE, this means that assemble_name was called with
this string as an argument. */
#define TREE_SYMBOL_REFERENCED(NODE) \