From 4e2e6c5c0071e6430056a8ef0a6c8a1fe584d8ff Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Tue, 20 Mar 2018 21:10:15 -0700 Subject: Changes imported from Abseil "staging" branch: - 1320147f7597a9490562d439ecea46faa1793a24 Support Hex formatting of pointers without forcing a cast... by Jorg Brown - 13c793d6e14a52063c2d4ee327b6c976631b690e Add support for native WebAssembly llvm backend. by Abseil Team GitOrigin-RevId: 1320147f7597a9490562d439ecea46faa1793a24 Change-Id: Ibd4dbf288903ab45387932e5b11a28f5accdf166 --- absl/strings/str_cat.h | 27 +++++++++++++++++++-------- absl/strings/str_cat_test.cc | 14 +++++++++++++- absl/strings/substitute_test.cc | 10 ++++++++-- 3 files changed, 40 insertions(+), 11 deletions(-) (limited to 'absl/strings') diff --git a/absl/strings/str_cat.h b/absl/strings/str_cat.h index 0c33b6ccd243..e38369cab7ff 100644 --- a/absl/strings/str_cat.h +++ b/absl/strings/str_cat.h @@ -127,21 +127,32 @@ struct Hex { char fill; template - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if::value>::type* = nullptr) : Hex(spec, static_cast(v)) {} template - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if::value>::type* = nullptr) : Hex(spec, static_cast(v)) {} template - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if::value>::type* = nullptr) : Hex(spec, static_cast(v)) {} template - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if::value>::type* = nullptr) : Hex(spec, static_cast(v)) {} + template + explicit Hex(Pointee* v, PadSpec spec = absl::kNoPad) + : Hex(spec, reinterpret_cast(v)) {} private: Hex(PadSpec spec, uint64_t v) diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc index 710113f83b9f..c5a3526d7a6a 100644 --- a/absl/strings/str_cat_test.cc +++ b/absl/strings/str_cat_test.cc @@ -234,7 +234,7 @@ TEST(StrCat, CustomAllocator) { TEST(StrCat, MaxArgs) { std::string result; - // Test 10 up to 26 arguments, the current maximum + // Test 10 up to 26 arguments, the old maximum result = absl::StrCat(1, 2, 3, 4, 5, 6, 7, 8, 9, "a"); EXPECT_EQ(result, "123456789a"); result = absl::StrCat(1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b"); @@ -469,6 +469,12 @@ void CheckHexDec64(uint64_t v) { long long llv = static_cast(ullv); // NOLINT(runtime/int) CheckDec(llv, "%lld", "%0*lld", "%*lld"); + + if (sizeof(v) == sizeof(&v)) { + auto uintptr = static_cast(v); + void* ptr = reinterpret_cast(uintptr); + CheckHex(ptr, "%llx", "%0*llx", "%*llx"); + } } void CheckHexDec32(uint32_t uv) { @@ -476,6 +482,12 @@ void CheckHexDec32(uint32_t uv) { CheckDec(uv, "%u", "%0*u", "%*u"); int32_t v = static_cast(uv); CheckDec(v, "%d", "%0*d", "%*d"); + + if (sizeof(v) == sizeof(&v)) { + auto uintptr = static_cast(v); + void* ptr = reinterpret_cast(uintptr); + CheckHex(ptr, "%llx", "%0*llx", "%*llx"); + } } void CheckAll(uint64_t v) { diff --git a/absl/strings/substitute_test.cc b/absl/strings/substitute_test.cc index a6d7d7b0782d..7c9af6b22433 100644 --- a/absl/strings/substitute_test.cc +++ b/absl/strings/substitute_test.cc @@ -46,8 +46,14 @@ TEST(SubstituteTest, Substitute) { // Pointer. const int* int_p = reinterpret_cast(0x12345); std::string str = absl::Substitute("$0", int_p); - EXPECT_EQ(absl::StrCat("0x", absl::Hex(reinterpret_cast(int_p))), - str); + EXPECT_EQ(absl::StrCat("0x", absl::Hex(int_p)), str); + + // Volatile Pointer. + // Like C++ streamed I/O, such pointers implicitly become bool + volatile int vol = 237; + volatile int *volatile volptr = &vol; + str = absl::Substitute("$0", volptr); + EXPECT_EQ("true", str); // null is special. StrCat prints 0x0. Substitute prints NULL. const uint64_t* null_p = nullptr; -- cgit 1.4.1