-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for _BitInt on clang #4072
Conversation
903edfd
to
3666cee
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR!
@Arghnews, do you plan to update this PR or shall we close it for now (can be reopened later)? |
@vitaut Hi, sorry been busy and now I'm on holiday for 2 weeks, but will update once back and implement your feedback. I'd say leave it open and I'll update in 2-3 weeks, but it's up to you (can reopen of course). Cheers! |
No hurry. Let's keep it open and enjoy your holiday! |
7322e2c
to
d8ad099
Compare
Hi, Reworked this so that now fmtlib will format Uses wider formatter ie. integer types are widened to 64bit if <= 64 bits wide (assume this is acceptable for performance) Can't write Let me know any feedback @vitaut |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few more comments.
d8ad099
to
df02f20
Compare
include/fmt/format.h
Outdated
using type = conditional_t< | ||
N <= 64, conditional_t<is_signed, int64_t, uint64_t>, | ||
conditional_t<(N > 64 && N <= 128), | ||
conditional_t<is_signed, __int128, unsigned __int128>, | ||
void>>; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this can be moved to bitint_traits
which would make number_of_bits
and is_signed
unnecessary.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this can be moved to
bitint_traits
which would makenumber_of_bits
andis_signed
unnecessary.
Nice suggestion, have done. Only thing to note, we must #include <cstdint>
in base.h
now, for the int64_t
, if this is acceptable. This was already included in format.h
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's use (unsigned) long long
which is guaranteed to be at least 64-bit and avoid additional include.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's use
(unsigned) long long
which is guaranteed to be at least 64-bit and avoid additional include.
Good shout, have made this change
df02f20
to
1191f39
Compare
Issue fmtlib#4007 Make _BitInt up to 128bits formattable Note, libstdc++ is_signed doesn't work with _BitInt (so use own)
1191f39
to
d32293c
Compare
Merged, thanks! |
- Update from version 11.0.2 to 11.1.3 - Update of rootfile - Changelog 11.1.3 - Fixed compilation on GCC 9.4 (fmtlib/fmt#4313). - Worked around an internal compiler error when using C++20 modules with GCC 14.2 and earlier (fmtlib/fmt#4295). - Worked around a bug in GCC 6 (fmtlib/fmt#4318). - Fixed an issue caused by instantiating `formatter<const T>` (fmtlib/fmt#4303, fmtlib/fmt#4325). Thanks @timsong-cpp. - Fixed formatting into `std::ostreambuf_iterator` when using format string compilation (fmtlib/fmt#4309, fmtlib/fmt#4312). Thanks @phprus. - Restored a constraint on the map formatter so that it correctly reports as unformattable when the element is (fmtlib/fmt#4326). Thanks @timsong-cpp. - Reduced the size of format specs (fmtlib/fmt#4298). - Readded `args()` to `fmt::format_context` (fmtlib/fmt#4307, fmtlib/fmt#4310). Thanks @Erroneous1. - Fixed a bogus MSVC warning (fmtlib/fmt#4314, fmtlib/fmt#4322). Thanks @ZehMatt. - Fixed a pedantic mode error in the CMake config (fmtlib/fmt#4327). Thanks @rlalik. 11.1.2 - Fixed ABI compatibility with earlier 11.x versions (fmtlib/fmt#4292). - Added `wchar_t` support to the `std::bitset` formatter (fmtlib/fmt#4285, fmtlib/fmt#4286, fmtlib/fmt#4289, fmtlib/fmt#4290). Thanks @phprus. - Prefixed CMake components with `fmt-` to simplify usage of {fmt} via `add_subdirectory` (fmtlib/fmt#4283). - Updated docs for meson (fmtlib/fmt#4291). Thanks @trim21. - Fixed a compilation error in chrono on nvcc (fmtlib/fmt#4297, fmtlib/fmt#4301). Thanks @breyerml. - Fixed various warnings (fmtlib/fmt#4288, fmtlib/fmt#4299). Thanks @GamesTrap and @edo9300. 11.1.1 - Fixed ABI compatibility with earlier 11.x versions (fmtlib/fmt#4278). - Defined CMake components (`core` and `doc`) to allow docs to be installed separately (fmtlib/fmt#4276). Thanks @carlsmedstad. 11.1.0 - Improved C++20 module support (fmtlib/fmt#4081, fmtlib/fmt#4083, fmtlib/fmt#4084, fmtlib/fmt#4152, fmtlib/fmt#4153, fmtlib/fmt#4169, fmtlib/fmt#4190, fmtlib/fmt#4234, fmtlib/fmt#4239). Thanks @kamrann and @Arghnews. - Reduced debug (unoptimized) binary code size and the number of template instantiations when passing formatting arguments. For example, unoptimized binary code size for `fmt::print("{}", 42)` was reduced by ~40% on GCC and ~60% on clang (x86-64). GCC: - Before: 161 instructions of which 105 are in reusable functions ([godbolt](https://www.godbolt.org/z/s9bGoo4ze)). - After: 116 instructions of which 60 are in reusable functions ([godbolt](https://www.godbolt.org/z/r7GGGxMs6)). Clang: - Before: 310 instructions of which 251 are in reusable functions ([godbolt](https://www.godbolt.org/z/Ts88b7M9o)). - After: 194 instructions of which 135 are in reusable functions ([godbolt](https://www.godbolt.org/z/vcrjP8ceW)). - Added an experimental `fmt::writer` API that can be used for writing to different destinations such as files or strings (fmtlib/fmt#2354). For example ([godbolt](https://www.godbolt.org/z/rWoKfbP7e)): ```c++ #include <fmt/os.h> void write_text(fmt::writer w) { w.print("The answer is {}.", 42); } int main() { // Write to FILE. write_text(stdout); // Write to fmt::ostream. auto f = fmt::output_file("myfile"); write_text(f); // Write to std::string. auto sb = fmt::string_buffer(); write_text(sb); std::string s = sb.str(); } ``` - Added width and alignment support to the formatter of `std::error_code`. - Made `std::expected<void, E>` formattable (fmtlib/fmt#4145, fmtlib/fmt#4148). For example ([godbolt](https://www.godbolt.org/z/hrj5c6G86)): ```c++ fmt::print("{}", std::expected<void, int>()); ``` prints ``` expected() ``` Thanks @phprus. - Made `fmt::is_formattable<void>` SFINAE-friendly (fmtlib/fmt#4147). - Added support for `_BitInt` formatting when using clang (fmtlib/fmt#4007, fmtlib/fmt#4072, fmtlib/fmt#4140, fmtlib/fmt#4173, fmtlib/fmt#4176). For example ([godbolt](https://www.godbolt.org/z/KWjbWec5z)): ```c++ using int42 = _BitInt(42); fmt::print("{}", int42(100)); ``` Thanks @Arghnews. - Added the `n` specifier for tuples and pairs (fmtlib/fmt#4107). Thanks @someonewithpc. - Added support for tuple-like types to `fmt::join` (fmtlib/fmt#4226, fmtlib/fmt#4230). Thanks @phprus. - Made more types formattable at compile time (fmtlib/fmt#4127). Thanks @AnthonyVH. - Implemented a more efficient compile-time `fmt::formatted_size` (fmtlib/fmt#4102, fmtlib/fmt#4103). Thanks @phprus. - Fixed compile-time formatting of some string types (fmtlib/fmt#4065). Thanks @torshepherd. - Made compiled version of `fmt::format_to` work with `std::back_insert_iterator<std::vector<char>>` (fmtlib/fmt#4206, fmtlib/fmt#4211). Thanks @phprus. - Added a formatter for `std::reference_wrapper` (fmtlib/fmt#4163, fmtlib/fmt#4164). Thanks @yfeldblum and @phprus. - Added experimental padding support (glibc `strftime` extension) to `%m`, `%j` and `%Y` (fmtlib/fmt#4161). Thanks @KKhanhH. - Made microseconds formatted as `us` instead of `µs` if the Unicode support is disabled (fmtlib/fmt#4088). - Fixed an unreleased regression in transcoding of surrogate pairs (fmtlib/fmt#4094, fmtlib/fmt#4095). Thanks @phprus. - Made `fmt::appender` satisfy `std::output_iterator` concept (fmtlib/fmt#4092, fmtlib/fmt#4093). Thanks @phprus. - Made `std::iterator_traits<fmt::appender>` standard-conforming (fmtlib/fmt#4185). Thanks @CaseyCarter. - Made it easier to reuse `fmt::formatter<std::string_view>` for types with an implicit conversion to `std::string_view` (fmtlib/fmt#4036, fmtlib/fmt#4055). Thanks @Arghnews. - Made it possible to disable `<filesystem>` use via `FMT_CPP_LIB_FILESYSTEM` for compatibility with some video game console SDKs, e.g. Nintendo Switch SDK (fmtlib/fmt#4257, fmtlib/fmt#4258, fmtlib/fmt#4259). Thanks @W4RH4WK and @phprus. - Fixed compatibility with platforms that use 80-bit `long double` (fmtlib/fmt#4245, fmtlib/fmt#4246). Thanks @jsirpoma. - Added support for UTF-32 code units greater than `0xFFFF` in fill (fmtlib/fmt#4201). - Fixed handling of legacy encodings on Windows with GCC (fmtlib/fmt#4162). - Made `fmt::to_string` take `fmt::basic_memory_buffer` by const reference (fmtlib/fmt#4261, fmtlib/fmt#4262). Thanks @sascha-devel. - Added `fmt::dynamic_format_arg_store::size` (fmtlib/fmt#4270). Thanks @hannes-harnisch. - Removed the ability to control locale usage via an undocumented `FMT_STATIC_THOUSANDS_SEPARATOR` in favor of `FMT_USE_LOCALE`. - Renamed `FMT_EXCEPTIONS` to `FMT_USE_EXCEPTIONS` for consistency with other similar macros. - Improved include directory ordering to reduce the chance of including incorrect headers when using multiple versions of {fmt} (fmtlib/fmt#4116). Thanks @cdzhan. - Made it possible to compile a subset of {fmt} without the C++ runtime. - Improved documentation and README (fmtlib/fmt#4066, fmtlib/fmt#4117, fmtlib/fmt#4203, fmtlib/fmt#4235). Thanks @zyctree and @nikola-sh. - Improved the documentation generator (fmtlib/fmt#4110, fmtlib/fmt#4115). Thanks @rturrado. - Improved CI (fmtlib/fmt#4155, fmtlib/fmt#4151). Thanks @phprus. - Fixed various warnings and compilation issues (fmtlib/fmt#2708, fmtlib/fmt#4091, fmtlib/fmt#4109, fmtlib/fmt#4113, fmtlib/fmt#4125, fmtlib/fmt#4129, fmtlib/fmt#4130, fmtlib/fmt#4131, fmtlib/fmt#4132, fmtlib/fmt#4133, fmtlib/fmt#4144, fmtlib/fmt#4150, fmtlib/fmt#4158, fmtlib/fmt#4159, fmtlib/fmt#4160, fmtlib/fmt#4170, fmtlib/fmt#4177, fmtlib/fmt#4187, fmtlib/fmt#4188, fmtlib/fmt#4194, fmtlib/fmt#4200, fmtlib/fmt#4205, fmtlib/fmt#4207, fmtlib/fmt#4208, fmtlib/fmt#4210, fmtlib/fmt#4220, fmtlib/fmt#4231, fmtlib/fmt#4232, fmtlib/fmt#4233, fmtlib/fmt#4236, fmtlib/fmt#4267, fmtlib/fmt#4271). Thanks @torsten48, @Arghnews, @tinfoilboy, @aminya, @Ottani, @zeroomega, @c4v4, @kongy, @vinayyadav3016, @sergio-nsk, @phprus and @YexuanXiao. Signed-off-by: Adolf Belka <[email protected]> Signed-off-by: Michael Tremer <[email protected]>
Issue #4007
Only enabled for clang >= 14 as that's all that supports
_BitInt
at the momentWe need a forwarding reference for
map
to be a "more specialized" match;const T&
,T
etc. are ambiguous.I'm not too familiar, would there be a better way to do this by adding an entry into
enum class type
for_BitInt
s? Or this is fine?Fyi this worked in version 9 because of this catch-all overload:
fmt/include/fmt/core.h
Lines 1506 to 1516 in a337011
Which was then subsequently narrowed down to extended FP types (which "broke" the accidental support for this):
fmt/include/fmt/base.h
Lines 1527 to 1537 in 6a192f8