From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id D53723858C60; Sat, 25 Feb 2023 22:58:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D53723858C60 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677365911; bh=z2cS/kYnyLuDOBetj6Y715ZB+i4KTLifNUBczqZ3c+M=; h=From:To:Subject:Date:From; b=IIZNmmc716UiR83+qqlIwH6o6V2YrFSgIXIMRbiBnBK8Wnmqti0YofrnkzCbBfNBK n1v4pbc7yhAR7rrjFey2tdqrf0u3e0oW/AQb6gJ+JSHQ4rAk0oxusIL0MYKBCf6p2N h+WLmVk28ghx9KIUuv6VqrqsoarA5ma8XiCaWuxg= From: "janpmoeller at gmx dot de" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/108934] New: bit_cast'ing to long double errors out with "the argument cannot be interpreted" since gcc-12 Date: Sat, 25 Feb 2023 22:58:31 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 13.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: janpmoeller at gmx dot de X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D108934 Bug ID: 108934 Summary: bit_cast'ing to long double errors out with "the argument cannot be interpreted" since gcc-12 Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: janpmoeller at gmx dot de Target Milestone: --- In gcc-trunk, gcc-12.2 and gcc-12.1, the following code fails to compile, w= hile gcc-11.3 accepts it: ///////////////////////////////////////////////////////////////////////////= ////////////////////////////////// #include #include #include using uint64_x_2_t =3D std::array; using uint32_x_2_t =3D std::array; using uint16_x_2_t =3D std::array; static_assert(sizeof(long double) =3D=3D sizeof(uint64_x_2_t)); static_assert(sizeof(double) =3D=3D sizeof(uint32_x_2_t)); static_assert(sizeof(float) =3D=3D sizeof(uint16_x_2_t)); constexpr long double testld =3D 42.42; constexpr double testd =3D 42.42; constexpr float testf =3D 42.42f; constexpr uint64_x_2_t test_uint64_x_2_t{1u, 2u}; constexpr uint32_x_2_t test_uint32_x_2_t{1u, 2u}; constexpr uint16_x_2_t test_uint16_x_2_t{1u, 2u}; constexpr auto ld_to_uint64_x_2_t =3D std::bit_cast(testld); = // works! (reverse direction) constexpr auto d_to_uint32_x_2_t =3D std::bit_cast(testd); constexpr auto f_to_uint16_x_2_t =3D std::bit_cast(testf); constexpr auto default_uint64_x_2_t_to_ld =3D std::bit_cast(uint64_x_2_t{}); // works! (default initialized) constexpr auto default_uint32_x_2_t_to_d =3D std::bit_cast(uint32_x_2_t{}); constexpr auto default_uint16_x_2_t_to_f =3D std::bit_cast(uint16_x_2_t{}); constexpr auto temp_uint64_x_2_t_to_ld =3D std::bit_cast(uint64_x_2_t{1u, 2u}); // <=3D fails constexpr auto temp_uint32_x_2_t_to_d =3D std::bit_cast(uint32_x_2_= t{1u, 2u}); constexpr auto temp_uint16_x_2_t_to_f =3D std::bit_cast(uint16_x_2_t= {1u, 2u}); constexpr auto uint64_x_2_t_to_ld =3D std::bit_cast(test_uint64_x_2_t); // <=3D fails constexpr auto uint32_x_2_t_to_d =3D std::bit_cast(test_uint32_x_2_= t); constexpr auto uint16_x_2_t_to_f =3D std::bit_cast(test_uint16_x_2_t= ); ///////////////////////////////////////////////////////////////////////////= ////////////////////////////////// The compile error for both offending lines is: /usr/include/c++/12/bit:87:33: sorry, unimplemented: =E2=80=98__builtin_bit= _cast=E2=80=99 cannot be constant evaluated because the argument cannot be interpreted The strange thing is that this error only seems to appear if the array is aggregate-initialized; default initialized arrays do not trigger the error. float and double do not trigger the error either. Replacing std::array with= a struct aggregate type behaves the same as the array example above. The reverse direction, i.e. bit_cast'ing from long double to array, seems t= o be working fine. The above example on compiler explorer: https://godbolt.org/z/ba5d6hEG1=