https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114803

--- Comment #9 from Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> ---
(In reply to Alexandre Oliva from comment #7)
> FWIW, since the backport, this test started failing in gcc-13 on arm and
> aarch64 targets.  Presumably this affects earlier branches as well.
> 
> .../libstdc++-v3/testsuite/experimental/simd/pr114803_vecbuiltin_cvt.cc: In
> instantiation of 'void maybe_test() [with T = char]':
> .../libstdc++-v3/testsuite/experimental/simd/pr114803_vecbuiltin_cvt.cc:87: 
> required from here
> .../libstdc++-v3/testsuite/experimental/simd/pr114803_vecbuiltin_cvt.cc:68:
> error: invalid 'static_cast' from type 'V' {aka
> 'std::experimental::parallelism_v2::simd<char,
> std::experimental::parallelism_v2::simd_abi::_VecBuiltin<16> >'} to type
> 'uint8x16_t'

I tested on aarch64-linux-gnu and arm-linux-gnueabi before and after the
backport and there were no regressions. What target do I need to add to my
list?

The specific error you report is rather puzzling. Basically an integral, sizeof
1, not signed char, when packed into a simd<char> is not explicitly convertible
to uint8x16_t. The simd<char> is defined to be convertible to its underlying
intrinsic type which is determined in
libstdc++-v3/include/experimental/bits/simd.h and goes like this:

'char' has no full specialization for '__intrinsic_type<char, 16>' (unless
'char' is the *same* type as 'signed char' or 'unsigned char') and thus picks
the partial specialization of __intrinsic_type. This in turn determines the
corresponding signed integer type to be 'signed char'. Depending on whether
'is_unsigned_v<char>' is true, it subsequently applies 'make_unsigned_t'. It
then uses the __intrinsic_type_t of that, which is either int8x16_t or
uint8x16_t depending on 'is_unsigned_v<char>'.

This

Reply via email to