diff --git a/modules/juce_core/network/juce_IPAddress.cpp b/modules/juce_core/network/juce_IPAddress.cpp index 641df10fd4..ff2479aa52 100644 --- a/modules/juce_core/network/juce_IPAddress.cpp +++ b/modules/juce_core/network/juce_IPAddress.cpp @@ -166,7 +166,7 @@ IPAddress::IPAddress (const String& adr) } IPAddressByteUnion temp; - temp.combined = (uint16) CharacterFunctions::HexParser::parse (tokens[i].getCharPointer()); + temp.combined = CharacterFunctions::HexParser::parse (tokens[i].getCharPointer()); address[i * 2] = temp.split[0]; address[i * 2 + 1] = temp.split[1]; diff --git a/modules/juce_core/text/juce_CharacterFunctions.h b/modules/juce_core/text/juce_CharacterFunctions.h index f5ddbb8f69..f89dc6112f 100644 --- a/modules/juce_core/text/juce_CharacterFunctions.h +++ b/modules/juce_core/text/juce_CharacterFunctions.h @@ -490,6 +490,9 @@ public: template struct HexParser { + static_assert (std::is_unsigned::value, "ResultType must be unsigned because " + "left-shifting a negative value is UB"); + template static ResultType parse (CharPointerType t) noexcept { @@ -497,10 +500,10 @@ public: while (! t.isEmpty()) { - auto hexValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); + auto hexValue = static_cast (CharacterFunctions::getHexDigitValue (t.getAndAdvance())); if (hexValue >= 0) - result = (result << 4) | hexValue; + result = static_cast (result << 4) | hexValue; } return result; diff --git a/modules/juce_core/text/juce_String.cpp b/modules/juce_core/text/juce_String.cpp index 68f15ee2a1..b2102bb6fd 100644 --- a/modules/juce_core/text/juce_String.cpp +++ b/modules/juce_core/text/juce_String.cpp @@ -1957,8 +1957,8 @@ String String::toHexString (const void* const d, const int size, const int group return s; } -int String::getHexValue32() const noexcept { return CharacterFunctions::HexParser ::parse (text); } -int64 String::getHexValue64() const noexcept { return CharacterFunctions::HexParser::parse (text); } +int String::getHexValue32() const noexcept { return (int32) CharacterFunctions::HexParser::parse (text); } +int64 String::getHexValue64() const noexcept { return (int64) CharacterFunctions::HexParser::parse (text); } //============================================================================== static String getStringFromWindows1252Codepage (const char* data, size_t num) diff --git a/modules/juce_graphics/colour/juce_Colour.cpp b/modules/juce_graphics/colour/juce_Colour.cpp index 94f2c468e6..5dc54fb097 100644 --- a/modules/juce_graphics/colour/juce_Colour.cpp +++ b/modules/juce_graphics/colour/juce_Colour.cpp @@ -542,7 +542,7 @@ String Colour::toString() const Colour Colour::fromString (StringRef encodedColourString) { - return Colour ((uint32) CharacterFunctions::HexParser::parse (encodedColourString.text)); + return Colour (CharacterFunctions::HexParser::parse (encodedColourString.text)); } String Colour::toDisplayString (const bool includeAlphaValue) const