]> granicus.if.org Git - clang/commitdiff
Issue fixits replacing invalid character literals with the equivalent \xNN
authorNick Lewycky <nicholas@mxc.ca>
Wed, 21 Aug 2013 04:10:58 +0000 (04:10 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Wed, 21 Aug 2013 04:10:58 +0000 (04:10 +0000)
escape code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188863 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/LiteralSupport.cpp
test/Lexer/char-literal-encoding-fixit.c [new file with mode: 0644]

index 08d6c438d323194e6bc26ce2b432583f66debf9a..2301aaed8215b813669970b3e8d05e4fe06fc07c 100644 (file)
@@ -978,7 +978,7 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
   uint32_t largest_character_for_kind;
   if (tok::wide_char_constant == Kind) {
     largest_character_for_kind =
-        0xFFFFFFFFu >> (32-PP.getTargetInfo().getWCharWidth());
+        0xFFFFFFFFu >> (32 - PP.getTargetInfo().getWCharWidth());
   } else if (tok::utf16_char_constant == Kind) {
     largest_character_for_kind = 0xFFFF;
   } else if (tok::utf32_char_constant == Kind) {
@@ -1009,7 +1009,13 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
         unsigned Msg = diag::err_bad_character_encoding;
         if (NoErrorOnBadEncoding)
           Msg = diag::warn_bad_character_encoding;
-        PP.Diag(Loc, Msg);
+        std::string escaped = llvm::utohexstr(static_cast<uint8_t>(*start));
+        FullSourceLoc SourceLoc(Loc, PP.getSourceManager());
+        PP.Diag(Loc, Msg) << FixItHint::CreateReplacement(
+                                 MakeCharSourceRange(PP.getLangOpts(),
+                                                     SourceLoc, TokBegin, start,
+                                                     start + 1),
+                                 "\\x" + escaped);
         if (NoErrorOnBadEncoding) {
           start = tmp_in_start;
           buffer_begin = tmp_out_start;
@@ -1047,7 +1053,7 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
     unsigned CharWidth = getCharWidth(Kind, PP.getTargetInfo());
     uint64_t result =
       ProcessCharEscape(TokBegin, begin, end, HadError,
-                        FullSourceLoc(Loc,PP.getSourceManager()),
+                        FullSourceLoc(Loc, PP.getSourceManager()),
                         CharWidth, &PP.getDiagnostics(), PP.getLangOpts());
     *buffer_begin++ = result;
   }
diff --git a/test/Lexer/char-literal-encoding-fixit.c b/test/Lexer/char-literal-encoding-fixit.c
new file mode 100644 (file)
index 0000000..ab5d28a
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: cp %s %t
+// RUN: %clang_cc1 -fixit -x c %t
+// RUN: FileCheck -input-file=%t %t
+
+// Note that this file is not valid UTF-8.
+
+int test1 = '\88';
+// CHECK: int test1 = '\x88';
+
+int test2 = 'ab\88c';
+// CHECK: int test2 = 'ab\x88c';