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