From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 4A49F3888825; Tue, 29 Mar 2022 09:11:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4A49F3888825 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-7874] libstdc++: Workaround for missing 'using enum' in Clang 12 X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 7255d29c577106c14e42a9c3c88fc6fa6b6e4ecf X-Git-Newrev: 8bbeffc102bdd0a69576a8df47c588aba5a9b529 Message-Id: <20220329091122.4A49F3888825@sourceware.org> Date: Tue, 29 Mar 2022 09:11:22 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Mar 2022 09:11:22 -0000 https://gcc.gnu.org/g:8bbeffc102bdd0a69576a8df47c588aba5a9b529 commit r12-7874-g8bbeffc102bdd0a69576a8df47c588aba5a9b529 Author: Jonathan Wakely Date: Mon Mar 28 12:27:23 2022 +0100 libstdc++: Workaround for missing 'using enum' in Clang 12 Once we no longer care about older compilers without this feature, we can drop these static data members, so the names don't have to be visible at class scope. libstdc++-v3/ChangeLog: * libsupc++/compare (_Strong_order) [!__cpp_using_enum]: Add static data members for _Fp_fmt enumerators. Diff: --- libstdc++-v3/libsupc++/compare | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare index 6e1ed53eeed..e9cf9139def 100644 --- a/libstdc++-v3/libsupc++/compare +++ b/libstdc++-v3/libsupc++/compare @@ -677,12 +677,25 @@ namespace std // TODO: _Bfloat16, }; +#ifndef __cpp_using_enum + // XXX Remove these once 'using enum' support is ubiquitous. + static constexpr _Fp_fmt _Binary16 = _Fp_fmt::_Binary16; + static constexpr _Fp_fmt _Binary32 = _Fp_fmt::_Binary32; + static constexpr _Fp_fmt _Binary64 = _Fp_fmt::_Binary64; + static constexpr _Fp_fmt _Binary128 = _Fp_fmt::_Binary128; + static constexpr _Fp_fmt _X86_80bit = _Fp_fmt::_X86_80bit; + static constexpr _Fp_fmt _M68k_80bit = _Fp_fmt::_M68k_80bit; + static constexpr _Fp_fmt _Dbldbl = _Fp_fmt::_Dbldbl; +#endif + // Identify the format used by a floating-point type. template static consteval _Fp_fmt _S_fp_fmt() noexcept { +#ifdef __cpp_using_enum using enum _Fp_fmt; +#endif // Identify these formats first, then assume anything else is IEEE. // N.B. ARM __fp16 alternative format can be handled as binary16. @@ -810,7 +823,9 @@ namespace std return __builtin_bit_cast(int16_t, __val); else { +#ifdef __cpp_using_enum using enum _Fp_fmt; +#endif constexpr auto __fmt = _S_fp_fmt<_Tp>(); if constexpr (__fmt == _X86_80bit || __fmt == _M68k_80bit) { @@ -862,7 +877,9 @@ namespace std if (__ix == __iy) return strong_ordering::equal; // All bits are equal, we're done. +#ifdef __cpp_using_enum using enum _Fp_fmt; +#endif constexpr auto __fmt = _S_fp_fmt<_Tp>(); if constexpr (__fmt == _Dbldbl) // double-double