================
@@ -1854,23 +1884,69 @@ CharLiteralParser::CharLiteralParser(const char *begin, 
const char *end,
             HadError = true;
             PP.Diag(Loc, diag::err_character_too_large);
           }
+          if (!HadError && Converter) {
+            assert(Kind != tok::wide_char_constant &&
+                   "Wide character translation not supported");
+            std::string UTF8String;
+            convertUTF32ToUTF8String(
+                ArrayRef<char>((const char *)tmp_out_start, 4), UTF8String);
+            SmallString<1> ConvertedChar;
+            std::error_code EC = Converter->convert(UTF8String, ConvertedChar);
+            if (EC) {
+              PP.Diag(Loc, diag::err_exec_charset_conversion_failed)
+                  << EC.message();
+              HadError = true;
+            } else {
+              if (ConvertedChar.size() > 1)
+                PP.Diag(Loc, diag::err_char_size_increased_after_conversion)
+                    << UTF8String;
+              *tmp_out_start = ConvertedChar[0];
+            }
+          }
         }
       }
 
       continue;
     }
     // Is this a Universal Character Name escape?
     if (begin[1] == 'u' || begin[1] == 'U' || begin[1] == 'N') {
-      unsigned short UcnLen = 0;
-      if (!ProcessUCNEscape(TokBegin, begin, end, *buffer_begin, UcnLen,
-                            FullSourceLoc(Loc, PP.getSourceManager()),
-                            &PP.getDiagnostics(), PP.getLangOpts(), true)) {
-        HadError = true;
-      } else if (*buffer_begin > largest_character_for_kind) {
-        HadError = true;
-        PP.Diag(Loc, diag::err_character_too_large);
+      if (Converter == nullptr) {
+        unsigned short UcnLen = 0;
+        if (!ProcessUCNEscape(TokBegin, begin, end, *buffer_begin, UcnLen,
+                              FullSourceLoc(Loc, PP.getSourceManager()),
+                              &PP.getDiagnostics(), PP.getLangOpts(), true)) {
+          HadError = true;
+        } else if (*buffer_begin > largest_character_for_kind) {
+          HadError = true;
+          PP.Diag(Loc, diag::err_character_too_large);
+        }
+      } else {
+        char Cp[5];
+        char *ResultPtr = Cp;
+        EncodeUCNEscape(TokBegin, begin, end, ResultPtr, HadError,
+                        FullSourceLoc(Loc, PP.getSourceManager()),
+                        /*CharByteWidth=*/1u, &PP.getDiagnostics(),
+                        PP.getLangOpts());
+        assert(ResultPtr - Cp <= 4 &&
+               "unexpected result size for UCN escape character");
+        if (!HadError) {
+          SmallString<8> CpConv;
+          StringRef ToConvert(Cp, ResultPtr - Cp);
+          std::error_code EC = Converter->convert(StringRef(Cp), CpConv);
+          if (EC) {
+            PP.Diag(Loc, diag::err_exec_charset_conversion_failed)
+                << EC.message();
+            HadError = true;
+          } else {
+            if (CpConv.size() > 1) {
+              HadError = true;
+              PP.Diag(Loc, diag::err_character_too_large);
+            } else {
----------------
abhina-sree wrote:

Thanks, I've moved this to a function called convertCharacter

https://github.com/llvm/llvm-project/pull/138895
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to