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