On 1/7/20 3:26 PM, Richard Sandiford wrote:
> Stam Markianos-Wright <[email protected]> writes:
>> On 12/19/19 10:08 AM, Richard Sandiford wrote:
>>> Stam Markianos-Wright <[email protected]> writes:
>>>> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
>>>> index f57469b6e23..f40f6432fd4 100644
>>>> --- a/gcc/config/aarch64/aarch64.c
>>>> +++ b/gcc/config/aarch64/aarch64.c
>>>> @@ -21661,6 +21661,68 @@ aarch64_stack_protect_guard (void)
>>>> return NULL_TREE;
>>>> }
>>>>
>>>> +/* Return the diagnostic message string if conversion from FROMTYPE to
>>>> + TOTYPE is not allowed, NULL otherwise. */
>>>> +
>>>> +static const char *
>>>> +aarch64_invalid_conversion (const_tree fromtype, const_tree totype)
>>>> +{
>>>> + static char templ[100];
>>>> + if ((GET_MODE_INNER (TYPE_MODE (fromtype)) == BFmode
>>>> + || GET_MODE_INNER (TYPE_MODE (totype)) == BFmode)
>>>> + && TYPE_MODE (fromtype) != TYPE_MODE (totype))
>>>> + {
>>>> + snprintf (templ, sizeof (templ), \
>>>> + "incompatible types when assigning to type '%s' from type '%s'",
>>>> + IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (totype))),
>>>> + IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (fromtype))));
>>>> + return N_(templ);
>>>> + }
>>>> + /* Conversion allowed. */
>>>> + return NULL;
>>>> +}
>>>> +
>>>
>>> This won't handle translation properly. We also have no guarantee that
>>> the formatted string will fit in 100 characters since at least one of
>>> the type names is unconstrained. (Also, not all types have names.)
>>>
>>
>> Hi Richard. I'm sending an email here to show you what I have done here, too
>> :)
>>
>> Currently I have the following:
>>
>> static const char *
>> aarch64_invalid_conversion (const_tree fromtype, const_tree totype)
>> {
>> static char templ[100];
>> if (TYPE_MODE (fromtype) != TYPE_MODE (totype)
>> && ((TYPE_MODE (fromtype) == BFmode && !VECTOR_TYPE_P (fromtype))
>> || (TYPE_MODE (totype) == BFmode && !VECTOR_TYPE_P (totype))))
>
> Just:
>
> if (TYPE_MODE (fromtype) != TYPE_MODE (totype)
> && (TYPE_MODE (fromtype) == BFmode || TYPE_MODE (fromtype) ==
> BFmode))
>
> should be enough. Types that have BFmode can't also be vectors.
Yep, agreed.
>
>> {
>> if (TYPE_NAME (fromtype) != NULL && TYPE_NAME (totype) != NULL)
>> {
>> snprintf (templ, sizeof (templ),
>> "incompatible types when assigning to type '%s' from type '%s'",
>> IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (totype))),
>> IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (fromtype))));
>> return N_(templ);
>> }
>> else
>> {
>> snprintf (templ, sizeof (templ),
>> "incompatible types for assignment");
>> return N_(templ);
>> }
>
> This still has the problem I mentioned above though: DECL_NAMEs are
> supplied by the user and can be arbitrary lengths, so there's no
> guarantee that the error message fits in the 100-character buffer.
> We would get a truncated message if the buffer isn't big enough.
>
> As far as translation goes: the arguments to diagnostic functions
> like "error" are untranslated strings, which the diagnostic functions
> then translate internally. po/exgettext scans the source tree looking
> for strings that need to be translatable and collects them all in po/gcc.pot.
> Constant format strings in calls to known diagnostic functions get picked
> up automatically (see ABOUT-GCC-NLS), but others need to be marked with
> N_(). This N_() is simply a no-op wrapper macro that marks the argument
> as needing translation. It has no effect if the argument isn't a
> constant string.
>
> The interface of this hook is to return an untranslated diagnostic string
> that gets passed to error. A better interface would be to let the hook
> raise its own error and return a boolean result, but that isn't what
> we have.
>
> So in the above, it's "incompatible types for assignment" that needs to
> be wrapped in N_(). Wrapping templ has no effect.
>
> This is also why the first arm doesn't work for translation. It constructs
> and returns an arbitrary new string that won't have been entered into
> gcc.pot (and can't be, since it depends on the names of the user types).
> So the error function will have no chance to translate it. And it would
> be a layering violation to try to translate it here.
>
> So the hook basically has to return fixed strings marked with N_().
> I don't think it should mention assignment though, since the conversions
> could occur in any context (initialisation, function calls, etc.). If
> "invalid conversion" seems too terse, maybe we could have things like:
>
> "invalid conversion to %<bfloat16_t%>"
>
> and:
>
> "invalid conversion to %<bfloat16_t%>"
>
Oh ok I think I get you now (I was totally not aware of how this worked, as you
probably guessed!).
I have simplified it now as you suggested (in all 3 target hooks).
Also updated all the tests to check for correct behaviour as per below and
added
a few more checks to make the tests more robust as per our previous emails.
Also added a small c++ test for bfloat16_t(); behaviour. One nit here:
By the time the compiler reaches our target hook for just "bfloat16_t ();" it
thinks that fromtype is an SImode constant 0.
With sume debugging I've seen that the whole raw printout of the type tree of
fromtype is identical for "bfloat16_t ();" and "bfloat16_t (0x1234);" or eveb
"bfloat16_t (5);", so it looks like our target hook won't be able to
differentiate between the two... Do you have any ideas for this? (Or we just
leave it as blocked, which is a bit weird)
Let me know if you notice I've missed anything else!
>> }
>> /* Conversion allowed. */
>> return NULL;
>> }
>>
>> This blocks the conversion only if the two types are of different modes and
>> one
>> of them is a BFmode scalar.
>>
>> Doing it like this seems to block all scalar-sized assignments:
>>
>> C:
>>
>> typedef bfloat16_t vbf __attribute__((vector_size(2)));
>> vbf foo3 (void) { return (vbf) 0x1234; }
>>
>> bfloat16_t foo1 (void) { return (bfloat16_t) 0x1234; }
>>
>> bfloat16_t scalar1_3 = 0;
>> bfloat16_t scalar1_4 = 0.1;
>> bfloat16_t scalar1_5 = is_a_float;
>>
>> bfloat16x4_t vector2_8 = { 0.0, 0, n2, is_a_float }; // (blocked on each
>> element
>> assignment)
>>
>>
>> C++:
>>
>> bfloat16_t c1 (void) { return bfloat16_t (0x1234); }
>>
>> bfloat16_t c2 (void) { return bfloat16_t (0.1); }
>>
>>
>> But then it allows vector initialisation from binary:
>>
>> C:
>> bfloat16x4_t foo1 (void) { return (bfloat16x4_t) 0x1234567812345678; }
>>
>> C++:
>> bfloat16x4_t foo1 (void) { return bfloat16x4_t (0x1234567812345678); }
>> typedef bfloat16_t v2bf __attribute__((vector_size(4)));
>> v2bf foo3 (void) { return v2bf (0x12345678); }
>>
>> I also need to check with a colleague who is on holiday if any of this
>> impacts
>> the vector-reinterpret intrinsics that he was working on...
>>
>> Let me know of your thoughts!
>
> Sounds good to me. I hadn't realised when talking about the "(vector) int"
> thing that this hook would block it, and TBH it probably isn't important
> enough to go out of our way to unblock it. But I think this is also the
> behaviour we want for vector-vector conversions, which definitely are
> important.
Amazing. The other pro of this is that we are now as close as we can be to
clang
behaviour, too :)
>
> Thanks,
> Richard
>
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index ebd3f6cf45b..ce410ddf551 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -21760,6 +21760,55 @@ aarch64_stack_protect_guard (void)
return NULL_TREE;
}
+/* Return the diagnostic message string if conversion from FROMTYPE to
+ TOTYPE is not allowed, NULL otherwise. */
+
+static const char *
+aarch64_invalid_conversion (const_tree fromtype, const_tree totype)
+{
+ if (element_mode (fromtype) != element_mode (totype))
+ {
+ /* Do no allow conversions to/from BFmode scalar types. */
+ if (TYPE_MODE (fromtype) == BFmode)
+ return N_("invalid conversion from type %<bfloat16_t%>");
+ if (TYPE_MODE (totype) == BFmode)
+ return N_("invalid conversion to type %<bfloat16_t%>");
+ }
+
+ /* Conversion allowed. */
+ return NULL;
+}
+
+/* Return the diagnostic message string if the unary operation OP is
+ not permitted on TYPE, NULL otherwise. */
+
+static const char *
+aarch64_invalid_unary_op (int op, const_tree type)
+{
+ /* Reject all single-operand operations on BFmode except for &. */
+ if (element_mode (type) == BFmode && op != ADDR_EXPR)
+ return N_("operation not permitted on type %<bfloat16_t%>");
+
+ /* Operation allowed. */
+ return NULL;
+}
+
+/* Return the diagnostic message string if the binary operation OP is
+ not permitted on TYPE1 and TYPE2, NULL otherwise. */
+
+static const char *
+aarch64_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1,
+ const_tree type2)
+{
+ /* Reject all 2-operand operations on BFmode. */
+ if (element_mode (type1) == BFmode
+ || element_mode (type2) == BFmode)
+ return N_("operation not permitted on type %<bfloat16_t%>");
+
+ /* Operation allowed. */
+ return NULL;
+}
+
/* Implement TARGET_ASM_FILE_END for AArch64. This adds the AArch64 GNU NOTE
section at the end if needed. */
#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000
@@ -22010,6 +22059,15 @@ aarch64_libgcc_floating_mode_supported_p
#undef TARGET_MANGLE_TYPE
#define TARGET_MANGLE_TYPE aarch64_mangle_type
+#undef TARGET_INVALID_CONVERSION
+#define TARGET_INVALID_CONVERSION aarch64_invalid_conversion
+
+#undef TARGET_INVALID_UNARY_OP
+#define TARGET_INVALID_UNARY_OP aarch64_invalid_unary_op
+
+#undef TARGET_INVALID_BINARY_OP
+#define TARGET_INVALID_BINARY_OP aarch64_invalid_binary_op
+
#undef TARGET_VERIFY_TYPE_CONTEXT
#define TARGET_VERIFY_TYPE_CONTEXT aarch64_verify_type_context
diff --git a/gcc/testsuite/g++.target/aarch64/bfloat_cpp_typecheck.C b/gcc/testsuite/g++.target/aarch64/bfloat_cpp_typecheck.C
new file mode 100644
index 00000000000..55cbb0b0ef7
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/bfloat_cpp_typecheck.C
@@ -0,0 +1,14 @@
+/* { dg-do assemble { target { aarch64*-*-* } } } */
+/* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
+/* { dg-add-options arm_v8_2a_bf16_neon } */
+/* { dg-additional-options "-O3 --save-temps" } */
+
+#include <arm_neon.h>
+
+void foo (void)
+{
+ bfloat16_t (); /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t a = bfloat16_t(); /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t (0x1234); /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t (0.1); /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/bfloat16_scalar_typecheck.c b/gcc/testsuite/gcc.target/aarch64/bfloat16_scalar_typecheck.c
new file mode 100644
index 00000000000..5a9eda67411
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/bfloat16_scalar_typecheck.c
@@ -0,0 +1,219 @@
+/* { dg-do assemble { target { aarch64*-*-* } } } */
+/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } } */
+/* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
+/* { dg-add-options arm_v8_2a_bf16_neon } */
+/* { dg-additional-options "-Wno-pedantic -O3 --save-temps" } */
+
+#include <arm_neon.h>
+
+bfloat16_t glob_bfloat;
+
+int is_an_int;
+short is_a_short_int;
+float is_a_float;
+float is_a_float16;
+double is_a_double;
+
+float *float_ptr;
+
+bfloat16_t foo1 (void) { return (bfloat16_t) 0x1234; } /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+bfloat16_t foo2 (void) { return (bfloat16_t) (short) 0x1234; } /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+bfloat16_t footest (bfloat16_t scalar0)
+{
+
+ /* Initialisation */
+
+ bfloat16_t scalar1_1;
+ bfloat16_t scalar1_2 = glob_bfloat;
+ bfloat16_t scalar1_3 = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar1_4 = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar1_5 = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar1_6 = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar1_7 = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar1_8 = is_a_double; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar1_9 = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ int initi_1_1 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float initi_1_2 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float16_t initi_1_3 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ short initi_1_4 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ double initi_1_5 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ bfloat16_t scalar2_1 = {}; /* { dg-error {empty scalar initializer} "" {target *-*-*} } */
+ bfloat16_t scalar2_2 = { glob_bfloat };
+ bfloat16_t scalar2_3 = { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar2_4 = { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar2_5 = { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar2_6 = { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar2_7 = { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar2_8 = { is_a_double }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16_t scalar2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ int initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float16_t initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ short initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ double initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Assignments. */
+
+ glob_bfloat = glob_bfloat;
+ glob_bfloat = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat = is_a_double; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ is_an_int = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float16 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_double = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_short_int = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Casting. */
+
+ (void) glob_bfloat;
+ (bfloat16_t) glob_bfloat;
+
+ (int) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (float) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (float16_t) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (double) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (short) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ (bfloat16_t) is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) is_a_double; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Compound literals. */
+
+ (bfloat16_t) {}; /* { dg-error {empty scalar initializer} "" {target *-*-*} } */
+ (bfloat16_t) { glob_bfloat };
+ (bfloat16_t) { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) { is_a_double }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16_t) { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ (int) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (float) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (float16_t) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (double) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ (short) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Arrays and Structs. */
+
+ typedef bfloat16_t array_type[2];
+ extern bfloat16_t extern_array[];
+
+ bfloat16_t array[2];
+ bfloat16_t zero_length_array[0];
+ bfloat16_t empty_init_array[] = {};
+ typedef bfloat16_t some_other_type[is_an_int];
+
+ struct struct1 {
+ bfloat16_t a;
+ };
+
+ union union1 {
+ bfloat16_t a;
+ };
+
+ /* Addressing and dereferencing. */
+
+ bfloat16_t *bfloat_ptr = &scalar0;
+ scalar0 = *bfloat_ptr;
+
+ /* Pointer assignment. */
+
+ bfloat16_t *bfloat_ptr2 = bfloat_ptr;
+ bfloat16_t *bfloat_ptr3 = array;
+
+ /* Pointer arithmetic. */
+
+ ++bfloat_ptr;
+ --bfloat_ptr;
+ bfloat_ptr++;
+ bfloat_ptr--;
+ bfloat_ptr += 1;
+ bfloat_ptr -= 1;
+ bfloat_ptr - bfloat_ptr2;
+ bfloat_ptr = &bfloat_ptr3[0];
+ bfloat_ptr = &bfloat_ptr3[1];
+
+ /* Simple comparison. */
+ scalar0 > glob_bfloat; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat == scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 > is_a_float; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float == scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 > 0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 == scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 > 0.1; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ 0.1 == scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 > is_an_int; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ is_an_int == scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Pointer comparison. */
+
+ bfloat_ptr == &scalar0;
+ bfloat_ptr != &scalar0;
+ bfloat_ptr < &scalar0;
+ bfloat_ptr <= &scalar0;
+ bfloat_ptr > &scalar0;
+ bfloat_ptr >= &scalar0;
+ bfloat_ptr == bfloat_ptr2;
+ bfloat_ptr != bfloat_ptr2;
+ bfloat_ptr < bfloat_ptr2;
+ bfloat_ptr <= bfloat_ptr2;
+ bfloat_ptr > bfloat_ptr2;
+ bfloat_ptr >= bfloat_ptr2;
+
+ /* Conditional expressions. */
+
+ 0 ? scalar0 : scalar0;
+ 0 ? scalar0 : is_a_float; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 ? is_a_float : scalar0; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 ? scalar0 : 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 ? 0 : scalar0; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 ? 0.1 : scalar0; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 ? scalar0 : 0.1; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 ? bfloat_ptr : bfloat_ptr2;
+ 0 ? bfloat_ptr : float_ptr; /* { dg-error {pointer type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? float_ptr : bfloat_ptr; /* { dg-error {pointer type mismatch in conditional expression} "" {target *-*-*} } */
+
+ scalar0 ? scalar0 : scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 ? is_a_float : scalar0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 ? scalar0 : is_a_float; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 ? is_a_float : is_a_float; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Unary operators. */
+
+ +scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ -scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ ~scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ !scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ *scalar0; /* { dg-error {invalid type argument of unary '\*'} "" {target *-*-*} } */
+ __real scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ __imag scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ ++scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ --scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0++; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0--; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Binary arithmetic operations. */
+
+ scalar0 = glob_bfloat + *bfloat_ptr; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 = glob_bfloat + 0.1; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 = glob_bfloat + 0; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+ scalar0 = glob_bfloat + is_a_float; /* { dg-error {operation not permitted using type 'bfloat16_t'} "" {target *-*-*} } */
+
+ return scalar0;
+}
+
diff --git a/gcc/testsuite/gcc.target/aarch64/bfloat16_vector_typecheck_1.c b/gcc/testsuite/gcc.target/aarch64/bfloat16_vector_typecheck_1.c
new file mode 100644
index 00000000000..fe8a853f3af
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/bfloat16_vector_typecheck_1.c
@@ -0,0 +1,262 @@
+/* { dg-do assemble { target { aarch64*-*-* } } } */
+/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } } */
+/* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
+/* { dg-add-options arm_v8_2a_bf16_neon } */
+/* { dg-additional-options "-O3 --save-temps -Wno-pedantic" } */
+#include <arm_neon.h>
+
+bfloat16_t glob_bfloat;
+bfloat16x4_t glob_bfloat_vec;
+
+float32x4_t is_a_float_vec;
+float32x2_t is_a_float_pair;
+
+float16x4_t *float_ptr;
+float16x4_t is_a_float16_vec;
+
+int32x4_t is_an_int_vec;
+int32x2_t is_an_int_pair;
+int16x4_t is_a_short_vec;
+
+int is_an_int;
+short is_a_short_int;
+float is_a_float;
+float is_a_float16;
+double is_a_double;
+
+/* Create a vector of 2 bfloat16_t. */
+typedef bfloat16_t v2bf __attribute__((vector_size(4)));
+v2bf foo1 (void) { return (v2bf) 0x12345678; }
+bfloat16x4_t foo2 (void) { return (bfloat16x4_t) 0x1234567812345678; }
+
+bfloat16x4_t footest (bfloat16x4_t vector0)
+{
+ /* Initialisation */
+
+ bfloat16x4_t vector1_1;
+ bfloat16x4_t vector1_2 = glob_bfloat_vec;
+ bfloat16x4_t vector1_3 = is_a_float_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x4_t' using type 'float32x4_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector1_4 = is_an_int_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x4_t' using type 'int32x4_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector1_5 = is_a_float16_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x4_t' using type 'float16x4_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector1_6 = is_a_float_pair; /* { dg-error {incompatible types when initializing type 'bfloat16x4_t' using type 'float32x2_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector1_7 = is_an_int_pair; /* { dg-error {incompatible types when initializing type 'bfloat16x4_t' using type 'int32x2_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector1_8 = is_a_short_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x4_t' using type 'int16x4_t'} "" {target *-*-*} } */
+
+ int32x4_t initi_1_1 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'int32x4_t' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ float32x4_t initi_1_2 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'float32x4_t' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ float16x4_t initi_1_3 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'float16x4_t' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ float32x2_t initi_1_4 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'float32x2_t' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ int32x2_t initi_1_5 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'int32x2_t' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ int16x4_t initi_1_6 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'int16x4_t' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+
+ bfloat16x4_t vector2_1 = {};
+ bfloat16x4_t vector2_2 = { glob_bfloat };
+ bfloat16x4_t vector2_3 = { glob_bfloat, glob_bfloat, glob_bfloat, glob_bfloat };
+ bfloat16x4_t vector2_4 = { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector2_5 = { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector2_6 = { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector2_7 = { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector2_8 = { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x4_t vector2_10 = { 0.0, 0, is_a_short_int, is_a_float }; /* { dg-error "invalid conversion to type 'bfloat16_t'" "" {target *-*-*} } */
+
+ int32x4_t initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float32x4_t initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float16x4_t initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float32x2_t initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ int32x2_t initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ int16x4_t initi_2_6 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Assignments to/from vectors. */
+
+ glob_bfloat_vec = glob_bfloat_vec;
+ glob_bfloat_vec = 0; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'int'} "" {target *-*-*} } */
+ glob_bfloat_vec = 0.1; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'double'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_float_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'float32x4_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_an_int_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'int32x4_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_float16_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'float16x4_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_float_pair; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'float32x2_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_an_int_pair; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'int32x2_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_short_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x4_t' from type 'int16x4_t'} "" {target *-*-*} } */
+
+ is_an_int_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'int32x4_t' from type 'bfloat16x4_t'} "" {target *-*-*} } */
+ is_a_float_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'float32x4_t' from type 'bfloat16x4_t'} "" {target *-*-*} } */
+ is_a_float16_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'float16x4_t' from type 'bfloat16x4_t'} "" {target *-*-*} } */
+ is_a_float_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'float32x2_t' from type 'bfloat16x4_t'} "" {target *-*-*} } */
+ is_an_int_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'int32x2_t' from type 'bfloat16x4_t'} "" {target *-*-*} } */
+ is_a_short_vec = glob_bfloat_vec;/* { dg-error {incompatible types when assigning to type 'int16x4_t' from type 'bfloat16x4_t'} "" {target *-*-*} } */
+
+ /* Assignments to/from elements. */
+
+ vector2_3[0] = glob_bfloat;
+ vector2_3[0] = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ glob_bfloat = vector2_3[0];
+ is_an_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_short_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float16 = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Compound literals. */
+
+ (bfloat16x4_t) {};
+
+ (bfloat16x4_t) { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { is_a_float_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float32x4_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { is_an_int_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int32x4_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { is_a_float_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float32x2_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { is_an_int_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int32x2_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { is_a_float16_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float16x4_t'} "" {target *-*-*} } */
+ (bfloat16x4_t) { is_a_short_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int16x4_t'} "" {target *-*-*} } */
+
+ (bfloat16x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ (int32x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'int' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ (float32x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'float' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ (int32x2_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'int' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ (float16x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '__fp16' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+ (int16x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'short int' using type 'bfloat16x4_t'} "" {target *-*-*} } */
+
+ /* Casting. */
+
+ (void) glob_bfloat_vec;
+ (bfloat16x4_t) glob_bfloat_vec;
+
+ (bfloat16_t) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+ (short) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type 'bfloat16x4_t' to type 'short int' which has different size} "" {target *-*-*} } */
+ (int) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type 'bfloat16x4_t' to type 'int' which has different size} "" {target *-*-*} } */
+ (float16_t) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+ (float) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+ (double) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+
+ (int32x4_t) glob_bfloat_vec; /* { dg-error {cannot convert a value of type 'bfloat16x4_t' to vector type '__Int32x4_t' which has different size} "" {target *-*-*} } */
+ (float32x4_t) glob_bfloat_vec; /* { dg-error {cannot convert a value of type 'bfloat16x4_t' to vector type '__Float32x4_t' which has different size} "" {target *-*-*} } */
+ (float16x4_t) glob_bfloat_vec;
+ (int32x2_t) glob_bfloat_vec;
+ (float32x2_t) glob_bfloat_vec;
+ (int16x4_t) glob_bfloat_vec;
+
+ (bfloat16x4_t) is_an_int_vec; /* { dg-error {cannot convert a value of type 'int32x4_t' to vector type '__Bfloat16x4_t' which has different size} "" {target *-*-*} } */
+ (bfloat16x4_t) is_a_float_vec; /* { dg-error {cannot convert a value of type 'float32x4_t' to vector type '__Bfloat16x4_t' which has different size} "" {target *-*-*} } */
+ (bfloat16x4_t) is_a_float16_vec;
+ (bfloat16x4_t) is_an_int_pair;
+ (bfloat16x4_t) is_a_float_pair;
+ (bfloat16x4_t) is_a_short_vec;
+ (bfloat16x4_t) is_a_double; /* { dg-error {cannot convert value to a vector} "" {target *-*-*} } */
+
+ /* Arrays and Structs. */
+
+ typedef bfloat16x4_t array_type[2];
+ extern bfloat16x4_t extern_array[];
+
+ bfloat16x4_t array[2];
+ bfloat16x4_t zero_length_array[0];
+ bfloat16x4_t empty_init_array[] = {};
+ typedef bfloat16x4_t some_other_type[is_an_int];
+
+ struct struct1 {
+ bfloat16x4_t a;
+ };
+
+ union union1 {
+ bfloat16x4_t a;
+ };
+
+ /* Addressing and dereferencing. */
+
+ bfloat16x4_t *bfloat_ptr = &vector0;
+ vector0 = *bfloat_ptr;
+
+ /* Pointer assignment. */
+
+ bfloat16x4_t *bfloat_ptr2 = bfloat_ptr;
+ bfloat16x4_t *bfloat_ptr3 = array;
+
+ /* Pointer arithmetic. */
+
+ ++bfloat_ptr;
+ --bfloat_ptr;
+ bfloat_ptr++;
+ bfloat_ptr--;
+ bfloat_ptr += 1;
+ bfloat_ptr -= 1;
+ bfloat_ptr - bfloat_ptr2;
+ bfloat_ptr = &bfloat_ptr3[0];
+ bfloat_ptr = &bfloat_ptr3[1];
+
+ /* Simple comparison. */
+ vector0 > glob_bfloat_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ 0.1 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > is_an_int_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ is_an_int_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Pointer comparison. */
+
+ bfloat_ptr == &vector0;
+ bfloat_ptr != &vector0;
+ bfloat_ptr < &vector0;
+ bfloat_ptr <= &vector0;
+ bfloat_ptr > &vector0;
+ bfloat_ptr >= &vector0;
+ bfloat_ptr == bfloat_ptr2;
+ bfloat_ptr != bfloat_ptr2;
+ bfloat_ptr < bfloat_ptr2;
+ bfloat_ptr <= bfloat_ptr2;
+ bfloat_ptr > bfloat_ptr2;
+ bfloat_ptr >= bfloat_ptr2;
+
+ /* Conditional expressions. */
+
+ 0 ? vector0 : vector0;
+ 0 ? vector0 : is_a_float_vec; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? is_a_float_vec : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? vector0 : is_a_float16_vec; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? is_a_float16_vec : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? vector0 : 0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? 0 : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? 0.1 : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? vector0 : 0.1; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? bfloat_ptr : bfloat_ptr2;
+ 0 ? bfloat_ptr : float_ptr; /* { dg-error {pointer type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? float_ptr : bfloat_ptr; /* { dg-error {pointer type mismatch in conditional expression} "" {target *-*-*} } */
+
+ vector0 ? vector0 : vector0; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+ vector0 ? is_a_float16_vec : vector0; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+ vector0 ? vector0 : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+ vector0 ? is_a_float16_vec : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+
+ /* Unary operators. */
+
+ +vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ -vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ ~vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ !vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ *vector0; /* { dg-error {invalid type argument of unary '\*'} "" {target *-*-*} } */
+ __real vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ __imag vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ ++vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ --vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0++; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0--; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Binary arithmetic operations. */
+
+ vector0 = glob_bfloat_vec + *bfloat_ptr; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 = glob_bfloat_vec + 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 = glob_bfloat_vec + 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ return vector0;
+}
+
diff --git a/gcc/testsuite/gcc.target/aarch64/bfloat16_vector_typecheck_2.c b/gcc/testsuite/gcc.target/aarch64/bfloat16_vector_typecheck_2.c
new file mode 100644
index 00000000000..bd20e1bbc71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/bfloat16_vector_typecheck_2.c
@@ -0,0 +1,260 @@
+/* { dg-do assemble { target { aarch64*-*-* } } } */
+/* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } } */
+/* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
+/* { dg-add-options arm_v8_2a_bf16_neon } */
+/* { dg-additional-options "-O3 --save-temps -Wno-pedantic" } */
+#include <arm_neon.h>
+
+bfloat16_t glob_bfloat;
+bfloat16x8_t glob_bfloat_vec;
+
+float32x4_t is_a_float_vec;
+float64x2_t is_a_double_pair;
+
+float16x8_t *float_ptr;
+float16x8_t is_a_float16_vec;
+
+int32x4_t is_an_int_vec;
+int64x2_t is_a_long_int_pair;
+int16x8_t is_a_short_vec;
+
+int is_an_int;
+short is_a_short_int;
+float is_a_float;
+float is_a_float16;
+double is_a_double;
+
+bfloat16x8_t foo3 (void) { return (bfloat16x8_t) 0x12345678123456781234567812345678; }
+ /* { dg-error {integer constant is too large for its type} "" {target *-*-*} 27 } */
+ /* { dg-error {cannot convert a value of type 'long int' to vector type '__Bfloat16x8_t' which has different size} "" {target *-*-*} 27 } */
+
+bfloat16x8_t footest (bfloat16x8_t vector0)
+{
+ /* Initialisation */
+
+ bfloat16x8_t vector1_1;
+ bfloat16x8_t vector1_2 = glob_bfloat_vec;
+ bfloat16x8_t vector1_3 = is_a_float_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x8_t' using type 'float32x4_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector1_4 = is_an_int_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x8_t' using type 'int32x4_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector1_5 = is_a_float16_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x8_t' using type 'float16x8_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector1_6 = is_a_double_pair; /* { dg-error {incompatible types when initializing type 'bfloat16x8_t' using type 'float64x2_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector1_7 = is_a_long_int_pair; /* { dg-error {incompatible types when initializing type 'bfloat16x8_t' using type 'int64x2_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector1_8 = is_a_short_vec; /* { dg-error {incompatible types when initializing type 'bfloat16x8_t' using type 'int16x8_t'} "" {target *-*-*} } */
+
+ int32x4_t initi_1_1 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'int32x4_t' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ float32x4_t initi_1_2 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'float32x4_t' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ float16x8_t initi_1_3 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'float16x8_t' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ float64x2_t initi_1_4 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'float64x2_t' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ int64x2_t initi_1_5 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'int64x2_t' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ int16x8_t initi_1_6 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type 'int16x8_t' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+
+ bfloat16x8_t vector2_1 = {};
+ bfloat16x8_t vector2_2 = { glob_bfloat };
+ bfloat16x8_t vector2_3 = { glob_bfloat, glob_bfloat, glob_bfloat, glob_bfloat };
+ bfloat16x8_t vector2_4 = { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector2_5 = { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector2_6 = { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector2_7 = { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector2_8 = { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ bfloat16x8_t vector2_10 = { 0.0, 0, is_a_short_int, is_a_float }; /* { dg-error "invalid conversion to type 'bfloat16_t'" "" {target *-*-*} } */
+
+ int32x4_t initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float32x4_t initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float16x8_t initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ float64x2_t initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ int64x2_t initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ int16x8_t initi_2_6 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Assignments to/from vectors. */
+
+ glob_bfloat_vec = glob_bfloat_vec;
+ glob_bfloat_vec = 0; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'int'} "" {target *-*-*} } */
+ glob_bfloat_vec = 0.1; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'double'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_float_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'float32x4_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_an_int_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'int32x4_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_float16_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'float16x8_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_double_pair; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'float64x2_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_long_int_pair; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'int64x2_t'} "" {target *-*-*} } */
+ glob_bfloat_vec = is_a_short_vec; /* { dg-error {incompatible types when assigning to type 'bfloat16x8_t' from type 'int16x8_t'} "" {target *-*-*} } */
+
+ is_an_int_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'int32x4_t' from type 'bfloat16x8_t'} "" {target *-*-*} } */
+ is_a_float_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'float32x4_t' from type 'bfloat16x8_t'} "" {target *-*-*} } */
+ is_a_float16_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'float16x8_t' from type 'bfloat16x8_t'} "" {target *-*-*} } */
+ is_a_double_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'float64x2_t' from type 'bfloat16x8_t'} "" {target *-*-*} } */
+ is_a_long_int_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type 'int64x2_t' from type 'bfloat16x8_t'} "" {target *-*-*} } */
+ is_a_short_vec = glob_bfloat_vec;/* { dg-error {incompatible types when assigning to type 'int16x8_t' from type 'bfloat16x8_t'} "" {target *-*-*} } */
+
+ /* Assignments to/from elements. */
+
+ vector2_3[0] = glob_bfloat;
+ vector2_3[0] = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ vector2_3[0] = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+
+ glob_bfloat = vector2_3[0];
+ is_an_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_short_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float16 = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Compound literals. */
+
+ (bfloat16x8_t) {};
+
+ (bfloat16x8_t) { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { is_a_float_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float32x4_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { is_an_int_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int32x4_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { is_a_double_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float64x2_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { is_a_long_int_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int64x2_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { is_a_float16_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float16x8_t'} "" {target *-*-*} } */
+ (bfloat16x8_t) { is_a_short_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int16x8_t'} "" {target *-*-*} } */
+
+ (bfloat16x8_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ (int32x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'int' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ (float32x4_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'float' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ (int64x2_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'long int' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ (float16x8_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '__fp16' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+ (int16x8_t) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'short int' using type 'bfloat16x8_t'} "" {target *-*-*} } */
+
+ /* Casting. */
+
+ (void) glob_bfloat_vec;
+ (bfloat16x8_t) glob_bfloat_vec;
+
+ (bfloat16_t) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+ (short) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type 'bfloat16x8_t' to type 'short int' which has different size} "" {target *-*-*} } */
+ (int) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type 'bfloat16x8_t' to type 'int' which has different size} "" {target *-*-*} } */
+ (float16_t) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+ (float) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+ (double) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} "" {target *-*-*} } */
+
+ (int32x4_t) glob_bfloat_vec;
+ (float32x4_t) glob_bfloat_vec;
+ (float16x8_t) glob_bfloat_vec;
+ (int64x2_t) glob_bfloat_vec;
+ (float64x2_t) glob_bfloat_vec;
+ (int16x8_t) glob_bfloat_vec;
+
+ (bfloat16x8_t) is_an_int_vec;
+ (bfloat16x8_t) is_a_float_vec;
+ (bfloat16x8_t) is_a_float16_vec;
+ (bfloat16x8_t) is_a_long_int_pair;
+ (bfloat16x8_t) is_a_double_pair;
+ (bfloat16x8_t) is_a_short_vec;
+
+ /* Arrays and Structs. */
+
+ typedef bfloat16x8_t array_type[2];
+ extern bfloat16x8_t extern_array[];
+
+ bfloat16x8_t array[2];
+ bfloat16x8_t zero_length_array[0];
+ bfloat16x8_t empty_init_array[] = {};
+ typedef bfloat16x8_t some_other_type[is_an_int];
+
+ struct struct1 {
+ bfloat16x8_t a;
+ };
+
+ union union1 {
+ bfloat16x8_t a;
+ };
+
+ /* Addressing and dereferencing. */
+
+ bfloat16x8_t *bfloat_ptr = &vector0;
+ vector0 = *bfloat_ptr;
+
+ /* Pointer assignment. */
+
+ bfloat16x8_t *bfloat_ptr2 = bfloat_ptr;
+ bfloat16x8_t *bfloat_ptr3 = array;
+
+ /* Pointer arithmetic. */
+
+ ++bfloat_ptr;
+ --bfloat_ptr;
+ bfloat_ptr++;
+ bfloat_ptr--;
+ bfloat_ptr += 1;
+ bfloat_ptr -= 1;
+ bfloat_ptr - bfloat_ptr2;
+ bfloat_ptr = &bfloat_ptr3[0];
+ bfloat_ptr = &bfloat_ptr3[1];
+
+ /* Simple comparison. */
+ vector0 > glob_bfloat_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ glob_bfloat_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ is_a_float_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ 0 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ 0.1 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 > is_an_int_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ is_an_int_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Pointer comparison. */
+
+ bfloat_ptr == &vector0;
+ bfloat_ptr != &vector0;
+ bfloat_ptr < &vector0;
+ bfloat_ptr <= &vector0;
+ bfloat_ptr > &vector0;
+ bfloat_ptr >= &vector0;
+ bfloat_ptr == bfloat_ptr2;
+ bfloat_ptr != bfloat_ptr2;
+ bfloat_ptr < bfloat_ptr2;
+ bfloat_ptr <= bfloat_ptr2;
+ bfloat_ptr > bfloat_ptr2;
+ bfloat_ptr >= bfloat_ptr2;
+
+ /* Conditional expressions. */
+
+ 0 ? vector0 : vector0;
+ 0 ? vector0 : is_a_float_vec; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? is_a_float_vec : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? vector0 : is_a_float16_vec; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? is_a_float16_vec : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? vector0 : 0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? 0 : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? 0.1 : vector0; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? vector0 : 0.1; /* { dg-error {type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? bfloat_ptr : bfloat_ptr2;
+ 0 ? bfloat_ptr : float_ptr; /* { dg-error {pointer type mismatch in conditional expression} "" {target *-*-*} } */
+ 0 ? float_ptr : bfloat_ptr; /* { dg-error {pointer type mismatch in conditional expression} "" {target *-*-*} } */
+
+ vector0 ? vector0 : vector0; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+ vector0 ? is_a_float16_vec : vector0; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+ vector0 ? vector0 : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+ vector0 ? is_a_float16_vec : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} "" {target *-*-*} } */
+
+ /* Unary operators. */
+
+ +vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ -vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ ~vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ !vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ *vector0; /* { dg-error {invalid type argument of unary '\*'} "" {target *-*-*} } */
+ __real vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ __imag vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ ++vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ --vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0++; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0--; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ /* Binary arithmetic operations. */
+
+ vector0 = glob_bfloat_vec + *bfloat_ptr; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 = glob_bfloat_vec + 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 = glob_bfloat_vec + 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+ vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} "" {target *-*-*} } */
+
+ return vector0;
+}
+