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