diff --git a/include/fmt/format.h b/include/fmt/format.h index 782cf9b6..0fa38d0b 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -257,9 +257,12 @@ namespace internal { #endif // A fallback implementation of uintptr_t for systems that lack it. +namespace uintptr { struct uintptr_t { unsigned char value[sizeof(void*)]; }; +} +using uintptr::uintptr_t; typedef std::numeric_limits numutil; template inline bool use_grisu() { @@ -312,7 +315,7 @@ typename Allocator::value_type* allocate(Allocator& alloc, std::size_t n) { FMT_END_NAMESPACE namespace std { -using namespace fmt::v5::internal; +using namespace fmt::v5::internal::uintptr; // Standard permits specialization of std::numeric_limits. This specialization // is used to detect presence of uintptr_t. template <> diff --git a/test/format-test.cc b/test/format-test.cc index 188e2dac..e201ddfb 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -2540,6 +2540,11 @@ TEST(FormatTest, EmphasisNonHeaderOnly) { } TEST(FormatTest, CharTraitsIsNotAmbiguous) { + // Test that we don't inject internal names into the std namespace. using namespace std; char_traits::char_type c; +#if __cplusplus >= 201103L + std::string s; + begin(s); +#endif }