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

Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2026-05-25
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |ASSIGNED

--- Comment #1 from Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> ---
untested patch:

@@ -1099,12 +1099,13 @@ _M_assoc_barrier() const
       basic_vec() = default;

       // [simd.overview] p2 impl-def conversions
------------------------------
-      using _NativeVecType = decltype([] {
-           if constexpr (_S_is_scalar)
-             return __vec_builtin_type<__canon_value_type, 1>();
-           else
-             return _DataType();
-         }());
+      /** @internal
+       * This is an alias for the corresponding GNU vector type
(`[[gnu::vector_size(Bytes)]]`).
+       * This type can be different to _DataType because it doesn't use the
canonical_vec_type_t and
+       * for size 1 it is a GNU vector type of size 1.
+       */
+      using _NativeVecType = __vec_builtin_type<value_type, _S_full_size>;
+
       /**
        * @brief Converting constructor from GCC vector builtins.
        *
@@ -1142,7 +1143,7 @@ basic_vec(_NativeVecType __x)
        if constexpr (_S_is_scalar)
          return _NativeVecType{_M_data};
        else
-         return _M_data;
+         return reinterpret_cast<_NativeVecType>(_M_data);
       }

 #if _GLIBCXX_X86
@@ -1151,8 +1152,8 @@ basic_vec(_NativeVecType __x)
        */
       template <__vec_builtin _IV>
        requires same_as<__x86_intel_intrin_value_type<value_type>,
__vec_value_type<_IV>>
-         && (sizeof(_IV) == sizeof(_DataType) && sizeof(_IV) >= 16
-                && !is_same_v<_IV, _DataType>)
+         && (sizeof(_IV) == sizeof(_NativeVecType) && sizeof(_IV) >= 16
+                && !is_same_v<_IV, _NativeVecType>)
        constexpr
        basic_vec(_IV __x)
        : _M_data(reinterpret_cast<_DataType>(__x))
@@ -1163,8 +1164,8 @@ basic_vec(_IV __x)
        */
       template <__vec_builtin _IV>
        requires same_as<__x86_intel_intrin_value_type<value_type>,
__vec_value_type<_IV>>
-         && (sizeof(_IV) == sizeof(_DataType) && sizeof(_IV) >= 16
-                && !is_same_v<_IV, _DataType>)
+         && (sizeof(_IV) == sizeof(_NativeVecType) && sizeof(_IV) >= 16
+                && !is_same_v<_IV, _NativeVecType>)
        constexpr
        operator _IV() const
        { return reinterpret_cast<_IV>(_M_data); }

Reply via email to