This fixes a warning triggered by testing an unsigned parameter against 0. The patch solves this by creating a different template for signed case. (PR: 178827) --- misc.h.orig 2022-08-07 19:52:03 UTC +++ misc.h @@ -720,8 +720,10 @@ inline bool SafeConvert(T1 from, T2 &to) /// \param value the value to convert /// \param base the base to use during the conversion /// \return the string representation of value in base. +template struct IsUnsigned {}; + template -std::string IntToString(T value, unsigned int base = 10) +std::string IntToStringImpl(T value, unsigned int base, IsUnsigned) { // Hack... set the high bit for uppercase. const unsigned int HIGH_BIT = (1U << 31); @@ -732,12 +734,6 @@ std::string IntToString(T value, unsigned int base = 1 if (value == 0) return "0"; - bool negate = false; - if (value < 0) - { - negate = true; - value = 0-value; // VC .NET does not like -a - } std::string result; while (value > 0) { @@ -745,9 +741,28 @@ std::string IntToString(T value, unsigned int base = 1 result = char((digit < 10 ? '0' : (CH - 10)) + digit) + result; value /= base; } + return result; +} + +template +std::string IntToStringImpl(T value, unsigned int base, IsUnsigned) +{ + bool negate = false; + if (value < 0) + { + negate = true; + value = 0-value; // VC .NET does not like -a + } + std::string result = IntToStringImpl(value, base, IsUnsigned()); if (negate) result = "-" + result; return result; +} + +template +std::string IntToString(T value, unsigned int base = 10) +{ + return IntToStringImpl(value, base, IsUnsigned<(static_cast(-1) > 0)>()); } /// \brief Converts an unsigned value to a string