Hi Paul, Great catch. I've applied your change here:
http://llvm.org/viewvc/llvm-project?view=rev&revision=120759 I believe adjusting the caret requires updating 'Loc' with the appropriate character offset within the literal. On Dec 2, 2010, at 7:07 AM, Paul Curtis wrote: > Hi, > > Given: > > const char *format = "abc \m def"; > > clang generates: > >> clang -fsyntax-only foo1.c > foo1.c(1) : warning: unknown escape sequence '\x6D' > const char *format = "abc \m def"; > ^ > > There are a couple of problems here. Firstly, the error should clearly show > \m not \x6D and ProcessCharEscape makes a valiant attempt: > > if (isgraph(ThisTokBuf[0])) > Diags->Report(Loc, diag::ext_unknown_escape) > << std::string()+(char)ResultChar; > else > Diags->Report(Loc, diag::ext_unknown_escape) > << "x"+llvm::utohexstr(ResultChar); > > Unfortunately, by the time we're in the handling case, ThisTokBuf[0] has > stepped past the invalid escape and moved to the next character, and as > witness you get a slightly different error with this source: > >> clang -fsyntax-only foo1.c > foo1.c(1) : warning: unknown escape sequence '\m' > const char *format = "abc \mx def"; > > Now, this is correct. What ProcessCharEscape should be doing is this: > > if (isgraph(ResultChar)) > Diags->Report(Loc, diag::ext_unknown_escape) > << std::string()+(char)ResultChar; > else > Diags->Report(Loc, diag::ext_unknown_escape) > << "x"+llvm::utohexstr(ResultChar); > > However the location of the caret is incorrect; perhaps I'll deal with that > next. > > -- > Paul Curtis, Rowley Associates Ltd http://www.rowley.co.uk > SolderCore arriving Winter 2010! http://www.soldercore.com > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
