Fix handling of pointers in format string compilation and FMT_BUILTIN_TYPES=0

This commit is contained in:
Victor Zverovich
2025-12-07 07:23:19 -08:00
parent a6e871e39b
commit 19e4d5ecd9
2 changed files with 13 additions and 4 deletions

View File

@@ -2258,8 +2258,11 @@ template <typename Context> class value {
: pointer(const_cast<const void*>(x)) {}
FMT_INLINE value(nullptr_t) : pointer(nullptr) {}
template <typename T, FMT_ENABLE_IF(std::is_pointer<T>::value ||
std::is_member_pointer<T>::value)>
template <typename T,
FMT_ENABLE_IF(
(std::is_pointer<T>::value ||
std::is_member_pointer<T>::value) &&
!std::is_void<typename std::remove_pointer<T>::type>::value)>
value(const T&) {
// Formatting of arbitrary pointers is disallowed. If you want to format a
// pointer cast it to `void*` or `const void*`. In particular, this forbids

View File

@@ -7,9 +7,10 @@
#include "gtest/gtest.h"
#if !defined(__GNUC__) || __GNUC__ >= 5
#if !defined(__GNUC__) || (__GNUC__ >= 5 || defined(__clang__))
# define FMT_BUILTIN_TYPES 0
# include "fmt/format.h"
# include "fmt/compile.h"
TEST(no_builtin_types_test, format) {
EXPECT_EQ(fmt::format("{}", 42), "42");
@@ -22,4 +23,9 @@ TEST(no_builtin_types_test, double_is_custom_type) {
EXPECT_EQ(fmt::format_args(args).get(0).type(),
fmt::detail::type::custom_type);
}
TEST(no_builtin_types_test, format_pointer_compiled) {
const void* p = nullptr;
fmt::format(FMT_COMPILE("{:} {}"), 42, p);
}
#endif