llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-support Author: Harald van Dijk (hvdijk) <details> <summary>Changes</summary> As commented in the source code, the reason isPrintable had a special exception to consider U+00AD printable regardless of its Unicode classification was for Clang, and because of how it renders in terminals. But this is a function in general support library, part of LLVM, not Clang, and is also used for things that are not sent to terminals, so this is not appropriate for this function. It also introduced a discrepancy where U+00AD was simultaneously considered a printable character by isPrintable, and a formatting character by isFormatting. Move the U+00AD check into Clang instead. --- Full diff: https://github.com/llvm/llvm-project/pull/231223.diff 3 Files Affected: - (modified) clang/lib/Basic/Diagnostic.cpp (+4-1) - (modified) llvm/lib/Support/Unicode.cpp (+2-7) - (modified) llvm/unittests/Support/YAMLIOTest.cpp (+10-10) ``````````diff diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 251c8ba6e13db..020a3f5738798 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -1108,7 +1108,10 @@ static void EscapeStringForDiagnostic(StringRef Str, assert(Begin == CodepointEnd && "we must be further along in the string now"); - if (llvm::sys::unicode::isPrintable(CodepointValue) || + // Clang special cases 0x00AD (SOFT HYPHEN) which is rendered as an actual + // hyphen in most terminals. + if (CodepointValue == 0x00AD || + llvm::sys::unicode::isPrintable(CodepointValue) || (!ForCodepoint && llvm::sys::unicode::isFormatting(CodepointValue))) { OutStream << (ForCodepoint ? "'" : "") << StringRef(reinterpret_cast<const char *>(CodepointBegin), diff --git a/llvm/lib/Support/Unicode.cpp b/llvm/lib/Support/Unicode.cpp index 6c89270d29f76..5294c917a8b37 100644 --- a/llvm/lib/Support/Unicode.cpp +++ b/llvm/lib/Support/Unicode.cpp @@ -25,15 +25,10 @@ extern const UnicodeCharSet::CharRanges GeneratedCombiningCharacterRanges; extern const UnicodeCharSet::CharRanges GeneratedDoubleWidthCharacterRanges; /// Unicode code points of the categories L, M, N, P, S and Zs are considered -/// printable. -/// In addition, U+00AD SOFT HYPHEN is also considered printable, as -/// it's actually displayed on most terminals. \return true if the character is -/// considered printable. +/// printable. \return true if the character is considered printable. bool isPrintable(int UCS) { static const UnicodeCharSet Printables(GeneratedPrintableRanges); - // Clang special cases 0x00AD (SOFT HYPHEN) which is rendered as an actual - // hyphen in most terminals. - return UCS == 0x00AD || Printables.contains(UCS); + return Printables.contains(UCS); } /// Unicode code points of the Cf category are considered diff --git a/llvm/unittests/Support/YAMLIOTest.cpp b/llvm/unittests/Support/YAMLIOTest.cpp index 78e19c5ff4f2c..1ceeec81181cb 100644 --- a/llvm/unittests/Support/YAMLIOTest.cpp +++ b/llvm/unittests/Support/YAMLIOTest.cpp @@ -3024,16 +3024,16 @@ TEST(YAMLIO, TestEscaped) { TestEscaped("parameter 'параметр' is unused", "\"parameter 'параметр' is unused\""); - // String with embedded non-printable multibyte UTF-8 sequence (U+200B - // zero-width space). The thing to test here is that we emit a - // unicode-scalar level escape like \uNNNN (at the YAML level), and don't - // just pass the UTF-8 byte sequence through as with quoted printables. - { - const unsigned char foobar[10] = {'f', 'o', 'o', - 0xE2, 0x80, 0x8B, // UTF-8 of U+200B - 'b', 'a', 'r', - 0x0}; - TestEscaped((char const *)foobar, "\"foo\\u200Bbar\""); + // String with embedded non-printable multibyte UTF-8 sequence (U+00AD soft + // hyphen and U+200B zero-width space). The thing to test here is that we + // emit a unicode-scalar level escape like \uNNNN (at the YAML level), and + // don't just pass the UTF-8 byte sequence through as with quoted printables. + { + const unsigned char foobar[15] = { + 'f', 'o', 'o', 0xC2, 0xAD, // UTF-8 of U+00AD + 'b', 'a', 'r', 0xE2, 0x80, 0x8B, // UTF-8 of U+200B + 'b', 'a', 'z', 0x0}; + TestEscaped((char const *)foobar, "\"foo\\u00ADbar\\u200Bbaz\""); } } `````````` </details> https://github.com/llvm/llvm-project/pull/231223 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
