1 //===--- LiteralSupport.cpp - Code to parse and process literals ----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the NumericLiteralParser, CharLiteralParser, and
11 // StringLiteralParser interfaces.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "clang/Lex/LiteralSupport.h"
16 #include "clang/Lex/Preprocessor.h"
17 #include "clang/Lex/LexDiagnostic.h"
18 #include "clang/Basic/TargetInfo.h"
19 #include "clang/Basic/ConvertUTF.h"
20 #include "llvm/ADT/StringExtras.h"
21 #include "llvm/Support/ErrorHandling.h"
22 using namespace clang;
23 
24 /// HexDigitValue - Return the value of the specified hex digit, or -1 if it's
25 /// not valid.
26 static int HexDigitValue(char C) {
27   if (C >= '0' && C <= '9') return C-'0';
28   if (C >= 'a' && C <= 'f') return C-'a'+10;
29   if (C >= 'A' && C <= 'F') return C-'A'+10;
30   return -1;
31 }
32 
33 static unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target) {
34   switch (kind) {
35   default: llvm_unreachable("Unknown token type!");
36   case tok::char_constant:
37   case tok::string_literal:
38   case tok::utf8_string_literal:
39     return Target.getCharWidth();
40   case tok::wide_char_constant:
41   case tok::wide_string_literal:
42     return Target.getWCharWidth();
43   case tok::utf16_char_constant:
44   case tok::utf16_string_literal:
45     return Target.getChar16Width();
46   case tok::utf32_char_constant:
47   case tok::utf32_string_literal:
48     return Target.getChar32Width();
49   }
50 }
51 
52 /// ProcessCharEscape - Parse a standard C escape sequence, which can occur in
53 /// either a character or a string literal.
54 static unsigned ProcessCharEscape(const char *&ThisTokBuf,
55                                   const char *ThisTokEnd, bool &HadError,
56                                   FullSourceLoc Loc, unsigned CharWidth,
57                                   DiagnosticsEngine *Diags) {
58   // Skip the '\' char.
59   ++ThisTokBuf;
60 
61   // We know that this character can't be off the end of the buffer, because
62   // that would have been \", which would not have been the end of string.
63   unsigned ResultChar = *ThisTokBuf++;
64   switch (ResultChar) {
65   // These map to themselves.
66   case '\\': case '\'': case '"': case '?': break;
67 
68     // These have fixed mappings.
69   case 'a':
70     // TODO: K&R: the meaning of '\\a' is different in traditional C
71     ResultChar = 7;
72     break;
73   case 'b':
74     ResultChar = 8;
75     break;
76   case 'e':
77     if (Diags)
78       Diags->Report(Loc, diag::ext_nonstandard_escape) << "e";
79     ResultChar = 27;
80     break;
81   case 'E':
82     if (Diags)
83       Diags->Report(Loc, diag::ext_nonstandard_escape) << "E";
84     ResultChar = 27;
85     break;
86   case 'f':
87     ResultChar = 12;
88     break;
89   case 'n':
90     ResultChar = 10;
91     break;
92   case 'r':
93     ResultChar = 13;
94     break;
95   case 't':
96     ResultChar = 9;
97     break;
98   case 'v':
99     ResultChar = 11;
100     break;
101   case 'x': { // Hex escape.
102     ResultChar = 0;
103     if (ThisTokBuf == ThisTokEnd || !isxdigit(*ThisTokBuf)) {
104       if (Diags)
105         Diags->Report(Loc, diag::err_hex_escape_no_digits);
106       HadError = 1;
107       break;
108     }
109 
110     // Hex escapes are a maximal series of hex digits.
111     bool Overflow = false;
112     for (; ThisTokBuf != ThisTokEnd; ++ThisTokBuf) {
113       int CharVal = HexDigitValue(ThisTokBuf[0]);
114       if (CharVal == -1) break;
115       // About to shift out a digit?
116       Overflow |= (ResultChar & 0xF0000000) ? true : false;
117       ResultChar <<= 4;
118       ResultChar |= CharVal;
119     }
120 
121     // See if any bits will be truncated when evaluated as a character.
122     if (CharWidth != 32 && (ResultChar >> CharWidth) != 0) {
123       Overflow = true;
124       ResultChar &= ~0U >> (32-CharWidth);
125     }
126 
127     // Check for overflow.
128     if (Overflow && Diags)   // Too many digits to fit in
129       Diags->Report(Loc, diag::warn_hex_escape_too_large);
130     break;
131   }
132   case '0': case '1': case '2': case '3':
133   case '4': case '5': case '6': case '7': {
134     // Octal escapes.
135     --ThisTokBuf;
136     ResultChar = 0;
137 
138     // Octal escapes are a series of octal digits with maximum length 3.
139     // "\0123" is a two digit sequence equal to "\012" "3".
140     unsigned NumDigits = 0;
141     do {
142       ResultChar <<= 3;
143       ResultChar |= *ThisTokBuf++ - '0';
144       ++NumDigits;
145     } while (ThisTokBuf != ThisTokEnd && NumDigits < 3 &&
146              ThisTokBuf[0] >= '0' && ThisTokBuf[0] <= '7');
147 
148     // Check for overflow.  Reject '\777', but not L'\777'.
149     if (CharWidth != 32 && (ResultChar >> CharWidth) != 0) {
150       if (Diags)
151         Diags->Report(Loc, diag::warn_octal_escape_too_large);
152       ResultChar &= ~0U >> (32-CharWidth);
153     }
154     break;
155   }
156 
157     // Otherwise, these are not valid escapes.
158   case '(': case '{': case '[': case '%':
159     // GCC accepts these as extensions.  We warn about them as such though.
160     if (Diags)
161       Diags->Report(Loc, diag::ext_nonstandard_escape)
162         << std::string()+(char)ResultChar;
163     break;
164   default:
165     if (Diags == 0)
166       break;
167 
168     if (isgraph(ResultChar))
169       Diags->Report(Loc, diag::ext_unknown_escape)
170         << std::string()+(char)ResultChar;
171     else
172       Diags->Report(Loc, diag::ext_unknown_escape)
173         << "x"+llvm::utohexstr(ResultChar);
174     break;
175   }
176 
177   return ResultChar;
178 }
179 
180 /// ProcessUCNEscape - Read the Universal Character Name, check constraints and
181 /// return the UTF32.
182 static bool ProcessUCNEscape(const char *&ThisTokBuf, const char *ThisTokEnd,
183                              uint32_t &UcnVal, unsigned short &UcnLen,
184                              FullSourceLoc Loc, DiagnosticsEngine *Diags,
185                              const LangOptions &Features) {
186   if (!Features.CPlusPlus && !Features.C99 && Diags)
187     Diags->Report(Loc, diag::warn_ucn_not_valid_in_c89);
188 
189   // Save the beginning of the string (for error diagnostics).
190   const char *ThisTokBegin = ThisTokBuf;
191 
192   // Skip the '\u' char's.
193   ThisTokBuf += 2;
194 
195   if (ThisTokBuf == ThisTokEnd || !isxdigit(*ThisTokBuf)) {
196     if (Diags)
197       Diags->Report(Loc, diag::err_ucn_escape_no_digits);
198     return false;
199   }
200   UcnLen = (ThisTokBuf[-1] == 'u' ? 4 : 8);
201   unsigned short UcnLenSave = UcnLen;
202   for (; ThisTokBuf != ThisTokEnd && UcnLenSave; ++ThisTokBuf, UcnLenSave--) {
203     int CharVal = HexDigitValue(ThisTokBuf[0]);
204     if (CharVal == -1) break;
205     UcnVal <<= 4;
206     UcnVal |= CharVal;
207   }
208   // If we didn't consume the proper number of digits, there is a problem.
209   if (UcnLenSave) {
210     if (Diags) {
211       SourceLocation L =
212         Lexer::AdvanceToTokenCharacter(Loc, ThisTokBuf-ThisTokBegin,
213                                        Loc.getManager(), Features);
214       Diags->Report(FullSourceLoc(L, Loc.getManager()),
215                     diag::err_ucn_escape_incomplete);
216     }
217     return false;
218   }
219   // Check UCN constraints (C99 6.4.3p2).
220   if ((UcnVal < 0xa0 &&
221       (UcnVal != 0x24 && UcnVal != 0x40 && UcnVal != 0x60 )) // $, @, `
222       || (UcnVal >= 0xD800 && UcnVal <= 0xDFFF)
223       || (UcnVal > 0x10FFFF)) /* the maximum legal UTF32 value */ {
224     if (Diags)
225       Diags->Report(Loc, diag::err_ucn_escape_invalid);
226     return false;
227   }
228   return true;
229 }
230 
231 /// EncodeUCNEscape - Read the Universal Character Name, check constraints and
232 /// convert the UTF32 to UTF8 or UTF16. This is a subroutine of
233 /// StringLiteralParser. When we decide to implement UCN's for identifiers,
234 /// we will likely rework our support for UCN's.
235 static void EncodeUCNEscape(const char *&ThisTokBuf, const char *ThisTokEnd,
236                             char *&ResultBuf, bool &HadError,
237                             FullSourceLoc Loc, unsigned CharByteWidth,
238                             DiagnosticsEngine *Diags,
239                             const LangOptions &Features) {
240   typedef uint32_t UTF32;
241   UTF32 UcnVal = 0;
242   unsigned short UcnLen = 0;
243   if (!ProcessUCNEscape(ThisTokBuf, ThisTokEnd, UcnVal, UcnLen, Loc, Diags,
244                         Features)) {
245     HadError = 1;
246     return;
247   }
248 
249   assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth) &&
250          "only character widths of 1, 2, or 4 bytes supported");
251 
252   (void)UcnLen;
253   assert((UcnLen== 4 || UcnLen== 8) && "only ucn length of 4 or 8 supported");
254 
255   if (CharByteWidth == 4) {
256     // FIXME: Make the type of the result buffer correct instead of
257     // using reinterpret_cast.
258     UTF32 *ResultPtr = reinterpret_cast<UTF32*>(ResultBuf);
259     *ResultPtr = UcnVal;
260     ResultBuf += 4;
261     return;
262   }
263 
264   if (CharByteWidth == 2) {
265     // FIXME: Make the type of the result buffer correct instead of
266     // using reinterpret_cast.
267     UTF16 *ResultPtr = reinterpret_cast<UTF16*>(ResultBuf);
268 
269     if (UcnVal < (UTF32)0xFFFF) {
270       *ResultPtr = UcnVal;
271       ResultBuf += 2;
272       return;
273     }
274     // FIXME: We shouldn't print a diagnostic for UTF-16 mode.
275     if (Diags) Diags->Report(Loc, diag::warn_ucn_escape_too_large);
276 
277     // Convert to UTF16.
278     UcnVal -= 0x10000;
279     *ResultPtr     = 0xD800 + (UcnVal >> 10);
280     *(ResultPtr+1) = 0xDC00 + (UcnVal & 0x3FF);
281     ResultBuf += 4;
282     return;
283   }
284 
285   assert(CharByteWidth == 1 && "UTF-8 encoding is only for 1 byte characters");
286 
287   // Now that we've parsed/checked the UCN, we convert from UTF32->UTF8.
288   // The conversion below was inspired by:
289   //   http://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c
290   // First, we determine how many bytes the result will require.
291   typedef uint8_t UTF8;
292 
293   unsigned short bytesToWrite = 0;
294   if (UcnVal < (UTF32)0x80)
295     bytesToWrite = 1;
296   else if (UcnVal < (UTF32)0x800)
297     bytesToWrite = 2;
298   else if (UcnVal < (UTF32)0x10000)
299     bytesToWrite = 3;
300   else
301     bytesToWrite = 4;
302 
303   const unsigned byteMask = 0xBF;
304   const unsigned byteMark = 0x80;
305 
306   // Once the bits are split out into bytes of UTF8, this is a mask OR-ed
307   // into the first byte, depending on how many bytes follow.
308   static const UTF8 firstByteMark[5] = {
309     0x00, 0x00, 0xC0, 0xE0, 0xF0
310   };
311   // Finally, we write the bytes into ResultBuf.
312   ResultBuf += bytesToWrite;
313   switch (bytesToWrite) { // note: everything falls through.
314     case 4: *--ResultBuf = (UTF8)((UcnVal | byteMark) & byteMask); UcnVal >>= 6;
315     case 3: *--ResultBuf = (UTF8)((UcnVal | byteMark) & byteMask); UcnVal >>= 6;
316     case 2: *--ResultBuf = (UTF8)((UcnVal | byteMark) & byteMask); UcnVal >>= 6;
317     case 1: *--ResultBuf = (UTF8) (UcnVal | firstByteMark[bytesToWrite]);
318   }
319   // Update the buffer.
320   ResultBuf += bytesToWrite;
321 }
322 
323 
324 ///       integer-constant: [C99 6.4.4.1]
325 ///         decimal-constant integer-suffix
326 ///         octal-constant integer-suffix
327 ///         hexadecimal-constant integer-suffix
328 ///       decimal-constant:
329 ///         nonzero-digit
330 ///         decimal-constant digit
331 ///       octal-constant:
332 ///         0
333 ///         octal-constant octal-digit
334 ///       hexadecimal-constant:
335 ///         hexadecimal-prefix hexadecimal-digit
336 ///         hexadecimal-constant hexadecimal-digit
337 ///       hexadecimal-prefix: one of
338 ///         0x 0X
339 ///       integer-suffix:
340 ///         unsigned-suffix [long-suffix]
341 ///         unsigned-suffix [long-long-suffix]
342 ///         long-suffix [unsigned-suffix]
343 ///         long-long-suffix [unsigned-sufix]
344 ///       nonzero-digit:
345 ///         1 2 3 4 5 6 7 8 9
346 ///       octal-digit:
347 ///         0 1 2 3 4 5 6 7
348 ///       hexadecimal-digit:
349 ///         0 1 2 3 4 5 6 7 8 9
350 ///         a b c d e f
351 ///         A B C D E F
352 ///       unsigned-suffix: one of
353 ///         u U
354 ///       long-suffix: one of
355 ///         l L
356 ///       long-long-suffix: one of
357 ///         ll LL
358 ///
359 ///       floating-constant: [C99 6.4.4.2]
360 ///         TODO: add rules...
361 ///
362 NumericLiteralParser::
363 NumericLiteralParser(const char *begin, const char *end,
364                      SourceLocation TokLoc, Preprocessor &pp)
365   : PP(pp), ThisTokBegin(begin), ThisTokEnd(end) {
366 
367   // This routine assumes that the range begin/end matches the regex for integer
368   // and FP constants (specifically, the 'pp-number' regex), and assumes that
369   // the byte at "*end" is both valid and not part of the regex.  Because of
370   // this, it doesn't have to check for 'overscan' in various places.
371   assert(!isalnum(*end) && *end != '.' && *end != '_' &&
372          "Lexer didn't maximally munch?");
373 
374   s = DigitsBegin = begin;
375   saw_exponent = false;
376   saw_period = false;
377   isLong = false;
378   isUnsigned = false;
379   isLongLong = false;
380   isFloat = false;
381   isImaginary = false;
382   isMicrosoftInteger = false;
383   hadError = false;
384 
385   if (*s == '0') { // parse radix
386     ParseNumberStartingWithZero(TokLoc);
387     if (hadError)
388       return;
389   } else { // the first digit is non-zero
390     radix = 10;
391     s = SkipDigits(s);
392     if (s == ThisTokEnd) {
393       // Done.
394     } else if (isxdigit(*s) && !(*s == 'e' || *s == 'E')) {
395       PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
396               diag::err_invalid_decimal_digit) << StringRef(s, 1);
397       hadError = true;
398       return;
399     } else if (*s == '.') {
400       s++;
401       saw_period = true;
402       s = SkipDigits(s);
403     }
404     if ((*s == 'e' || *s == 'E')) { // exponent
405       const char *Exponent = s;
406       s++;
407       saw_exponent = true;
408       if (*s == '+' || *s == '-')  s++; // sign
409       const char *first_non_digit = SkipDigits(s);
410       if (first_non_digit != s) {
411         s = first_non_digit;
412       } else {
413         PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-begin),
414                 diag::err_exponent_has_no_digits);
415         hadError = true;
416         return;
417       }
418     }
419   }
420 
421   SuffixBegin = s;
422 
423   // Parse the suffix.  At this point we can classify whether we have an FP or
424   // integer constant.
425   bool isFPConstant = isFloatingLiteral();
426 
427   // Loop over all of the characters of the suffix.  If we see something bad,
428   // we break out of the loop.
429   for (; s != ThisTokEnd; ++s) {
430     switch (*s) {
431     case 'f':      // FP Suffix for "float"
432     case 'F':
433       if (!isFPConstant) break;  // Error for integer constant.
434       if (isFloat || isLong) break; // FF, LF invalid.
435       isFloat = true;
436       continue;  // Success.
437     case 'u':
438     case 'U':
439       if (isFPConstant) break;  // Error for floating constant.
440       if (isUnsigned) break;    // Cannot be repeated.
441       isUnsigned = true;
442       continue;  // Success.
443     case 'l':
444     case 'L':
445       if (isLong || isLongLong) break;  // Cannot be repeated.
446       if (isFloat) break;               // LF invalid.
447 
448       // Check for long long.  The L's need to be adjacent and the same case.
449       if (s+1 != ThisTokEnd && s[1] == s[0]) {
450         if (isFPConstant) break;        // long long invalid for floats.
451         isLongLong = true;
452         ++s;  // Eat both of them.
453       } else {
454         isLong = true;
455       }
456       continue;  // Success.
457     case 'i':
458     case 'I':
459       if (PP.getLangOptions().MicrosoftExt) {
460         if (isFPConstant || isLong || isLongLong) break;
461 
462         // Allow i8, i16, i32, i64, and i128.
463         if (s + 1 != ThisTokEnd) {
464           switch (s[1]) {
465             case '8':
466               s += 2; // i8 suffix
467               isMicrosoftInteger = true;
468               break;
469             case '1':
470               if (s + 2 == ThisTokEnd) break;
471               if (s[2] == '6') {
472                 s += 3; // i16 suffix
473                 isMicrosoftInteger = true;
474               }
475               else if (s[2] == '2') {
476                 if (s + 3 == ThisTokEnd) break;
477                 if (s[3] == '8') {
478                   s += 4; // i128 suffix
479                   isMicrosoftInteger = true;
480                 }
481               }
482               break;
483             case '3':
484               if (s + 2 == ThisTokEnd) break;
485               if (s[2] == '2') {
486                 s += 3; // i32 suffix
487                 isLong = true;
488                 isMicrosoftInteger = true;
489               }
490               break;
491             case '6':
492               if (s + 2 == ThisTokEnd) break;
493               if (s[2] == '4') {
494                 s += 3; // i64 suffix
495                 isLongLong = true;
496                 isMicrosoftInteger = true;
497               }
498               break;
499             default:
500               break;
501           }
502           break;
503         }
504       }
505       // fall through.
506     case 'j':
507     case 'J':
508       if (isImaginary) break;   // Cannot be repeated.
509       PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
510               diag::ext_imaginary_constant);
511       isImaginary = true;
512       continue;  // Success.
513     }
514     // If we reached here, there was an error.
515     break;
516   }
517 
518   // Report an error if there are any.
519   if (s != ThisTokEnd) {
520     PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
521             isFPConstant ? diag::err_invalid_suffix_float_constant :
522                            diag::err_invalid_suffix_integer_constant)
523       << StringRef(SuffixBegin, ThisTokEnd-SuffixBegin);
524     hadError = true;
525     return;
526   }
527 }
528 
529 /// ParseNumberStartingWithZero - This method is called when the first character
530 /// of the number is found to be a zero.  This means it is either an octal
531 /// number (like '04') or a hex number ('0x123a') a binary number ('0b1010') or
532 /// a floating point number (01239.123e4).  Eat the prefix, determining the
533 /// radix etc.
534 void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
535   assert(s[0] == '0' && "Invalid method call");
536   s++;
537 
538   // Handle a hex number like 0x1234.
539   if ((*s == 'x' || *s == 'X') && (isxdigit(s[1]) || s[1] == '.')) {
540     s++;
541     radix = 16;
542     DigitsBegin = s;
543     s = SkipHexDigits(s);
544     if (s == ThisTokEnd) {
545       // Done.
546     } else if (*s == '.') {
547       s++;
548       saw_period = true;
549       s = SkipHexDigits(s);
550     }
551     // A binary exponent can appear with or with a '.'. If dotted, the
552     // binary exponent is required.
553     if (*s == 'p' || *s == 'P') {
554       const char *Exponent = s;
555       s++;
556       saw_exponent = true;
557       if (*s == '+' || *s == '-')  s++; // sign
558       const char *first_non_digit = SkipDigits(s);
559       if (first_non_digit == s) {
560         PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
561                 diag::err_exponent_has_no_digits);
562         hadError = true;
563         return;
564       }
565       s = first_non_digit;
566 
567       if (!PP.getLangOptions().HexFloats)
568         PP.Diag(TokLoc, diag::ext_hexconstant_invalid);
569     } else if (saw_period) {
570       PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
571               diag::err_hexconstant_requires_exponent);
572       hadError = true;
573     }
574     return;
575   }
576 
577   // Handle simple binary numbers 0b01010
578   if (*s == 'b' || *s == 'B') {
579     // 0b101010 is a GCC extension.
580     PP.Diag(TokLoc, diag::ext_binary_literal);
581     ++s;
582     radix = 2;
583     DigitsBegin = s;
584     s = SkipBinaryDigits(s);
585     if (s == ThisTokEnd) {
586       // Done.
587     } else if (isxdigit(*s)) {
588       PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
589               diag::err_invalid_binary_digit) << StringRef(s, 1);
590       hadError = true;
591     }
592     // Other suffixes will be diagnosed by the caller.
593     return;
594   }
595 
596   // For now, the radix is set to 8. If we discover that we have a
597   // floating point constant, the radix will change to 10. Octal floating
598   // point constants are not permitted (only decimal and hexadecimal).
599   radix = 8;
600   DigitsBegin = s;
601   s = SkipOctalDigits(s);
602   if (s == ThisTokEnd)
603     return; // Done, simple octal number like 01234
604 
605   // If we have some other non-octal digit that *is* a decimal digit, see if
606   // this is part of a floating point number like 094.123 or 09e1.
607   if (isdigit(*s)) {
608     const char *EndDecimal = SkipDigits(s);
609     if (EndDecimal[0] == '.' || EndDecimal[0] == 'e' || EndDecimal[0] == 'E') {
610       s = EndDecimal;
611       radix = 10;
612     }
613   }
614 
615   // If we have a hex digit other than 'e' (which denotes a FP exponent) then
616   // the code is using an incorrect base.
617   if (isxdigit(*s) && *s != 'e' && *s != 'E') {
618     PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
619             diag::err_invalid_octal_digit) << StringRef(s, 1);
620     hadError = true;
621     return;
622   }
623 
624   if (*s == '.') {
625     s++;
626     radix = 10;
627     saw_period = true;
628     s = SkipDigits(s); // Skip suffix.
629   }
630   if (*s == 'e' || *s == 'E') { // exponent
631     const char *Exponent = s;
632     s++;
633     radix = 10;
634     saw_exponent = true;
635     if (*s == '+' || *s == '-')  s++; // sign
636     const char *first_non_digit = SkipDigits(s);
637     if (first_non_digit != s) {
638       s = first_non_digit;
639     } else {
640       PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
641               diag::err_exponent_has_no_digits);
642       hadError = true;
643       return;
644     }
645   }
646 }
647 
648 
649 /// GetIntegerValue - Convert this numeric literal value to an APInt that
650 /// matches Val's input width.  If there is an overflow, set Val to the low bits
651 /// of the result and return true.  Otherwise, return false.
652 bool NumericLiteralParser::GetIntegerValue(llvm::APInt &Val) {
653   // Fast path: Compute a conservative bound on the maximum number of
654   // bits per digit in this radix. If we can't possibly overflow a
655   // uint64 based on that bound then do the simple conversion to
656   // integer. This avoids the expensive overflow checking below, and
657   // handles the common cases that matter (small decimal integers and
658   // hex/octal values which don't overflow).
659   unsigned MaxBitsPerDigit = 1;
660   while ((1U << MaxBitsPerDigit) < radix)
661     MaxBitsPerDigit += 1;
662   if ((SuffixBegin - DigitsBegin) * MaxBitsPerDigit <= 64) {
663     uint64_t N = 0;
664     for (s = DigitsBegin; s != SuffixBegin; ++s)
665       N = N*radix + HexDigitValue(*s);
666 
667     // This will truncate the value to Val's input width. Simply check
668     // for overflow by comparing.
669     Val = N;
670     return Val.getZExtValue() != N;
671   }
672 
673   Val = 0;
674   s = DigitsBegin;
675 
676   llvm::APInt RadixVal(Val.getBitWidth(), radix);
677   llvm::APInt CharVal(Val.getBitWidth(), 0);
678   llvm::APInt OldVal = Val;
679 
680   bool OverflowOccurred = false;
681   while (s < SuffixBegin) {
682     unsigned C = HexDigitValue(*s++);
683 
684     // If this letter is out of bound for this radix, reject it.
685     assert(C < radix && "NumericLiteralParser ctor should have rejected this");
686 
687     CharVal = C;
688 
689     // Add the digit to the value in the appropriate radix.  If adding in digits
690     // made the value smaller, then this overflowed.
691     OldVal = Val;
692 
693     // Multiply by radix, did overflow occur on the multiply?
694     Val *= RadixVal;
695     OverflowOccurred |= Val.udiv(RadixVal) != OldVal;
696 
697     // Add value, did overflow occur on the value?
698     //   (a + b) ult b  <=> overflow
699     Val += CharVal;
700     OverflowOccurred |= Val.ult(CharVal);
701   }
702   return OverflowOccurred;
703 }
704 
705 llvm::APFloat::opStatus
706 NumericLiteralParser::GetFloatValue(llvm::APFloat &Result) {
707   using llvm::APFloat;
708 
709   unsigned n = std::min(SuffixBegin - ThisTokBegin, ThisTokEnd - ThisTokBegin);
710   return Result.convertFromString(StringRef(ThisTokBegin, n),
711                                   APFloat::rmNearestTiesToEven);
712 }
713 
714 
715 ///       character-literal: [C++0x lex.ccon]
716 ///         ' c-char-sequence '
717 ///         u' c-char-sequence '
718 ///         U' c-char-sequence '
719 ///         L' c-char-sequence '
720 ///       c-char-sequence:
721 ///         c-char
722 ///         c-char-sequence c-char
723 ///       c-char:
724 ///         any member of the source character set except the single-quote ',
725 ///           backslash \, or new-line character
726 ///         escape-sequence
727 ///         universal-character-name
728 ///       escape-sequence: [C++0x lex.ccon]
729 ///         simple-escape-sequence
730 ///         octal-escape-sequence
731 ///         hexadecimal-escape-sequence
732 ///       simple-escape-sequence:
733 ///         one of \' \" \? \\ \a \b \f \n \r \t \v
734 ///       octal-escape-sequence:
735 ///         \ octal-digit
736 ///         \ octal-digit octal-digit
737 ///         \ octal-digit octal-digit octal-digit
738 ///       hexadecimal-escape-sequence:
739 ///         \x hexadecimal-digit
740 ///         hexadecimal-escape-sequence hexadecimal-digit
741 ///       universal-character-name:
742 ///         \u hex-quad
743 ///         \U hex-quad hex-quad
744 ///       hex-quad:
745 ///         hex-digit hex-digit hex-digit hex-digit
746 ///
747 CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
748                                      SourceLocation Loc, Preprocessor &PP,
749                                      tok::TokenKind kind) {
750   // At this point we know that the character matches the regex "L?'.*'".
751   HadError = false;
752 
753   Kind = kind;
754 
755   // Determine if this is a wide or UTF character.
756   if (Kind == tok::wide_char_constant || Kind == tok::utf16_char_constant ||
757       Kind == tok::utf32_char_constant) {
758     ++begin;
759   }
760 
761   // Skip over the entry quote.
762   assert(begin[0] == '\'' && "Invalid token lexed");
763   ++begin;
764 
765   // FIXME: The "Value" is an uint64_t so we can handle char literals of
766   // up to 64-bits.
767   // FIXME: This extensively assumes that 'char' is 8-bits.
768   assert(PP.getTargetInfo().getCharWidth() == 8 &&
769          "Assumes char is 8 bits");
770   assert(PP.getTargetInfo().getIntWidth() <= 64 &&
771          (PP.getTargetInfo().getIntWidth() & 7) == 0 &&
772          "Assumes sizeof(int) on target is <= 64 and a multiple of char");
773   assert(PP.getTargetInfo().getWCharWidth() <= 64 &&
774          "Assumes sizeof(wchar) on target is <= 64");
775 
776   // This is what we will use for overflow detection
777   llvm::APInt LitVal(PP.getTargetInfo().getIntWidth(), 0);
778 
779   unsigned NumCharsSoFar = 0;
780   bool Warned = false;
781   while (begin[0] != '\'') {
782     uint64_t ResultChar;
783 
784       // Is this a Universal Character Name escape?
785     if (begin[0] != '\\')     // If this is a normal character, consume it.
786       ResultChar = (unsigned char)*begin++;
787     else {                    // Otherwise, this is an escape character.
788       unsigned CharWidth = getCharWidth(Kind, PP.getTargetInfo());
789       // Check for UCN.
790       if (begin[1] == 'u' || begin[1] == 'U') {
791         uint32_t utf32 = 0;
792         unsigned short UcnLen = 0;
793         if (!ProcessUCNEscape(begin, end, utf32, UcnLen,
794                               FullSourceLoc(Loc, PP.getSourceManager()),
795                               &PP.getDiagnostics(), PP.getLangOptions())) {
796           HadError = 1;
797         }
798         ResultChar = utf32;
799         if (CharWidth != 32 && (ResultChar >> CharWidth) != 0) {
800           PP.Diag(Loc, diag::warn_ucn_escape_too_large);
801           ResultChar &= ~0U >> (32-CharWidth);
802         }
803       } else {
804         // Otherwise, this is a non-UCN escape character.  Process it.
805         ResultChar = ProcessCharEscape(begin, end, HadError,
806                                        FullSourceLoc(Loc,PP.getSourceManager()),
807                                        CharWidth, &PP.getDiagnostics());
808       }
809     }
810 
811     // If this is a multi-character constant (e.g. 'abc'), handle it.  These are
812     // implementation defined (C99 6.4.4.4p10).
813     if (NumCharsSoFar) {
814       if (!isAscii()) {
815         // Emulate GCC's (unintentional?) behavior: L'ab' -> L'b'.
816         LitVal = 0;
817       } else {
818         // Narrow character literals act as though their value is concatenated
819         // in this implementation, but warn on overflow.
820         if (LitVal.countLeadingZeros() < 8 && !Warned) {
821           PP.Diag(Loc, diag::warn_char_constant_too_large);
822           Warned = true;
823         }
824         LitVal <<= 8;
825       }
826     }
827 
828     LitVal = LitVal + ResultChar;
829     ++NumCharsSoFar;
830   }
831 
832   // If this is the second character being processed, do special handling.
833   if (NumCharsSoFar > 1) {
834     // Warn about discarding the top bits for multi-char wide-character
835     // constants (L'abcd').
836     if (!isAscii())
837       PP.Diag(Loc, diag::warn_extraneous_char_constant);
838     else if (NumCharsSoFar != 4)
839       PP.Diag(Loc, diag::ext_multichar_character_literal);
840     else
841       PP.Diag(Loc, diag::ext_four_char_character_literal);
842     IsMultiChar = true;
843   } else
844     IsMultiChar = false;
845 
846   // Transfer the value from APInt to uint64_t
847   Value = LitVal.getZExtValue();
848 
849   // If this is a single narrow character, sign extend it (e.g. '\xFF' is "-1")
850   // if 'char' is signed for this target (C99 6.4.4.4p10).  Note that multiple
851   // character constants are not sign extended in the this implementation:
852   // '\xFF\xFF' = 65536 and '\x0\xFF' = 255, which matches GCC.
853   if (isAscii() && NumCharsSoFar == 1 && (Value & 128) &&
854       PP.getLangOptions().CharIsSigned)
855     Value = (signed char)Value;
856 }
857 
858 
859 ///       string-literal: [C++0x lex.string]
860 ///         encoding-prefix " [s-char-sequence] "
861 ///         encoding-prefix R raw-string
862 ///       encoding-prefix:
863 ///         u8
864 ///         u
865 ///         U
866 ///         L
867 ///       s-char-sequence:
868 ///         s-char
869 ///         s-char-sequence s-char
870 ///       s-char:
871 ///         any member of the source character set except the double-quote ",
872 ///           backslash \, or new-line character
873 ///         escape-sequence
874 ///         universal-character-name
875 ///       raw-string:
876 ///         " d-char-sequence ( r-char-sequence ) d-char-sequence "
877 ///       r-char-sequence:
878 ///         r-char
879 ///         r-char-sequence r-char
880 ///       r-char:
881 ///         any member of the source character set, except a right parenthesis )
882 ///           followed by the initial d-char-sequence (which may be empty)
883 ///           followed by a double quote ".
884 ///       d-char-sequence:
885 ///         d-char
886 ///         d-char-sequence d-char
887 ///       d-char:
888 ///         any member of the basic source character set except:
889 ///           space, the left parenthesis (, the right parenthesis ),
890 ///           the backslash \, and the control characters representing horizontal
891 ///           tab, vertical tab, form feed, and newline.
892 ///       escape-sequence: [C++0x lex.ccon]
893 ///         simple-escape-sequence
894 ///         octal-escape-sequence
895 ///         hexadecimal-escape-sequence
896 ///       simple-escape-sequence:
897 ///         one of \' \" \? \\ \a \b \f \n \r \t \v
898 ///       octal-escape-sequence:
899 ///         \ octal-digit
900 ///         \ octal-digit octal-digit
901 ///         \ octal-digit octal-digit octal-digit
902 ///       hexadecimal-escape-sequence:
903 ///         \x hexadecimal-digit
904 ///         hexadecimal-escape-sequence hexadecimal-digit
905 ///       universal-character-name:
906 ///         \u hex-quad
907 ///         \U hex-quad hex-quad
908 ///       hex-quad:
909 ///         hex-digit hex-digit hex-digit hex-digit
910 ///
911 StringLiteralParser::
912 StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
913                     Preprocessor &PP, bool Complain)
914   : SM(PP.getSourceManager()), Features(PP.getLangOptions()),
915     Target(PP.getTargetInfo()), Diags(Complain ? &PP.getDiagnostics() : 0),
916     MaxTokenLength(0), SizeBound(0), CharByteWidth(0), Kind(tok::unknown),
917     ResultPtr(ResultBuf.data()), hadError(false), Pascal(false) {
918   init(StringToks, NumStringToks);
919 }
920 
921 void StringLiteralParser::init(const Token *StringToks, unsigned NumStringToks){
922   // The literal token may have come from an invalid source location (e.g. due
923   // to a PCH error), in which case the token length will be 0.
924   if (NumStringToks == 0 || StringToks[0].getLength() < 2) {
925     hadError = true;
926     return;
927   }
928 
929   // Scan all of the string portions, remember the max individual token length,
930   // computing a bound on the concatenated string length, and see whether any
931   // piece is a wide-string.  If any of the string portions is a wide-string
932   // literal, the result is a wide-string literal [C99 6.4.5p4].
933   assert(NumStringToks && "expected at least one token");
934   MaxTokenLength = StringToks[0].getLength();
935   assert(StringToks[0].getLength() >= 2 && "literal token is invalid!");
936   SizeBound = StringToks[0].getLength()-2;  // -2 for "".
937   Kind = StringToks[0].getKind();
938 
939   hadError = false;
940 
941   // Implement Translation Phase #6: concatenation of string literals
942   /// (C99 5.1.1.2p1).  The common case is only one string fragment.
943   for (unsigned i = 1; i != NumStringToks; ++i) {
944     if (StringToks[i].getLength() < 2) {
945       hadError = true;
946       return;
947     }
948 
949     // The string could be shorter than this if it needs cleaning, but this is a
950     // reasonable bound, which is all we need.
951     assert(StringToks[i].getLength() >= 2 && "literal token is invalid!");
952     SizeBound += StringToks[i].getLength()-2;  // -2 for "".
953 
954     // Remember maximum string piece length.
955     if (StringToks[i].getLength() > MaxTokenLength)
956       MaxTokenLength = StringToks[i].getLength();
957 
958     // Remember if we see any wide or utf-8/16/32 strings.
959     // Also check for illegal concatenations.
960     if (StringToks[i].isNot(Kind) && StringToks[i].isNot(tok::string_literal)) {
961       if (isAscii()) {
962         Kind = StringToks[i].getKind();
963       } else {
964         if (Diags)
965           Diags->Report(FullSourceLoc(StringToks[i].getLocation(), SM),
966                         diag::err_unsupported_string_concat);
967         hadError = true;
968       }
969     }
970   }
971 
972   // Include space for the null terminator.
973   ++SizeBound;
974 
975   // TODO: K&R warning: "traditional C rejects string constant concatenation"
976 
977   // Get the width in bytes of char/wchar_t/char16_t/char32_t
978   CharByteWidth = getCharWidth(Kind, Target);
979   assert((CharByteWidth & 7) == 0 && "Assumes character size is byte multiple");
980   CharByteWidth /= 8;
981 
982   // The output buffer size needs to be large enough to hold wide characters.
983   // This is a worst-case assumption which basically corresponds to L"" "long".
984   SizeBound *= CharByteWidth;
985 
986   // Size the temporary buffer to hold the result string data.
987   ResultBuf.resize(SizeBound);
988 
989   // Likewise, but for each string piece.
990   llvm::SmallString<512> TokenBuf;
991   TokenBuf.resize(MaxTokenLength);
992 
993   // Loop over all the strings, getting their spelling, and expanding them to
994   // wide strings as appropriate.
995   ResultPtr = &ResultBuf[0];   // Next byte to fill in.
996 
997   Pascal = false;
998 
999   for (unsigned i = 0, e = NumStringToks; i != e; ++i) {
1000     const char *ThisTokBuf = &TokenBuf[0];
1001     // Get the spelling of the token, which eliminates trigraphs, etc.  We know
1002     // that ThisTokBuf points to a buffer that is big enough for the whole token
1003     // and 'spelled' tokens can only shrink.
1004     bool StringInvalid = false;
1005     unsigned ThisTokLen =
1006       Lexer::getSpelling(StringToks[i], ThisTokBuf, SM, Features,
1007                          &StringInvalid);
1008     if (StringInvalid) {
1009       hadError = true;
1010       continue;
1011     }
1012 
1013     const char *ThisTokEnd = ThisTokBuf+ThisTokLen-1;  // Skip end quote.
1014     // TODO: Input character set mapping support.
1015 
1016     // Skip marker for wide or unicode strings.
1017     if (ThisTokBuf[0] == 'L' || ThisTokBuf[0] == 'u' || ThisTokBuf[0] == 'U') {
1018       ++ThisTokBuf;
1019       // Skip 8 of u8 marker for utf8 strings.
1020       if (ThisTokBuf[0] == '8')
1021         ++ThisTokBuf;
1022     }
1023 
1024     // Check for raw string
1025     if (ThisTokBuf[0] == 'R') {
1026       ThisTokBuf += 2; // skip R"
1027 
1028       const char *Prefix = ThisTokBuf;
1029       while (ThisTokBuf[0] != '(')
1030         ++ThisTokBuf;
1031       ++ThisTokBuf; // skip '('
1032 
1033       // remove same number of characters from the end
1034       if (ThisTokEnd >= ThisTokBuf + (ThisTokBuf - Prefix))
1035         ThisTokEnd -= (ThisTokBuf - Prefix);
1036 
1037       // Copy the string over
1038       if (CopyStringFragment(StringRef(ThisTokBuf,ThisTokEnd-ThisTokBuf)))
1039       {
1040         if (Diags)
1041           Diags->Report(FullSourceLoc(StringToks[i].getLocation(), SM),
1042                         diag::err_bad_string_encoding);
1043         hadError = true;
1044       }
1045 
1046     } else {
1047       assert(ThisTokBuf[0] == '"' && "Expected quote, lexer broken?");
1048       ++ThisTokBuf; // skip "
1049 
1050       // Check if this is a pascal string
1051       if (Features.PascalStrings && ThisTokBuf + 1 != ThisTokEnd &&
1052           ThisTokBuf[0] == '\\' && ThisTokBuf[1] == 'p') {
1053 
1054         // If the \p sequence is found in the first token, we have a pascal string
1055         // Otherwise, if we already have a pascal string, ignore the first \p
1056         if (i == 0) {
1057           ++ThisTokBuf;
1058           Pascal = true;
1059         } else if (Pascal)
1060           ThisTokBuf += 2;
1061       }
1062 
1063       while (ThisTokBuf != ThisTokEnd) {
1064         // Is this a span of non-escape characters?
1065         if (ThisTokBuf[0] != '\\') {
1066           const char *InStart = ThisTokBuf;
1067           do {
1068             ++ThisTokBuf;
1069           } while (ThisTokBuf != ThisTokEnd && ThisTokBuf[0] != '\\');
1070 
1071           // Copy the character span over.
1072           if (CopyStringFragment(StringRef(InStart,ThisTokBuf-InStart)))
1073           {
1074             if (Diags)
1075               Diags->Report(FullSourceLoc(StringToks[i].getLocation(), SM),
1076                             diag::err_bad_string_encoding);
1077             hadError = true;
1078           }
1079           continue;
1080         }
1081         // Is this a Universal Character Name escape?
1082         if (ThisTokBuf[1] == 'u' || ThisTokBuf[1] == 'U') {
1083           EncodeUCNEscape(ThisTokBuf, ThisTokEnd, ResultPtr,
1084                           hadError, FullSourceLoc(StringToks[i].getLocation(),SM),
1085                           CharByteWidth, Diags, Features);
1086           continue;
1087         }
1088         // Otherwise, this is a non-UCN escape character.  Process it.
1089         unsigned ResultChar =
1090           ProcessCharEscape(ThisTokBuf, ThisTokEnd, hadError,
1091                             FullSourceLoc(StringToks[i].getLocation(), SM),
1092                             CharByteWidth*8, Diags);
1093 
1094         if (CharByteWidth == 4) {
1095           // FIXME: Make the type of the result buffer correct instead of
1096           // using reinterpret_cast.
1097           UTF32 *ResultWidePtr = reinterpret_cast<UTF32*>(ResultPtr);
1098           *ResultWidePtr = ResultChar & 0xFF;
1099           ResultPtr += 4;
1100         } else if (CharByteWidth == 2) {
1101           // FIXME: Make the type of the result buffer correct instead of
1102           // using reinterpret_cast.
1103           UTF16 *ResultWidePtr = reinterpret_cast<UTF16*>(ResultPtr);
1104           *ResultWidePtr = ResultChar & 0xFF;
1105           ResultPtr += 2;
1106         } else {
1107           assert(CharByteWidth == 1 && "Unexpected char width");
1108           *ResultPtr++ = ResultChar & 0xFF;
1109         }
1110       }
1111     }
1112   }
1113 
1114   if (Pascal) {
1115     if (CharByteWidth == 4) {
1116       // FIXME: Make the type of the result buffer correct instead of
1117       // using reinterpret_cast.
1118       UTF32 *ResultWidePtr = reinterpret_cast<UTF32*>(ResultBuf.data());
1119       ResultWidePtr[0] = GetNumStringChars() - 1;
1120     } else if (CharByteWidth == 2) {
1121       // FIXME: Make the type of the result buffer correct instead of
1122       // using reinterpret_cast.
1123       UTF16 *ResultWidePtr = reinterpret_cast<UTF16*>(ResultBuf.data());
1124       ResultWidePtr[0] = GetNumStringChars() - 1;
1125     } else {
1126       assert(CharByteWidth == 1 && "Unexpected char width");
1127       ResultBuf[0] = GetNumStringChars() - 1;
1128     }
1129 
1130     // Verify that pascal strings aren't too large.
1131     if (GetStringLength() > 256) {
1132       if (Diags)
1133         Diags->Report(FullSourceLoc(StringToks[0].getLocation(), SM),
1134                       diag::err_pascal_string_too_long)
1135           << SourceRange(StringToks[0].getLocation(),
1136                          StringToks[NumStringToks-1].getLocation());
1137       hadError = true;
1138       return;
1139     }
1140   } else if (Diags) {
1141     // Complain if this string literal has too many characters.
1142     unsigned MaxChars = Features.CPlusPlus? 65536 : Features.C99 ? 4095 : 509;
1143 
1144     if (GetNumStringChars() > MaxChars)
1145       Diags->Report(FullSourceLoc(StringToks[0].getLocation(), SM),
1146                     diag::ext_string_too_long)
1147         << GetNumStringChars() << MaxChars
1148         << (Features.CPlusPlus ? 2 : Features.C99 ? 1 : 0)
1149         << SourceRange(StringToks[0].getLocation(),
1150                        StringToks[NumStringToks-1].getLocation());
1151   }
1152 }
1153 
1154 
1155 /// copyStringFragment - This function copies from Start to End into ResultPtr.
1156 /// Performs widening for multi-byte characters.
1157 bool StringLiteralParser::CopyStringFragment(StringRef Fragment) {
1158   assert(CharByteWidth==1 || CharByteWidth==2 || CharByteWidth==4);
1159   ConversionResult result = conversionOK;
1160   // Copy the character span over.
1161   if (CharByteWidth == 1) {
1162     memcpy(ResultPtr, Fragment.data(), Fragment.size());
1163     ResultPtr += Fragment.size();
1164   } else if (CharByteWidth == 2) {
1165     UTF8 const *sourceStart = (UTF8 const *)Fragment.data();
1166     // FIXME: Make the type of the result buffer correct instead of
1167     // using reinterpret_cast.
1168     UTF16 *targetStart = reinterpret_cast<UTF16*>(ResultPtr);
1169     ConversionFlags flags = lenientConversion;
1170     result = ConvertUTF8toUTF16(
1171 	    &sourceStart,sourceStart + Fragment.size(),
1172         &targetStart,targetStart + 2*Fragment.size(),flags);
1173     if (result==conversionOK)
1174       ResultPtr = reinterpret_cast<char*>(targetStart);
1175   } else if (CharByteWidth == 4) {
1176     UTF8 const *sourceStart = (UTF8 const *)Fragment.data();
1177     // FIXME: Make the type of the result buffer correct instead of
1178     // using reinterpret_cast.
1179     UTF32 *targetStart = reinterpret_cast<UTF32*>(ResultPtr);
1180     ConversionFlags flags = lenientConversion;
1181     result = ConvertUTF8toUTF32(
1182         &sourceStart,sourceStart + Fragment.size(),
1183         &targetStart,targetStart + 4*Fragment.size(),flags);
1184     if (result==conversionOK)
1185       ResultPtr = reinterpret_cast<char*>(targetStart);
1186   }
1187   assert((result != targetExhausted)
1188          && "ConvertUTF8toUTFXX exhausted target buffer");
1189   return result != conversionOK;
1190 }
1191 
1192 
1193 /// getOffsetOfStringByte - This function returns the offset of the
1194 /// specified byte of the string data represented by Token.  This handles
1195 /// advancing over escape sequences in the string.
1196 unsigned StringLiteralParser::getOffsetOfStringByte(const Token &Tok,
1197                                                     unsigned ByteNo) const {
1198   // Get the spelling of the token.
1199   llvm::SmallString<32> SpellingBuffer;
1200   SpellingBuffer.resize(Tok.getLength());
1201 
1202   bool StringInvalid = false;
1203   const char *SpellingPtr = &SpellingBuffer[0];
1204   unsigned TokLen = Lexer::getSpelling(Tok, SpellingPtr, SM, Features,
1205                                        &StringInvalid);
1206   if (StringInvalid)
1207     return 0;
1208 
1209   assert(SpellingPtr[0] != 'L' && SpellingPtr[0] != 'u' &&
1210          SpellingPtr[0] != 'U' && "Doesn't handle wide or utf strings yet");
1211 
1212 
1213   const char *SpellingStart = SpellingPtr;
1214   const char *SpellingEnd = SpellingPtr+TokLen;
1215 
1216   // Skip over the leading quote.
1217   assert(SpellingPtr[0] == '"' && "Should be a string literal!");
1218   ++SpellingPtr;
1219 
1220   // Skip over bytes until we find the offset we're looking for.
1221   while (ByteNo) {
1222     assert(SpellingPtr < SpellingEnd && "Didn't find byte offset!");
1223 
1224     // Step over non-escapes simply.
1225     if (*SpellingPtr != '\\') {
1226       ++SpellingPtr;
1227       --ByteNo;
1228       continue;
1229     }
1230 
1231     // Otherwise, this is an escape character.  Advance over it.
1232     bool HadError = false;
1233     ProcessCharEscape(SpellingPtr, SpellingEnd, HadError,
1234                       FullSourceLoc(Tok.getLocation(), SM),
1235                       CharByteWidth*8, Diags);
1236     assert(!HadError && "This method isn't valid on erroneous strings");
1237     --ByteNo;
1238   }
1239 
1240   return SpellingPtr-SpellingStart;
1241 }
1242