================
@@ -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