diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h index 0ced1c0379a3b..16aca4d45892d 100644 --- a/llvm/include/llvm/ADT/StringRef.h +++ b/llvm/include/llvm/ADT/StringRef.h @@ -38,6 +38,8 @@ namespace llvm { LLVM_ABI bool getAsSignedInteger(StringRef Str, unsigned Radix, long long &Result); + LLVM_ABI unsigned getAutoSenseRadix(StringRef &Str); + LLVM_ABI bool consumeUnsignedInteger(StringRef &Str, unsigned Radix, unsigned long long &Result); LLVM_ABI bool consumeSignedInteger(StringRef &Str, unsigned Radix, diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp index dc758785e40d5..b6a2f8aeadccf 100644 --- a/llvm/lib/Support/StringRef.cpp +++ b/llvm/lib/Support/StringRef.cpp @@ -385,7 +385,7 @@ size_t StringRef::count(StringRef Str) const { return Count; } -static unsigned GetAutoSenseRadix(StringRef &Str) { +unsigned llvm::getAutoSenseRadix(StringRef &Str) { if (Str.empty()) return 10; @@ -410,7 +410,7 @@ bool llvm::consumeUnsignedInteger(StringRef &Str, unsigned Radix, unsigned long long &Result) { // Autosense radix if not specified. if (Radix == 0) - Radix = GetAutoSenseRadix(Str); + Radix = getAutoSenseRadix(Str); // Empty strings (after the radix autosense) are invalid. if (Str.empty()) return true; @@ -509,7 +509,7 @@ bool StringRef::consumeInteger(unsigned Radix, APInt &Result) { // Autosense radix if not specified. if (Radix == 0) - Radix = GetAutoSenseRadix(Str); + Radix = getAutoSenseRadix(Str); assert(Radix > 1 && Radix <= 36); diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp index ec9cdc197597d..d5f8dc41cdb6b 100644 --- a/llvm/unittests/ADT/StringRefTest.cpp +++ b/llvm/unittests/ADT/StringRefTest.cpp @@ -619,6 +619,19 @@ TEST(StringRefTest, Hashing) { hash_value(StringRef("hello world").slice(1, -1))); } +TEST(StringRefTest, getAutoSenseRadix) { + struct RadixPair { + const char *Str; + unsigned Expected; + } RadixNumbers[] = {{"123", 10}, {"1", 10}, {"0b1", 2}, {"01", 8}, {"0o1", 8}, + {"0x1", 16}, {"0", 10}, {"00", 8}, {"", 10}}; + for (size_t i = 0; i < std::size(RadixNumbers); ++i) { + StringRef number = RadixNumbers[i].Str; + unsigned radix = getAutoSenseRadix(number); + EXPECT_EQ(radix, RadixNumbers[i].Expected); + } +} + struct UnsignedPair { const char *Str; uint64_t Expected;