r188863 - Issue fixits replacing invalid character literals with the equivalent \xNN

Nick Lewycky nlewycky at google.com
Wed Aug 21 11:55:55 PDT 2013


On 21 August 2013 09:18, Richard Smith <richard at metafoo.co.uk> wrote:

>
> On 20 Aug 2013 21:15, "Nick Lewycky" <nicholas at mxc.ca> wrote:
> >
> > Author: nicholas
> > Date: Tue Aug 20 23:10:58 2013
> > New Revision: 188863
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=188863&view=rev
> > Log:
> > Issue fixits replacing invalid character literals with the equivalent
> \xNN
> > escape code.
> >
> > Added:
> >     cfe/trunk/test/Lexer/char-literal-encoding-fixit.c
> > Modified:
> >     cfe/trunk/lib/Lex/LiteralSupport.cpp
> >
> > Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=188863&r1=188862&r2=188863&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
> > +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Tue Aug 20 23:10:58 2013
> > @@ -978,7 +978,7 @@ CharLiteralParser::CharLiteralParser(con
> >    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(con
> >          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));
>
> Are we guaranteed that the character is >= 0x10 here? (utohexstr might
> otherwise produce only one character).
>
Good catch. I tried every value from <= 0x0F and we don't emit this warning
in those cases. 0x0d aka. \r and 0x00 do interesting things, but otherwise
should we be warning on those?

> > +        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(con
> >      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;
> >    }
> >
> > Added: cfe/trunk/test/Lexer/char-literal-encoding-fixit.c
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/char-literal-encoding-fixit.c?rev=188863&view=auto
> >
> ==============================================================================
> > --- cfe/trunk/test/Lexer/char-literal-encoding-fixit.c (added)
> > +++ cfe/trunk/test/Lexer/char-literal-encoding-fixit.c Tue Aug 20
> 23:10:58 2013
> > @@ -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 = 'ˆ';
> > +// CHECK: int test1 = '\x88';
> > +
> > +int test2 = 'abˆc';
> > +// CHECK: int test2 = 'ab\x88c';
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130821/c2521b21/attachment.html>


More information about the cfe-commits mailing list