1 //===--- Lexer.cpp - C Language Family Lexer ------------------------------===// 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 Lexer and Token interfaces. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Lex/Lexer.h" 15 #include "UnicodeCharSets.h" 16 #include "clang/Basic/CharInfo.h" 17 #include "clang/Basic/SourceManager.h" 18 #include "clang/Lex/CodeCompletionHandler.h" 19 #include "clang/Lex/LexDiagnostic.h" 20 #include "clang/Lex/LiteralSupport.h" 21 #include "clang/Lex/Preprocessor.h" 22 #include "llvm/ADT/STLExtras.h" 23 #include "llvm/ADT/StringExtras.h" 24 #include "llvm/ADT/StringSwitch.h" 25 #include "llvm/Support/Compiler.h" 26 #include "llvm/Support/ConvertUTF.h" 27 #include "llvm/Support/MemoryBuffer.h" 28 #include <cstring> 29 using namespace clang; 30 31 //===----------------------------------------------------------------------===// 32 // Token Class Implementation 33 //===----------------------------------------------------------------------===// 34 35 /// isObjCAtKeyword - Return true if we have an ObjC keyword identifier. 36 bool Token::isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const { 37 if (IdentifierInfo *II = getIdentifierInfo()) 38 return II->getObjCKeywordID() == objcKey; 39 return false; 40 } 41 42 /// getObjCKeywordID - Return the ObjC keyword kind. 43 tok::ObjCKeywordKind Token::getObjCKeywordID() const { 44 IdentifierInfo *specId = getIdentifierInfo(); 45 return specId ? specId->getObjCKeywordID() : tok::objc_not_keyword; 46 } 47 48 49 //===----------------------------------------------------------------------===// 50 // Lexer Class Implementation 51 //===----------------------------------------------------------------------===// 52 53 void Lexer::anchor() { } 54 55 void Lexer::InitLexer(const char *BufStart, const char *BufPtr, 56 const char *BufEnd) { 57 BufferStart = BufStart; 58 BufferPtr = BufPtr; 59 BufferEnd = BufEnd; 60 61 assert(BufEnd[0] == 0 && 62 "We assume that the input buffer has a null character at the end" 63 " to simplify lexing!"); 64 65 // Check whether we have a BOM in the beginning of the buffer. If yes - act 66 // accordingly. Right now we support only UTF-8 with and without BOM, so, just 67 // skip the UTF-8 BOM if it's present. 68 if (BufferStart == BufferPtr) { 69 // Determine the size of the BOM. 70 StringRef Buf(BufferStart, BufferEnd - BufferStart); 71 size_t BOMLength = llvm::StringSwitch<size_t>(Buf) 72 .StartsWith("\xEF\xBB\xBF", 3) // UTF-8 BOM 73 .Default(0); 74 75 // Skip the BOM. 76 BufferPtr += BOMLength; 77 } 78 79 Is_PragmaLexer = false; 80 CurrentConflictMarkerState = CMK_None; 81 82 // Start of the file is a start of line. 83 IsAtStartOfLine = true; 84 IsAtPhysicalStartOfLine = true; 85 86 HasLeadingSpace = false; 87 HasLeadingEmptyMacro = false; 88 89 // We are not after parsing a #. 90 ParsingPreprocessorDirective = false; 91 92 // We are not after parsing #include. 93 ParsingFilename = false; 94 95 // We are not in raw mode. Raw mode disables diagnostics and interpretation 96 // of tokens (e.g. identifiers, thus disabling macro expansion). It is used 97 // to quickly lex the tokens of the buffer, e.g. when handling a "#if 0" block 98 // or otherwise skipping over tokens. 99 LexingRawMode = false; 100 101 // Default to not keeping comments. 102 ExtendedTokenMode = 0; 103 } 104 105 /// Lexer constructor - Create a new lexer object for the specified buffer 106 /// with the specified preprocessor managing the lexing process. This lexer 107 /// assumes that the associated file buffer and Preprocessor objects will 108 /// outlive it, so it doesn't take ownership of either of them. 109 Lexer::Lexer(FileID FID, const llvm::MemoryBuffer *InputFile, Preprocessor &PP) 110 : PreprocessorLexer(&PP, FID), 111 FileLoc(PP.getSourceManager().getLocForStartOfFile(FID)), 112 LangOpts(PP.getLangOpts()) { 113 114 InitLexer(InputFile->getBufferStart(), InputFile->getBufferStart(), 115 InputFile->getBufferEnd()); 116 117 resetExtendedTokenMode(); 118 } 119 120 void Lexer::resetExtendedTokenMode() { 121 assert(PP && "Cannot reset token mode without a preprocessor"); 122 if (LangOpts.TraditionalCPP) 123 SetKeepWhitespaceMode(true); 124 else 125 SetCommentRetentionState(PP->getCommentRetentionState()); 126 } 127 128 /// Lexer constructor - Create a new raw lexer object. This object is only 129 /// suitable for calls to 'LexFromRawLexer'. This lexer assumes that the text 130 /// range will outlive it, so it doesn't take ownership of it. 131 Lexer::Lexer(SourceLocation fileloc, const LangOptions &langOpts, 132 const char *BufStart, const char *BufPtr, const char *BufEnd) 133 : FileLoc(fileloc), LangOpts(langOpts) { 134 135 InitLexer(BufStart, BufPtr, BufEnd); 136 137 // We *are* in raw mode. 138 LexingRawMode = true; 139 } 140 141 /// Lexer constructor - Create a new raw lexer object. This object is only 142 /// suitable for calls to 'LexFromRawLexer'. This lexer assumes that the text 143 /// range will outlive it, so it doesn't take ownership of it. 144 Lexer::Lexer(FileID FID, const llvm::MemoryBuffer *FromFile, 145 const SourceManager &SM, const LangOptions &langOpts) 146 : Lexer(SM.getLocForStartOfFile(FID), langOpts, FromFile->getBufferStart(), 147 FromFile->getBufferStart(), FromFile->getBufferEnd()) {} 148 149 /// Create_PragmaLexer: Lexer constructor - Create a new lexer object for 150 /// _Pragma expansion. This has a variety of magic semantics that this method 151 /// sets up. It returns a new'd Lexer that must be delete'd when done. 152 /// 153 /// On entrance to this routine, TokStartLoc is a macro location which has a 154 /// spelling loc that indicates the bytes to be lexed for the token and an 155 /// expansion location that indicates where all lexed tokens should be 156 /// "expanded from". 157 /// 158 /// TODO: It would really be nice to make _Pragma just be a wrapper around a 159 /// normal lexer that remaps tokens as they fly by. This would require making 160 /// Preprocessor::Lex virtual. Given that, we could just dump in a magic lexer 161 /// interface that could handle this stuff. This would pull GetMappedTokenLoc 162 /// out of the critical path of the lexer! 163 /// 164 Lexer *Lexer::Create_PragmaLexer(SourceLocation SpellingLoc, 165 SourceLocation ExpansionLocStart, 166 SourceLocation ExpansionLocEnd, 167 unsigned TokLen, Preprocessor &PP) { 168 SourceManager &SM = PP.getSourceManager(); 169 170 // Create the lexer as if we were going to lex the file normally. 171 FileID SpellingFID = SM.getFileID(SpellingLoc); 172 const llvm::MemoryBuffer *InputFile = SM.getBuffer(SpellingFID); 173 Lexer *L = new Lexer(SpellingFID, InputFile, PP); 174 175 // Now that the lexer is created, change the start/end locations so that we 176 // just lex the subsection of the file that we want. This is lexing from a 177 // scratch buffer. 178 const char *StrData = SM.getCharacterData(SpellingLoc); 179 180 L->BufferPtr = StrData; 181 L->BufferEnd = StrData+TokLen; 182 assert(L->BufferEnd[0] == 0 && "Buffer is not nul terminated!"); 183 184 // Set the SourceLocation with the remapping information. This ensures that 185 // GetMappedTokenLoc will remap the tokens as they are lexed. 186 L->FileLoc = SM.createExpansionLoc(SM.getLocForStartOfFile(SpellingFID), 187 ExpansionLocStart, 188 ExpansionLocEnd, TokLen); 189 190 // Ensure that the lexer thinks it is inside a directive, so that end \n will 191 // return an EOD token. 192 L->ParsingPreprocessorDirective = true; 193 194 // This lexer really is for _Pragma. 195 L->Is_PragmaLexer = true; 196 return L; 197 } 198 199 200 /// Stringify - Convert the specified string into a C string, with surrounding 201 /// ""'s, and with escaped \ and " characters. 202 std::string Lexer::Stringify(StringRef Str, bool Charify) { 203 std::string Result = Str; 204 char Quote = Charify ? '\'' : '"'; 205 for (unsigned i = 0, e = Result.size(); i != e; ++i) { 206 if (Result[i] == '\\' || Result[i] == Quote) { 207 Result.insert(Result.begin()+i, '\\'); 208 ++i; ++e; 209 } 210 } 211 return Result; 212 } 213 214 /// Stringify - Convert the specified string into a C string by escaping '\' 215 /// and " characters. This does not add surrounding ""'s to the string. 216 void Lexer::Stringify(SmallVectorImpl<char> &Str) { 217 for (unsigned i = 0, e = Str.size(); i != e; ++i) { 218 if (Str[i] == '\\' || Str[i] == '"') { 219 Str.insert(Str.begin()+i, '\\'); 220 ++i; ++e; 221 } 222 } 223 } 224 225 //===----------------------------------------------------------------------===// 226 // Token Spelling 227 //===----------------------------------------------------------------------===// 228 229 /// \brief Slow case of getSpelling. Extract the characters comprising the 230 /// spelling of this token from the provided input buffer. 231 static size_t getSpellingSlow(const Token &Tok, const char *BufPtr, 232 const LangOptions &LangOpts, char *Spelling) { 233 assert(Tok.needsCleaning() && "getSpellingSlow called on simple token"); 234 235 size_t Length = 0; 236 const char *BufEnd = BufPtr + Tok.getLength(); 237 238 if (tok::isStringLiteral(Tok.getKind())) { 239 // Munch the encoding-prefix and opening double-quote. 240 while (BufPtr < BufEnd) { 241 unsigned Size; 242 Spelling[Length++] = Lexer::getCharAndSizeNoWarn(BufPtr, Size, LangOpts); 243 BufPtr += Size; 244 245 if (Spelling[Length - 1] == '"') 246 break; 247 } 248 249 // Raw string literals need special handling; trigraph expansion and line 250 // splicing do not occur within their d-char-sequence nor within their 251 // r-char-sequence. 252 if (Length >= 2 && 253 Spelling[Length - 2] == 'R' && Spelling[Length - 1] == '"') { 254 // Search backwards from the end of the token to find the matching closing 255 // quote. 256 const char *RawEnd = BufEnd; 257 do --RawEnd; while (*RawEnd != '"'); 258 size_t RawLength = RawEnd - BufPtr + 1; 259 260 // Everything between the quotes is included verbatim in the spelling. 261 memcpy(Spelling + Length, BufPtr, RawLength); 262 Length += RawLength; 263 BufPtr += RawLength; 264 265 // The rest of the token is lexed normally. 266 } 267 } 268 269 while (BufPtr < BufEnd) { 270 unsigned Size; 271 Spelling[Length++] = Lexer::getCharAndSizeNoWarn(BufPtr, Size, LangOpts); 272 BufPtr += Size; 273 } 274 275 assert(Length < Tok.getLength() && 276 "NeedsCleaning flag set on token that didn't need cleaning!"); 277 return Length; 278 } 279 280 /// getSpelling() - Return the 'spelling' of this token. The spelling of a 281 /// token are the characters used to represent the token in the source file 282 /// after trigraph expansion and escaped-newline folding. In particular, this 283 /// wants to get the true, uncanonicalized, spelling of things like digraphs 284 /// UCNs, etc. 285 StringRef Lexer::getSpelling(SourceLocation loc, 286 SmallVectorImpl<char> &buffer, 287 const SourceManager &SM, 288 const LangOptions &options, 289 bool *invalid) { 290 // Break down the source location. 291 std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(loc); 292 293 // Try to the load the file buffer. 294 bool invalidTemp = false; 295 StringRef file = SM.getBufferData(locInfo.first, &invalidTemp); 296 if (invalidTemp) { 297 if (invalid) *invalid = true; 298 return StringRef(); 299 } 300 301 const char *tokenBegin = file.data() + locInfo.second; 302 303 // Lex from the start of the given location. 304 Lexer lexer(SM.getLocForStartOfFile(locInfo.first), options, 305 file.begin(), tokenBegin, file.end()); 306 Token token; 307 lexer.LexFromRawLexer(token); 308 309 unsigned length = token.getLength(); 310 311 // Common case: no need for cleaning. 312 if (!token.needsCleaning()) 313 return StringRef(tokenBegin, length); 314 315 // Hard case, we need to relex the characters into the string. 316 buffer.resize(length); 317 buffer.resize(getSpellingSlow(token, tokenBegin, options, buffer.data())); 318 return StringRef(buffer.data(), buffer.size()); 319 } 320 321 /// getSpelling() - Return the 'spelling' of this token. The spelling of a 322 /// token are the characters used to represent the token in the source file 323 /// after trigraph expansion and escaped-newline folding. In particular, this 324 /// wants to get the true, uncanonicalized, spelling of things like digraphs 325 /// UCNs, etc. 326 std::string Lexer::getSpelling(const Token &Tok, const SourceManager &SourceMgr, 327 const LangOptions &LangOpts, bool *Invalid) { 328 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!"); 329 330 bool CharDataInvalid = false; 331 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation(), 332 &CharDataInvalid); 333 if (Invalid) 334 *Invalid = CharDataInvalid; 335 if (CharDataInvalid) 336 return std::string(); 337 338 // If this token contains nothing interesting, return it directly. 339 if (!Tok.needsCleaning()) 340 return std::string(TokStart, TokStart + Tok.getLength()); 341 342 std::string Result; 343 Result.resize(Tok.getLength()); 344 Result.resize(getSpellingSlow(Tok, TokStart, LangOpts, &*Result.begin())); 345 return Result; 346 } 347 348 /// getSpelling - This method is used to get the spelling of a token into a 349 /// preallocated buffer, instead of as an std::string. The caller is required 350 /// to allocate enough space for the token, which is guaranteed to be at least 351 /// Tok.getLength() bytes long. The actual length of the token is returned. 352 /// 353 /// Note that this method may do two possible things: it may either fill in 354 /// the buffer specified with characters, or it may *change the input pointer* 355 /// to point to a constant buffer with the data already in it (avoiding a 356 /// copy). The caller is not allowed to modify the returned buffer pointer 357 /// if an internal buffer is returned. 358 unsigned Lexer::getSpelling(const Token &Tok, const char *&Buffer, 359 const SourceManager &SourceMgr, 360 const LangOptions &LangOpts, bool *Invalid) { 361 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!"); 362 363 const char *TokStart = nullptr; 364 // NOTE: this has to be checked *before* testing for an IdentifierInfo. 365 if (Tok.is(tok::raw_identifier)) 366 TokStart = Tok.getRawIdentifier().data(); 367 else if (!Tok.hasUCN()) { 368 if (const IdentifierInfo *II = Tok.getIdentifierInfo()) { 369 // Just return the string from the identifier table, which is very quick. 370 Buffer = II->getNameStart(); 371 return II->getLength(); 372 } 373 } 374 375 // NOTE: this can be checked even after testing for an IdentifierInfo. 376 if (Tok.isLiteral()) 377 TokStart = Tok.getLiteralData(); 378 379 if (!TokStart) { 380 // Compute the start of the token in the input lexer buffer. 381 bool CharDataInvalid = false; 382 TokStart = SourceMgr.getCharacterData(Tok.getLocation(), &CharDataInvalid); 383 if (Invalid) 384 *Invalid = CharDataInvalid; 385 if (CharDataInvalid) { 386 Buffer = ""; 387 return 0; 388 } 389 } 390 391 // If this token contains nothing interesting, return it directly. 392 if (!Tok.needsCleaning()) { 393 Buffer = TokStart; 394 return Tok.getLength(); 395 } 396 397 // Otherwise, hard case, relex the characters into the string. 398 return getSpellingSlow(Tok, TokStart, LangOpts, const_cast<char*>(Buffer)); 399 } 400 401 402 /// MeasureTokenLength - Relex the token at the specified location and return 403 /// its length in bytes in the input file. If the token needs cleaning (e.g. 404 /// includes a trigraph or an escaped newline) then this count includes bytes 405 /// that are part of that. 406 unsigned Lexer::MeasureTokenLength(SourceLocation Loc, 407 const SourceManager &SM, 408 const LangOptions &LangOpts) { 409 Token TheTok; 410 if (getRawToken(Loc, TheTok, SM, LangOpts)) 411 return 0; 412 return TheTok.getLength(); 413 } 414 415 /// \brief Relex the token at the specified location. 416 /// \returns true if there was a failure, false on success. 417 bool Lexer::getRawToken(SourceLocation Loc, Token &Result, 418 const SourceManager &SM, 419 const LangOptions &LangOpts, 420 bool IgnoreWhiteSpace) { 421 // TODO: this could be special cased for common tokens like identifiers, ')', 422 // etc to make this faster, if it mattered. Just look at StrData[0] to handle 423 // all obviously single-char tokens. This could use 424 // Lexer::isObviouslySimpleCharacter for example to handle identifiers or 425 // something. 426 427 // If this comes from a macro expansion, we really do want the macro name, not 428 // the token this macro expanded to. 429 Loc = SM.getExpansionLoc(Loc); 430 std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 431 bool Invalid = false; 432 StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid); 433 if (Invalid) 434 return true; 435 436 const char *StrData = Buffer.data()+LocInfo.second; 437 438 if (!IgnoreWhiteSpace && isWhitespace(StrData[0])) 439 return true; 440 441 // Create a lexer starting at the beginning of this token. 442 Lexer TheLexer(SM.getLocForStartOfFile(LocInfo.first), LangOpts, 443 Buffer.begin(), StrData, Buffer.end()); 444 TheLexer.SetCommentRetentionState(true); 445 TheLexer.LexFromRawLexer(Result); 446 return false; 447 } 448 449 static SourceLocation getBeginningOfFileToken(SourceLocation Loc, 450 const SourceManager &SM, 451 const LangOptions &LangOpts) { 452 assert(Loc.isFileID()); 453 std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 454 if (LocInfo.first.isInvalid()) 455 return Loc; 456 457 bool Invalid = false; 458 StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid); 459 if (Invalid) 460 return Loc; 461 462 // Back up from the current location until we hit the beginning of a line 463 // (or the buffer). We'll relex from that point. 464 const char *BufStart = Buffer.data(); 465 if (LocInfo.second >= Buffer.size()) 466 return Loc; 467 468 const char *StrData = BufStart+LocInfo.second; 469 if (StrData[0] == '\n' || StrData[0] == '\r') 470 return Loc; 471 472 const char *LexStart = StrData; 473 while (LexStart != BufStart) { 474 if (LexStart[0] == '\n' || LexStart[0] == '\r') { 475 ++LexStart; 476 break; 477 } 478 479 --LexStart; 480 } 481 482 // Create a lexer starting at the beginning of this token. 483 SourceLocation LexerStartLoc = Loc.getLocWithOffset(-LocInfo.second); 484 Lexer TheLexer(LexerStartLoc, LangOpts, BufStart, LexStart, Buffer.end()); 485 TheLexer.SetCommentRetentionState(true); 486 487 // Lex tokens until we find the token that contains the source location. 488 Token TheTok; 489 do { 490 TheLexer.LexFromRawLexer(TheTok); 491 492 if (TheLexer.getBufferLocation() > StrData) { 493 // Lexing this token has taken the lexer past the source location we're 494 // looking for. If the current token encompasses our source location, 495 // return the beginning of that token. 496 if (TheLexer.getBufferLocation() - TheTok.getLength() <= StrData) 497 return TheTok.getLocation(); 498 499 // We ended up skipping over the source location entirely, which means 500 // that it points into whitespace. We're done here. 501 break; 502 } 503 } while (TheTok.getKind() != tok::eof); 504 505 // We've passed our source location; just return the original source location. 506 return Loc; 507 } 508 509 SourceLocation Lexer::GetBeginningOfToken(SourceLocation Loc, 510 const SourceManager &SM, 511 const LangOptions &LangOpts) { 512 if (Loc.isFileID()) 513 return getBeginningOfFileToken(Loc, SM, LangOpts); 514 515 if (!SM.isMacroArgExpansion(Loc)) 516 return Loc; 517 518 SourceLocation FileLoc = SM.getSpellingLoc(Loc); 519 SourceLocation BeginFileLoc = getBeginningOfFileToken(FileLoc, SM, LangOpts); 520 std::pair<FileID, unsigned> FileLocInfo = SM.getDecomposedLoc(FileLoc); 521 std::pair<FileID, unsigned> BeginFileLocInfo 522 = SM.getDecomposedLoc(BeginFileLoc); 523 assert(FileLocInfo.first == BeginFileLocInfo.first && 524 FileLocInfo.second >= BeginFileLocInfo.second); 525 return Loc.getLocWithOffset(BeginFileLocInfo.second - FileLocInfo.second); 526 } 527 528 namespace { 529 enum PreambleDirectiveKind { 530 PDK_Skipped, 531 PDK_StartIf, 532 PDK_EndIf, 533 PDK_Unknown 534 }; 535 } 536 537 std::pair<unsigned, bool> Lexer::ComputePreamble(StringRef Buffer, 538 const LangOptions &LangOpts, 539 unsigned MaxLines) { 540 // Create a lexer starting at the beginning of the file. Note that we use a 541 // "fake" file source location at offset 1 so that the lexer will track our 542 // position within the file. 543 const unsigned StartOffset = 1; 544 SourceLocation FileLoc = SourceLocation::getFromRawEncoding(StartOffset); 545 Lexer TheLexer(FileLoc, LangOpts, Buffer.begin(), Buffer.begin(), 546 Buffer.end()); 547 TheLexer.SetCommentRetentionState(true); 548 549 // StartLoc will differ from FileLoc if there is a BOM that was skipped. 550 SourceLocation StartLoc = TheLexer.getSourceLocation(); 551 552 bool InPreprocessorDirective = false; 553 Token TheTok; 554 Token IfStartTok; 555 unsigned IfCount = 0; 556 SourceLocation ActiveCommentLoc; 557 558 unsigned MaxLineOffset = 0; 559 if (MaxLines) { 560 const char *CurPtr = Buffer.begin(); 561 unsigned CurLine = 0; 562 while (CurPtr != Buffer.end()) { 563 char ch = *CurPtr++; 564 if (ch == '\n') { 565 ++CurLine; 566 if (CurLine == MaxLines) 567 break; 568 } 569 } 570 if (CurPtr != Buffer.end()) 571 MaxLineOffset = CurPtr - Buffer.begin(); 572 } 573 574 do { 575 TheLexer.LexFromRawLexer(TheTok); 576 577 if (InPreprocessorDirective) { 578 // If we've hit the end of the file, we're done. 579 if (TheTok.getKind() == tok::eof) { 580 break; 581 } 582 583 // If we haven't hit the end of the preprocessor directive, skip this 584 // token. 585 if (!TheTok.isAtStartOfLine()) 586 continue; 587 588 // We've passed the end of the preprocessor directive, and will look 589 // at this token again below. 590 InPreprocessorDirective = false; 591 } 592 593 // Keep track of the # of lines in the preamble. 594 if (TheTok.isAtStartOfLine()) { 595 unsigned TokOffset = TheTok.getLocation().getRawEncoding() - StartOffset; 596 597 // If we were asked to limit the number of lines in the preamble, 598 // and we're about to exceed that limit, we're done. 599 if (MaxLineOffset && TokOffset >= MaxLineOffset) 600 break; 601 } 602 603 // Comments are okay; skip over them. 604 if (TheTok.getKind() == tok::comment) { 605 if (ActiveCommentLoc.isInvalid()) 606 ActiveCommentLoc = TheTok.getLocation(); 607 continue; 608 } 609 610 if (TheTok.isAtStartOfLine() && TheTok.getKind() == tok::hash) { 611 // This is the start of a preprocessor directive. 612 Token HashTok = TheTok; 613 InPreprocessorDirective = true; 614 ActiveCommentLoc = SourceLocation(); 615 616 // Figure out which directive this is. Since we're lexing raw tokens, 617 // we don't have an identifier table available. Instead, just look at 618 // the raw identifier to recognize and categorize preprocessor directives. 619 TheLexer.LexFromRawLexer(TheTok); 620 if (TheTok.getKind() == tok::raw_identifier && !TheTok.needsCleaning()) { 621 StringRef Keyword = TheTok.getRawIdentifier(); 622 PreambleDirectiveKind PDK 623 = llvm::StringSwitch<PreambleDirectiveKind>(Keyword) 624 .Case("include", PDK_Skipped) 625 .Case("__include_macros", PDK_Skipped) 626 .Case("define", PDK_Skipped) 627 .Case("undef", PDK_Skipped) 628 .Case("line", PDK_Skipped) 629 .Case("error", PDK_Skipped) 630 .Case("pragma", PDK_Skipped) 631 .Case("import", PDK_Skipped) 632 .Case("include_next", PDK_Skipped) 633 .Case("warning", PDK_Skipped) 634 .Case("ident", PDK_Skipped) 635 .Case("sccs", PDK_Skipped) 636 .Case("assert", PDK_Skipped) 637 .Case("unassert", PDK_Skipped) 638 .Case("if", PDK_StartIf) 639 .Case("ifdef", PDK_StartIf) 640 .Case("ifndef", PDK_StartIf) 641 .Case("elif", PDK_Skipped) 642 .Case("else", PDK_Skipped) 643 .Case("endif", PDK_EndIf) 644 .Default(PDK_Unknown); 645 646 switch (PDK) { 647 case PDK_Skipped: 648 continue; 649 650 case PDK_StartIf: 651 if (IfCount == 0) 652 IfStartTok = HashTok; 653 654 ++IfCount; 655 continue; 656 657 case PDK_EndIf: 658 // Mismatched #endif. The preamble ends here. 659 if (IfCount == 0) 660 break; 661 662 --IfCount; 663 continue; 664 665 case PDK_Unknown: 666 // We don't know what this directive is; stop at the '#'. 667 break; 668 } 669 } 670 671 // We only end up here if we didn't recognize the preprocessor 672 // directive or it was one that can't occur in the preamble at this 673 // point. Roll back the current token to the location of the '#'. 674 InPreprocessorDirective = false; 675 TheTok = HashTok; 676 } 677 678 // We hit a token that we don't recognize as being in the 679 // "preprocessing only" part of the file, so we're no longer in 680 // the preamble. 681 break; 682 } while (true); 683 684 SourceLocation End; 685 if (IfCount) 686 End = IfStartTok.getLocation(); 687 else if (ActiveCommentLoc.isValid()) 688 End = ActiveCommentLoc; // don't truncate a decl comment. 689 else 690 End = TheTok.getLocation(); 691 692 return std::make_pair(End.getRawEncoding() - StartLoc.getRawEncoding(), 693 IfCount? IfStartTok.isAtStartOfLine() 694 : TheTok.isAtStartOfLine()); 695 } 696 697 698 /// AdvanceToTokenCharacter - Given a location that specifies the start of a 699 /// token, return a new location that specifies a character within the token. 700 SourceLocation Lexer::AdvanceToTokenCharacter(SourceLocation TokStart, 701 unsigned CharNo, 702 const SourceManager &SM, 703 const LangOptions &LangOpts) { 704 // Figure out how many physical characters away the specified expansion 705 // character is. This needs to take into consideration newlines and 706 // trigraphs. 707 bool Invalid = false; 708 const char *TokPtr = SM.getCharacterData(TokStart, &Invalid); 709 710 // If they request the first char of the token, we're trivially done. 711 if (Invalid || (CharNo == 0 && Lexer::isObviouslySimpleCharacter(*TokPtr))) 712 return TokStart; 713 714 unsigned PhysOffset = 0; 715 716 // The usual case is that tokens don't contain anything interesting. Skip 717 // over the uninteresting characters. If a token only consists of simple 718 // chars, this method is extremely fast. 719 while (Lexer::isObviouslySimpleCharacter(*TokPtr)) { 720 if (CharNo == 0) 721 return TokStart.getLocWithOffset(PhysOffset); 722 ++TokPtr, --CharNo, ++PhysOffset; 723 } 724 725 // If we have a character that may be a trigraph or escaped newline, use a 726 // lexer to parse it correctly. 727 for (; CharNo; --CharNo) { 728 unsigned Size; 729 Lexer::getCharAndSizeNoWarn(TokPtr, Size, LangOpts); 730 TokPtr += Size; 731 PhysOffset += Size; 732 } 733 734 // Final detail: if we end up on an escaped newline, we want to return the 735 // location of the actual byte of the token. For example foo\<newline>bar 736 // advanced by 3 should return the location of b, not of \\. One compounding 737 // detail of this is that the escape may be made by a trigraph. 738 if (!Lexer::isObviouslySimpleCharacter(*TokPtr)) 739 PhysOffset += Lexer::SkipEscapedNewLines(TokPtr)-TokPtr; 740 741 return TokStart.getLocWithOffset(PhysOffset); 742 } 743 744 /// \brief Computes the source location just past the end of the 745 /// token at this source location. 746 /// 747 /// This routine can be used to produce a source location that 748 /// points just past the end of the token referenced by \p Loc, and 749 /// is generally used when a diagnostic needs to point just after a 750 /// token where it expected something different that it received. If 751 /// the returned source location would not be meaningful (e.g., if 752 /// it points into a macro), this routine returns an invalid 753 /// source location. 754 /// 755 /// \param Offset an offset from the end of the token, where the source 756 /// location should refer to. The default offset (0) produces a source 757 /// location pointing just past the end of the token; an offset of 1 produces 758 /// a source location pointing to the last character in the token, etc. 759 SourceLocation Lexer::getLocForEndOfToken(SourceLocation Loc, unsigned Offset, 760 const SourceManager &SM, 761 const LangOptions &LangOpts) { 762 if (Loc.isInvalid()) 763 return SourceLocation(); 764 765 if (Loc.isMacroID()) { 766 if (Offset > 0 || !isAtEndOfMacroExpansion(Loc, SM, LangOpts, &Loc)) 767 return SourceLocation(); // Points inside the macro expansion. 768 } 769 770 unsigned Len = Lexer::MeasureTokenLength(Loc, SM, LangOpts); 771 if (Len > Offset) 772 Len = Len - Offset; 773 else 774 return Loc; 775 776 return Loc.getLocWithOffset(Len); 777 } 778 779 /// \brief Returns true if the given MacroID location points at the first 780 /// token of the macro expansion. 781 bool Lexer::isAtStartOfMacroExpansion(SourceLocation loc, 782 const SourceManager &SM, 783 const LangOptions &LangOpts, 784 SourceLocation *MacroBegin) { 785 assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc"); 786 787 SourceLocation expansionLoc; 788 if (!SM.isAtStartOfImmediateMacroExpansion(loc, &expansionLoc)) 789 return false; 790 791 if (expansionLoc.isFileID()) { 792 // No other macro expansions, this is the first. 793 if (MacroBegin) 794 *MacroBegin = expansionLoc; 795 return true; 796 } 797 798 return isAtStartOfMacroExpansion(expansionLoc, SM, LangOpts, MacroBegin); 799 } 800 801 /// \brief Returns true if the given MacroID location points at the last 802 /// token of the macro expansion. 803 bool Lexer::isAtEndOfMacroExpansion(SourceLocation loc, 804 const SourceManager &SM, 805 const LangOptions &LangOpts, 806 SourceLocation *MacroEnd) { 807 assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc"); 808 809 SourceLocation spellLoc = SM.getSpellingLoc(loc); 810 unsigned tokLen = MeasureTokenLength(spellLoc, SM, LangOpts); 811 if (tokLen == 0) 812 return false; 813 814 SourceLocation afterLoc = loc.getLocWithOffset(tokLen); 815 SourceLocation expansionLoc; 816 if (!SM.isAtEndOfImmediateMacroExpansion(afterLoc, &expansionLoc)) 817 return false; 818 819 if (expansionLoc.isFileID()) { 820 // No other macro expansions. 821 if (MacroEnd) 822 *MacroEnd = expansionLoc; 823 return true; 824 } 825 826 return isAtEndOfMacroExpansion(expansionLoc, SM, LangOpts, MacroEnd); 827 } 828 829 static CharSourceRange makeRangeFromFileLocs(CharSourceRange Range, 830 const SourceManager &SM, 831 const LangOptions &LangOpts) { 832 SourceLocation Begin = Range.getBegin(); 833 SourceLocation End = Range.getEnd(); 834 assert(Begin.isFileID() && End.isFileID()); 835 if (Range.isTokenRange()) { 836 End = Lexer::getLocForEndOfToken(End, 0, SM,LangOpts); 837 if (End.isInvalid()) 838 return CharSourceRange(); 839 } 840 841 // Break down the source locations. 842 FileID FID; 843 unsigned BeginOffs; 844 std::tie(FID, BeginOffs) = SM.getDecomposedLoc(Begin); 845 if (FID.isInvalid()) 846 return CharSourceRange(); 847 848 unsigned EndOffs; 849 if (!SM.isInFileID(End, FID, &EndOffs) || 850 BeginOffs > EndOffs) 851 return CharSourceRange(); 852 853 return CharSourceRange::getCharRange(Begin, End); 854 } 855 856 CharSourceRange Lexer::makeFileCharRange(CharSourceRange Range, 857 const SourceManager &SM, 858 const LangOptions &LangOpts) { 859 SourceLocation Begin = Range.getBegin(); 860 SourceLocation End = Range.getEnd(); 861 if (Begin.isInvalid() || End.isInvalid()) 862 return CharSourceRange(); 863 864 if (Begin.isFileID() && End.isFileID()) 865 return makeRangeFromFileLocs(Range, SM, LangOpts); 866 867 if (Begin.isMacroID() && End.isFileID()) { 868 if (!isAtStartOfMacroExpansion(Begin, SM, LangOpts, &Begin)) 869 return CharSourceRange(); 870 Range.setBegin(Begin); 871 return makeRangeFromFileLocs(Range, SM, LangOpts); 872 } 873 874 if (Begin.isFileID() && End.isMacroID()) { 875 if ((Range.isTokenRange() && !isAtEndOfMacroExpansion(End, SM, LangOpts, 876 &End)) || 877 (Range.isCharRange() && !isAtStartOfMacroExpansion(End, SM, LangOpts, 878 &End))) 879 return CharSourceRange(); 880 Range.setEnd(End); 881 return makeRangeFromFileLocs(Range, SM, LangOpts); 882 } 883 884 assert(Begin.isMacroID() && End.isMacroID()); 885 SourceLocation MacroBegin, MacroEnd; 886 if (isAtStartOfMacroExpansion(Begin, SM, LangOpts, &MacroBegin) && 887 ((Range.isTokenRange() && isAtEndOfMacroExpansion(End, SM, LangOpts, 888 &MacroEnd)) || 889 (Range.isCharRange() && isAtStartOfMacroExpansion(End, SM, LangOpts, 890 &MacroEnd)))) { 891 Range.setBegin(MacroBegin); 892 Range.setEnd(MacroEnd); 893 return makeRangeFromFileLocs(Range, SM, LangOpts); 894 } 895 896 bool Invalid = false; 897 const SrcMgr::SLocEntry &BeginEntry = SM.getSLocEntry(SM.getFileID(Begin), 898 &Invalid); 899 if (Invalid) 900 return CharSourceRange(); 901 902 if (BeginEntry.getExpansion().isMacroArgExpansion()) { 903 const SrcMgr::SLocEntry &EndEntry = SM.getSLocEntry(SM.getFileID(End), 904 &Invalid); 905 if (Invalid) 906 return CharSourceRange(); 907 908 if (EndEntry.getExpansion().isMacroArgExpansion() && 909 BeginEntry.getExpansion().getExpansionLocStart() == 910 EndEntry.getExpansion().getExpansionLocStart()) { 911 Range.setBegin(SM.getImmediateSpellingLoc(Begin)); 912 Range.setEnd(SM.getImmediateSpellingLoc(End)); 913 return makeFileCharRange(Range, SM, LangOpts); 914 } 915 } 916 917 return CharSourceRange(); 918 } 919 920 StringRef Lexer::getSourceText(CharSourceRange Range, 921 const SourceManager &SM, 922 const LangOptions &LangOpts, 923 bool *Invalid) { 924 Range = makeFileCharRange(Range, SM, LangOpts); 925 if (Range.isInvalid()) { 926 if (Invalid) *Invalid = true; 927 return StringRef(); 928 } 929 930 // Break down the source location. 931 std::pair<FileID, unsigned> beginInfo = SM.getDecomposedLoc(Range.getBegin()); 932 if (beginInfo.first.isInvalid()) { 933 if (Invalid) *Invalid = true; 934 return StringRef(); 935 } 936 937 unsigned EndOffs; 938 if (!SM.isInFileID(Range.getEnd(), beginInfo.first, &EndOffs) || 939 beginInfo.second > EndOffs) { 940 if (Invalid) *Invalid = true; 941 return StringRef(); 942 } 943 944 // Try to the load the file buffer. 945 bool invalidTemp = false; 946 StringRef file = SM.getBufferData(beginInfo.first, &invalidTemp); 947 if (invalidTemp) { 948 if (Invalid) *Invalid = true; 949 return StringRef(); 950 } 951 952 if (Invalid) *Invalid = false; 953 return file.substr(beginInfo.second, EndOffs - beginInfo.second); 954 } 955 956 StringRef Lexer::getImmediateMacroName(SourceLocation Loc, 957 const SourceManager &SM, 958 const LangOptions &LangOpts) { 959 assert(Loc.isMacroID() && "Only reasonble to call this on macros"); 960 961 // Find the location of the immediate macro expansion. 962 while (1) { 963 FileID FID = SM.getFileID(Loc); 964 const SrcMgr::SLocEntry *E = &SM.getSLocEntry(FID); 965 const SrcMgr::ExpansionInfo &Expansion = E->getExpansion(); 966 Loc = Expansion.getExpansionLocStart(); 967 if (!Expansion.isMacroArgExpansion()) 968 break; 969 970 // For macro arguments we need to check that the argument did not come 971 // from an inner macro, e.g: "MAC1( MAC2(foo) )" 972 973 // Loc points to the argument id of the macro definition, move to the 974 // macro expansion. 975 Loc = SM.getImmediateExpansionRange(Loc).first; 976 SourceLocation SpellLoc = Expansion.getSpellingLoc(); 977 if (SpellLoc.isFileID()) 978 break; // No inner macro. 979 980 // If spelling location resides in the same FileID as macro expansion 981 // location, it means there is no inner macro. 982 FileID MacroFID = SM.getFileID(Loc); 983 if (SM.isInFileID(SpellLoc, MacroFID)) 984 break; 985 986 // Argument came from inner macro. 987 Loc = SpellLoc; 988 } 989 990 // Find the spelling location of the start of the non-argument expansion 991 // range. This is where the macro name was spelled in order to begin 992 // expanding this macro. 993 Loc = SM.getSpellingLoc(Loc); 994 995 // Dig out the buffer where the macro name was spelled and the extents of the 996 // name so that we can render it into the expansion note. 997 std::pair<FileID, unsigned> ExpansionInfo = SM.getDecomposedLoc(Loc); 998 unsigned MacroTokenLength = Lexer::MeasureTokenLength(Loc, SM, LangOpts); 999 StringRef ExpansionBuffer = SM.getBufferData(ExpansionInfo.first); 1000 return ExpansionBuffer.substr(ExpansionInfo.second, MacroTokenLength); 1001 } 1002 1003 StringRef Lexer::getImmediateMacroNameForDiagnostics( 1004 SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts) { 1005 assert(Loc.isMacroID() && "Only reasonble to call this on macros"); 1006 // Walk past macro argument expanions. 1007 while (SM.isMacroArgExpansion(Loc)) 1008 Loc = SM.getImmediateExpansionRange(Loc).first; 1009 1010 // If the macro's spelling has no FileID, then it's actually a token paste 1011 // or stringization (or similar) and not a macro at all. 1012 if (!SM.getFileEntryForID(SM.getFileID(SM.getSpellingLoc(Loc)))) 1013 return StringRef(); 1014 1015 // Find the spelling location of the start of the non-argument expansion 1016 // range. This is where the macro name was spelled in order to begin 1017 // expanding this macro. 1018 Loc = SM.getSpellingLoc(SM.getImmediateExpansionRange(Loc).first); 1019 1020 // Dig out the buffer where the macro name was spelled and the extents of the 1021 // name so that we can render it into the expansion note. 1022 std::pair<FileID, unsigned> ExpansionInfo = SM.getDecomposedLoc(Loc); 1023 unsigned MacroTokenLength = Lexer::MeasureTokenLength(Loc, SM, LangOpts); 1024 StringRef ExpansionBuffer = SM.getBufferData(ExpansionInfo.first); 1025 return ExpansionBuffer.substr(ExpansionInfo.second, MacroTokenLength); 1026 } 1027 1028 bool Lexer::isIdentifierBodyChar(char c, const LangOptions &LangOpts) { 1029 return isIdentifierBody(c, LangOpts.DollarIdents); 1030 } 1031 1032 1033 //===----------------------------------------------------------------------===// 1034 // Diagnostics forwarding code. 1035 //===----------------------------------------------------------------------===// 1036 1037 /// GetMappedTokenLoc - If lexing out of a 'mapped buffer', where we pretend the 1038 /// lexer buffer was all expanded at a single point, perform the mapping. 1039 /// This is currently only used for _Pragma implementation, so it is the slow 1040 /// path of the hot getSourceLocation method. Do not allow it to be inlined. 1041 static LLVM_ATTRIBUTE_NOINLINE SourceLocation GetMappedTokenLoc( 1042 Preprocessor &PP, SourceLocation FileLoc, unsigned CharNo, unsigned TokLen); 1043 static SourceLocation GetMappedTokenLoc(Preprocessor &PP, 1044 SourceLocation FileLoc, 1045 unsigned CharNo, unsigned TokLen) { 1046 assert(FileLoc.isMacroID() && "Must be a macro expansion"); 1047 1048 // Otherwise, we're lexing "mapped tokens". This is used for things like 1049 // _Pragma handling. Combine the expansion location of FileLoc with the 1050 // spelling location. 1051 SourceManager &SM = PP.getSourceManager(); 1052 1053 // Create a new SLoc which is expanded from Expansion(FileLoc) but whose 1054 // characters come from spelling(FileLoc)+Offset. 1055 SourceLocation SpellingLoc = SM.getSpellingLoc(FileLoc); 1056 SpellingLoc = SpellingLoc.getLocWithOffset(CharNo); 1057 1058 // Figure out the expansion loc range, which is the range covered by the 1059 // original _Pragma(...) sequence. 1060 std::pair<SourceLocation,SourceLocation> II = 1061 SM.getImmediateExpansionRange(FileLoc); 1062 1063 return SM.createExpansionLoc(SpellingLoc, II.first, II.second, TokLen); 1064 } 1065 1066 /// getSourceLocation - Return a source location identifier for the specified 1067 /// offset in the current file. 1068 SourceLocation Lexer::getSourceLocation(const char *Loc, 1069 unsigned TokLen) const { 1070 assert(Loc >= BufferStart && Loc <= BufferEnd && 1071 "Location out of range for this buffer!"); 1072 1073 // In the normal case, we're just lexing from a simple file buffer, return 1074 // the file id from FileLoc with the offset specified. 1075 unsigned CharNo = Loc-BufferStart; 1076 if (FileLoc.isFileID()) 1077 return FileLoc.getLocWithOffset(CharNo); 1078 1079 // Otherwise, this is the _Pragma lexer case, which pretends that all of the 1080 // tokens are lexed from where the _Pragma was defined. 1081 assert(PP && "This doesn't work on raw lexers"); 1082 return GetMappedTokenLoc(*PP, FileLoc, CharNo, TokLen); 1083 } 1084 1085 /// Diag - Forwarding function for diagnostics. This translate a source 1086 /// position in the current buffer into a SourceLocation object for rendering. 1087 DiagnosticBuilder Lexer::Diag(const char *Loc, unsigned DiagID) const { 1088 return PP->Diag(getSourceLocation(Loc), DiagID); 1089 } 1090 1091 //===----------------------------------------------------------------------===// 1092 // Trigraph and Escaped Newline Handling Code. 1093 //===----------------------------------------------------------------------===// 1094 1095 /// GetTrigraphCharForLetter - Given a character that occurs after a ?? pair, 1096 /// return the decoded trigraph letter it corresponds to, or '\0' if nothing. 1097 static char GetTrigraphCharForLetter(char Letter) { 1098 switch (Letter) { 1099 default: return 0; 1100 case '=': return '#'; 1101 case ')': return ']'; 1102 case '(': return '['; 1103 case '!': return '|'; 1104 case '\'': return '^'; 1105 case '>': return '}'; 1106 case '/': return '\\'; 1107 case '<': return '{'; 1108 case '-': return '~'; 1109 } 1110 } 1111 1112 /// DecodeTrigraphChar - If the specified character is a legal trigraph when 1113 /// prefixed with ??, emit a trigraph warning. If trigraphs are enabled, 1114 /// return the result character. Finally, emit a warning about trigraph use 1115 /// whether trigraphs are enabled or not. 1116 static char DecodeTrigraphChar(const char *CP, Lexer *L) { 1117 char Res = GetTrigraphCharForLetter(*CP); 1118 if (!Res || !L) return Res; 1119 1120 if (!L->getLangOpts().Trigraphs) { 1121 if (!L->isLexingRawMode()) 1122 L->Diag(CP-2, diag::trigraph_ignored); 1123 return 0; 1124 } 1125 1126 if (!L->isLexingRawMode()) 1127 L->Diag(CP-2, diag::trigraph_converted) << StringRef(&Res, 1); 1128 return Res; 1129 } 1130 1131 /// getEscapedNewLineSize - Return the size of the specified escaped newline, 1132 /// or 0 if it is not an escaped newline. P[-1] is known to be a "\" or a 1133 /// trigraph equivalent on entry to this function. 1134 unsigned Lexer::getEscapedNewLineSize(const char *Ptr) { 1135 unsigned Size = 0; 1136 while (isWhitespace(Ptr[Size])) { 1137 ++Size; 1138 1139 if (Ptr[Size-1] != '\n' && Ptr[Size-1] != '\r') 1140 continue; 1141 1142 // If this is a \r\n or \n\r, skip the other half. 1143 if ((Ptr[Size] == '\r' || Ptr[Size] == '\n') && 1144 Ptr[Size-1] != Ptr[Size]) 1145 ++Size; 1146 1147 return Size; 1148 } 1149 1150 // Not an escaped newline, must be a \t or something else. 1151 return 0; 1152 } 1153 1154 /// SkipEscapedNewLines - If P points to an escaped newline (or a series of 1155 /// them), skip over them and return the first non-escaped-newline found, 1156 /// otherwise return P. 1157 const char *Lexer::SkipEscapedNewLines(const char *P) { 1158 while (1) { 1159 const char *AfterEscape; 1160 if (*P == '\\') { 1161 AfterEscape = P+1; 1162 } else if (*P == '?') { 1163 // If not a trigraph for escape, bail out. 1164 if (P[1] != '?' || P[2] != '/') 1165 return P; 1166 AfterEscape = P+3; 1167 } else { 1168 return P; 1169 } 1170 1171 unsigned NewLineSize = Lexer::getEscapedNewLineSize(AfterEscape); 1172 if (NewLineSize == 0) return P; 1173 P = AfterEscape+NewLineSize; 1174 } 1175 } 1176 1177 /// \brief Checks that the given token is the first token that occurs after the 1178 /// given location (this excludes comments and whitespace). Returns the location 1179 /// immediately after the specified token. If the token is not found or the 1180 /// location is inside a macro, the returned source location will be invalid. 1181 SourceLocation Lexer::findLocationAfterToken(SourceLocation Loc, 1182 tok::TokenKind TKind, 1183 const SourceManager &SM, 1184 const LangOptions &LangOpts, 1185 bool SkipTrailingWhitespaceAndNewLine) { 1186 if (Loc.isMacroID()) { 1187 if (!Lexer::isAtEndOfMacroExpansion(Loc, SM, LangOpts, &Loc)) 1188 return SourceLocation(); 1189 } 1190 Loc = Lexer::getLocForEndOfToken(Loc, 0, SM, LangOpts); 1191 1192 // Break down the source location. 1193 std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 1194 1195 // Try to load the file buffer. 1196 bool InvalidTemp = false; 1197 StringRef File = SM.getBufferData(LocInfo.first, &InvalidTemp); 1198 if (InvalidTemp) 1199 return SourceLocation(); 1200 1201 const char *TokenBegin = File.data() + LocInfo.second; 1202 1203 // Lex from the start of the given location. 1204 Lexer lexer(SM.getLocForStartOfFile(LocInfo.first), LangOpts, File.begin(), 1205 TokenBegin, File.end()); 1206 // Find the token. 1207 Token Tok; 1208 lexer.LexFromRawLexer(Tok); 1209 if (Tok.isNot(TKind)) 1210 return SourceLocation(); 1211 SourceLocation TokenLoc = Tok.getLocation(); 1212 1213 // Calculate how much whitespace needs to be skipped if any. 1214 unsigned NumWhitespaceChars = 0; 1215 if (SkipTrailingWhitespaceAndNewLine) { 1216 const char *TokenEnd = SM.getCharacterData(TokenLoc) + 1217 Tok.getLength(); 1218 unsigned char C = *TokenEnd; 1219 while (isHorizontalWhitespace(C)) { 1220 C = *(++TokenEnd); 1221 NumWhitespaceChars++; 1222 } 1223 1224 // Skip \r, \n, \r\n, or \n\r 1225 if (C == '\n' || C == '\r') { 1226 char PrevC = C; 1227 C = *(++TokenEnd); 1228 NumWhitespaceChars++; 1229 if ((C == '\n' || C == '\r') && C != PrevC) 1230 NumWhitespaceChars++; 1231 } 1232 } 1233 1234 return TokenLoc.getLocWithOffset(Tok.getLength() + NumWhitespaceChars); 1235 } 1236 1237 /// getCharAndSizeSlow - Peek a single 'character' from the specified buffer, 1238 /// get its size, and return it. This is tricky in several cases: 1239 /// 1. If currently at the start of a trigraph, we warn about the trigraph, 1240 /// then either return the trigraph (skipping 3 chars) or the '?', 1241 /// depending on whether trigraphs are enabled or not. 1242 /// 2. If this is an escaped newline (potentially with whitespace between 1243 /// the backslash and newline), implicitly skip the newline and return 1244 /// the char after it. 1245 /// 1246 /// This handles the slow/uncommon case of the getCharAndSize method. Here we 1247 /// know that we can accumulate into Size, and that we have already incremented 1248 /// Ptr by Size bytes. 1249 /// 1250 /// NOTE: When this method is updated, getCharAndSizeSlowNoWarn (below) should 1251 /// be updated to match. 1252 /// 1253 char Lexer::getCharAndSizeSlow(const char *Ptr, unsigned &Size, 1254 Token *Tok) { 1255 // If we have a slash, look for an escaped newline. 1256 if (Ptr[0] == '\\') { 1257 ++Size; 1258 ++Ptr; 1259 Slash: 1260 // Common case, backslash-char where the char is not whitespace. 1261 if (!isWhitespace(Ptr[0])) return '\\'; 1262 1263 // See if we have optional whitespace characters between the slash and 1264 // newline. 1265 if (unsigned EscapedNewLineSize = getEscapedNewLineSize(Ptr)) { 1266 // Remember that this token needs to be cleaned. 1267 if (Tok) Tok->setFlag(Token::NeedsCleaning); 1268 1269 // Warn if there was whitespace between the backslash and newline. 1270 if (Ptr[0] != '\n' && Ptr[0] != '\r' && Tok && !isLexingRawMode()) 1271 Diag(Ptr, diag::backslash_newline_space); 1272 1273 // Found backslash<whitespace><newline>. Parse the char after it. 1274 Size += EscapedNewLineSize; 1275 Ptr += EscapedNewLineSize; 1276 1277 // If the char that we finally got was a \n, then we must have had 1278 // something like \<newline><newline>. We don't want to consume the 1279 // second newline. 1280 if (*Ptr == '\n' || *Ptr == '\r' || *Ptr == '\0') 1281 return ' '; 1282 1283 // Use slow version to accumulate a correct size field. 1284 return getCharAndSizeSlow(Ptr, Size, Tok); 1285 } 1286 1287 // Otherwise, this is not an escaped newline, just return the slash. 1288 return '\\'; 1289 } 1290 1291 // If this is a trigraph, process it. 1292 if (Ptr[0] == '?' && Ptr[1] == '?') { 1293 // If this is actually a legal trigraph (not something like "??x"), emit 1294 // a trigraph warning. If so, and if trigraphs are enabled, return it. 1295 if (char C = DecodeTrigraphChar(Ptr+2, Tok ? this : nullptr)) { 1296 // Remember that this token needs to be cleaned. 1297 if (Tok) Tok->setFlag(Token::NeedsCleaning); 1298 1299 Ptr += 3; 1300 Size += 3; 1301 if (C == '\\') goto Slash; 1302 return C; 1303 } 1304 } 1305 1306 // If this is neither, return a single character. 1307 ++Size; 1308 return *Ptr; 1309 } 1310 1311 1312 /// getCharAndSizeSlowNoWarn - Handle the slow/uncommon case of the 1313 /// getCharAndSizeNoWarn method. Here we know that we can accumulate into Size, 1314 /// and that we have already incremented Ptr by Size bytes. 1315 /// 1316 /// NOTE: When this method is updated, getCharAndSizeSlow (above) should 1317 /// be updated to match. 1318 char Lexer::getCharAndSizeSlowNoWarn(const char *Ptr, unsigned &Size, 1319 const LangOptions &LangOpts) { 1320 // If we have a slash, look for an escaped newline. 1321 if (Ptr[0] == '\\') { 1322 ++Size; 1323 ++Ptr; 1324 Slash: 1325 // Common case, backslash-char where the char is not whitespace. 1326 if (!isWhitespace(Ptr[0])) return '\\'; 1327 1328 // See if we have optional whitespace characters followed by a newline. 1329 if (unsigned EscapedNewLineSize = getEscapedNewLineSize(Ptr)) { 1330 // Found backslash<whitespace><newline>. Parse the char after it. 1331 Size += EscapedNewLineSize; 1332 Ptr += EscapedNewLineSize; 1333 1334 // If the char that we finally got was a \n, then we must have had 1335 // something like \<newline><newline>. We don't want to consume the 1336 // second newline. 1337 if (*Ptr == '\n' || *Ptr == '\r' || *Ptr == '\0') 1338 return ' '; 1339 1340 // Use slow version to accumulate a correct size field. 1341 return getCharAndSizeSlowNoWarn(Ptr, Size, LangOpts); 1342 } 1343 1344 // Otherwise, this is not an escaped newline, just return the slash. 1345 return '\\'; 1346 } 1347 1348 // If this is a trigraph, process it. 1349 if (LangOpts.Trigraphs && Ptr[0] == '?' && Ptr[1] == '?') { 1350 // If this is actually a legal trigraph (not something like "??x"), return 1351 // it. 1352 if (char C = GetTrigraphCharForLetter(Ptr[2])) { 1353 Ptr += 3; 1354 Size += 3; 1355 if (C == '\\') goto Slash; 1356 return C; 1357 } 1358 } 1359 1360 // If this is neither, return a single character. 1361 ++Size; 1362 return *Ptr; 1363 } 1364 1365 //===----------------------------------------------------------------------===// 1366 // Helper methods for lexing. 1367 //===----------------------------------------------------------------------===// 1368 1369 /// \brief Routine that indiscriminately skips bytes in the source file. 1370 void Lexer::SkipBytes(unsigned Bytes, bool StartOfLine) { 1371 BufferPtr += Bytes; 1372 if (BufferPtr > BufferEnd) 1373 BufferPtr = BufferEnd; 1374 // FIXME: What exactly does the StartOfLine bit mean? There are two 1375 // possible meanings for the "start" of the line: the first token on the 1376 // unexpanded line, or the first token on the expanded line. 1377 IsAtStartOfLine = StartOfLine; 1378 IsAtPhysicalStartOfLine = StartOfLine; 1379 } 1380 1381 static bool isAllowedIDChar(uint32_t C, const LangOptions &LangOpts) { 1382 if (LangOpts.AsmPreprocessor) { 1383 return false; 1384 } else if (LangOpts.CPlusPlus11 || LangOpts.C11) { 1385 static const llvm::sys::UnicodeCharSet C11AllowedIDChars( 1386 C11AllowedIDCharRanges); 1387 return C11AllowedIDChars.contains(C); 1388 } else if (LangOpts.CPlusPlus) { 1389 static const llvm::sys::UnicodeCharSet CXX03AllowedIDChars( 1390 CXX03AllowedIDCharRanges); 1391 return CXX03AllowedIDChars.contains(C); 1392 } else { 1393 static const llvm::sys::UnicodeCharSet C99AllowedIDChars( 1394 C99AllowedIDCharRanges); 1395 return C99AllowedIDChars.contains(C); 1396 } 1397 } 1398 1399 static bool isAllowedInitiallyIDChar(uint32_t C, const LangOptions &LangOpts) { 1400 assert(isAllowedIDChar(C, LangOpts)); 1401 if (LangOpts.AsmPreprocessor) { 1402 return false; 1403 } else if (LangOpts.CPlusPlus11 || LangOpts.C11) { 1404 static const llvm::sys::UnicodeCharSet C11DisallowedInitialIDChars( 1405 C11DisallowedInitialIDCharRanges); 1406 return !C11DisallowedInitialIDChars.contains(C); 1407 } else if (LangOpts.CPlusPlus) { 1408 return true; 1409 } else { 1410 static const llvm::sys::UnicodeCharSet C99DisallowedInitialIDChars( 1411 C99DisallowedInitialIDCharRanges); 1412 return !C99DisallowedInitialIDChars.contains(C); 1413 } 1414 } 1415 1416 static inline CharSourceRange makeCharRange(Lexer &L, const char *Begin, 1417 const char *End) { 1418 return CharSourceRange::getCharRange(L.getSourceLocation(Begin), 1419 L.getSourceLocation(End)); 1420 } 1421 1422 static void maybeDiagnoseIDCharCompat(DiagnosticsEngine &Diags, uint32_t C, 1423 CharSourceRange Range, bool IsFirst) { 1424 // Check C99 compatibility. 1425 if (!Diags.isIgnored(diag::warn_c99_compat_unicode_id, Range.getBegin())) { 1426 enum { 1427 CannotAppearInIdentifier = 0, 1428 CannotStartIdentifier 1429 }; 1430 1431 static const llvm::sys::UnicodeCharSet C99AllowedIDChars( 1432 C99AllowedIDCharRanges); 1433 static const llvm::sys::UnicodeCharSet C99DisallowedInitialIDChars( 1434 C99DisallowedInitialIDCharRanges); 1435 if (!C99AllowedIDChars.contains(C)) { 1436 Diags.Report(Range.getBegin(), diag::warn_c99_compat_unicode_id) 1437 << Range 1438 << CannotAppearInIdentifier; 1439 } else if (IsFirst && C99DisallowedInitialIDChars.contains(C)) { 1440 Diags.Report(Range.getBegin(), diag::warn_c99_compat_unicode_id) 1441 << Range 1442 << CannotStartIdentifier; 1443 } 1444 } 1445 1446 // Check C++98 compatibility. 1447 if (!Diags.isIgnored(diag::warn_cxx98_compat_unicode_id, Range.getBegin())) { 1448 static const llvm::sys::UnicodeCharSet CXX03AllowedIDChars( 1449 CXX03AllowedIDCharRanges); 1450 if (!CXX03AllowedIDChars.contains(C)) { 1451 Diags.Report(Range.getBegin(), diag::warn_cxx98_compat_unicode_id) 1452 << Range; 1453 } 1454 } 1455 } 1456 1457 bool Lexer::tryConsumeIdentifierUCN(const char *&CurPtr, unsigned Size, 1458 Token &Result) { 1459 const char *UCNPtr = CurPtr + Size; 1460 uint32_t CodePoint = tryReadUCN(UCNPtr, CurPtr, /*Token=*/nullptr); 1461 if (CodePoint == 0 || !isAllowedIDChar(CodePoint, LangOpts)) 1462 return false; 1463 1464 if (!isLexingRawMode()) 1465 maybeDiagnoseIDCharCompat(PP->getDiagnostics(), CodePoint, 1466 makeCharRange(*this, CurPtr, UCNPtr), 1467 /*IsFirst=*/false); 1468 1469 Result.setFlag(Token::HasUCN); 1470 if ((UCNPtr - CurPtr == 6 && CurPtr[1] == 'u') || 1471 (UCNPtr - CurPtr == 10 && CurPtr[1] == 'U')) 1472 CurPtr = UCNPtr; 1473 else 1474 while (CurPtr != UCNPtr) 1475 (void)getAndAdvanceChar(CurPtr, Result); 1476 return true; 1477 } 1478 1479 bool Lexer::tryConsumeIdentifierUTF8Char(const char *&CurPtr) { 1480 const char *UnicodePtr = CurPtr; 1481 UTF32 CodePoint; 1482 ConversionResult Result = 1483 llvm::convertUTF8Sequence((const UTF8 **)&UnicodePtr, 1484 (const UTF8 *)BufferEnd, 1485 &CodePoint, 1486 strictConversion); 1487 if (Result != conversionOK || 1488 !isAllowedIDChar(static_cast<uint32_t>(CodePoint), LangOpts)) 1489 return false; 1490 1491 if (!isLexingRawMode()) 1492 maybeDiagnoseIDCharCompat(PP->getDiagnostics(), CodePoint, 1493 makeCharRange(*this, CurPtr, UnicodePtr), 1494 /*IsFirst=*/false); 1495 1496 CurPtr = UnicodePtr; 1497 return true; 1498 } 1499 1500 bool Lexer::LexIdentifier(Token &Result, const char *CurPtr) { 1501 // Match [_A-Za-z0-9]*, we have already matched [_A-Za-z$] 1502 unsigned Size; 1503 unsigned char C = *CurPtr++; 1504 while (isIdentifierBody(C)) 1505 C = *CurPtr++; 1506 1507 --CurPtr; // Back up over the skipped character. 1508 1509 // Fast path, no $,\,? in identifier found. '\' might be an escaped newline 1510 // or UCN, and ? might be a trigraph for '\', an escaped newline or UCN. 1511 // 1512 // TODO: Could merge these checks into an InfoTable flag to make the 1513 // comparison cheaper 1514 if (isASCII(C) && C != '\\' && C != '?' && 1515 (C != '$' || !LangOpts.DollarIdents)) { 1516 FinishIdentifier: 1517 const char *IdStart = BufferPtr; 1518 FormTokenWithChars(Result, CurPtr, tok::raw_identifier); 1519 Result.setRawIdentifierData(IdStart); 1520 1521 // If we are in raw mode, return this identifier raw. There is no need to 1522 // look up identifier information or attempt to macro expand it. 1523 if (LexingRawMode) 1524 return true; 1525 1526 // Fill in Result.IdentifierInfo and update the token kind, 1527 // looking up the identifier in the identifier table. 1528 IdentifierInfo *II = PP->LookUpIdentifierInfo(Result); 1529 1530 // Finally, now that we know we have an identifier, pass this off to the 1531 // preprocessor, which may macro expand it or something. 1532 if (II->isHandleIdentifierCase()) 1533 return PP->HandleIdentifier(Result); 1534 1535 return true; 1536 } 1537 1538 // Otherwise, $,\,? in identifier found. Enter slower path. 1539 1540 C = getCharAndSize(CurPtr, Size); 1541 while (1) { 1542 if (C == '$') { 1543 // If we hit a $ and they are not supported in identifiers, we are done. 1544 if (!LangOpts.DollarIdents) goto FinishIdentifier; 1545 1546 // Otherwise, emit a diagnostic and continue. 1547 if (!isLexingRawMode()) 1548 Diag(CurPtr, diag::ext_dollar_in_identifier); 1549 CurPtr = ConsumeChar(CurPtr, Size, Result); 1550 C = getCharAndSize(CurPtr, Size); 1551 continue; 1552 1553 } else if (C == '\\' && tryConsumeIdentifierUCN(CurPtr, Size, Result)) { 1554 C = getCharAndSize(CurPtr, Size); 1555 continue; 1556 } else if (!isASCII(C) && tryConsumeIdentifierUTF8Char(CurPtr)) { 1557 C = getCharAndSize(CurPtr, Size); 1558 continue; 1559 } else if (!isIdentifierBody(C)) { 1560 goto FinishIdentifier; 1561 } 1562 1563 // Otherwise, this character is good, consume it. 1564 CurPtr = ConsumeChar(CurPtr, Size, Result); 1565 1566 C = getCharAndSize(CurPtr, Size); 1567 while (isIdentifierBody(C)) { 1568 CurPtr = ConsumeChar(CurPtr, Size, Result); 1569 C = getCharAndSize(CurPtr, Size); 1570 } 1571 } 1572 } 1573 1574 /// isHexaLiteral - Return true if Start points to a hex constant. 1575 /// in microsoft mode (where this is supposed to be several different tokens). 1576 bool Lexer::isHexaLiteral(const char *Start, const LangOptions &LangOpts) { 1577 unsigned Size; 1578 char C1 = Lexer::getCharAndSizeNoWarn(Start, Size, LangOpts); 1579 if (C1 != '0') 1580 return false; 1581 char C2 = Lexer::getCharAndSizeNoWarn(Start + Size, Size, LangOpts); 1582 return (C2 == 'x' || C2 == 'X'); 1583 } 1584 1585 /// LexNumericConstant - Lex the remainder of a integer or floating point 1586 /// constant. From[-1] is the first character lexed. Return the end of the 1587 /// constant. 1588 bool Lexer::LexNumericConstant(Token &Result, const char *CurPtr) { 1589 unsigned Size; 1590 char C = getCharAndSize(CurPtr, Size); 1591 char PrevCh = 0; 1592 while (isPreprocessingNumberBody(C)) { 1593 CurPtr = ConsumeChar(CurPtr, Size, Result); 1594 PrevCh = C; 1595 C = getCharAndSize(CurPtr, Size); 1596 } 1597 1598 // If we fell out, check for a sign, due to 1e+12. If we have one, continue. 1599 if ((C == '-' || C == '+') && (PrevCh == 'E' || PrevCh == 'e')) { 1600 // If we are in Microsoft mode, don't continue if the constant is hex. 1601 // For example, MSVC will accept the following as 3 tokens: 0x1234567e+1 1602 if (!LangOpts.MicrosoftExt || !isHexaLiteral(BufferPtr, LangOpts)) 1603 return LexNumericConstant(Result, ConsumeChar(CurPtr, Size, Result)); 1604 } 1605 1606 // If we have a hex FP constant, continue. 1607 if ((C == '-' || C == '+') && (PrevCh == 'P' || PrevCh == 'p')) { 1608 // Outside C99, we accept hexadecimal floating point numbers as a 1609 // not-quite-conforming extension. Only do so if this looks like it's 1610 // actually meant to be a hexfloat, and not if it has a ud-suffix. 1611 bool IsHexFloat = true; 1612 if (!LangOpts.C99) { 1613 if (!isHexaLiteral(BufferPtr, LangOpts)) 1614 IsHexFloat = false; 1615 else if (std::find(BufferPtr, CurPtr, '_') != CurPtr) 1616 IsHexFloat = false; 1617 } 1618 if (IsHexFloat) 1619 return LexNumericConstant(Result, ConsumeChar(CurPtr, Size, Result)); 1620 } 1621 1622 // If we have a digit separator, continue. 1623 if (C == '\'' && getLangOpts().CPlusPlus14) { 1624 unsigned NextSize; 1625 char Next = getCharAndSizeNoWarn(CurPtr + Size, NextSize, getLangOpts()); 1626 if (isIdentifierBody(Next)) { 1627 if (!isLexingRawMode()) 1628 Diag(CurPtr, diag::warn_cxx11_compat_digit_separator); 1629 CurPtr = ConsumeChar(CurPtr, Size, Result); 1630 CurPtr = ConsumeChar(CurPtr, NextSize, Result); 1631 return LexNumericConstant(Result, CurPtr); 1632 } 1633 } 1634 1635 // If we have a UCN or UTF-8 character (perhaps in a ud-suffix), continue. 1636 if (C == '\\' && tryConsumeIdentifierUCN(CurPtr, Size, Result)) 1637 return LexNumericConstant(Result, CurPtr); 1638 if (!isASCII(C) && tryConsumeIdentifierUTF8Char(CurPtr)) 1639 return LexNumericConstant(Result, CurPtr); 1640 1641 // Update the location of token as well as BufferPtr. 1642 const char *TokStart = BufferPtr; 1643 FormTokenWithChars(Result, CurPtr, tok::numeric_constant); 1644 Result.setLiteralData(TokStart); 1645 return true; 1646 } 1647 1648 /// LexUDSuffix - Lex the ud-suffix production for user-defined literal suffixes 1649 /// in C++11, or warn on a ud-suffix in C++98. 1650 const char *Lexer::LexUDSuffix(Token &Result, const char *CurPtr, 1651 bool IsStringLiteral) { 1652 assert(getLangOpts().CPlusPlus); 1653 1654 // Maximally munch an identifier. 1655 unsigned Size; 1656 char C = getCharAndSize(CurPtr, Size); 1657 bool Consumed = false; 1658 1659 if (!isIdentifierHead(C)) { 1660 if (C == '\\' && tryConsumeIdentifierUCN(CurPtr, Size, Result)) 1661 Consumed = true; 1662 else if (!isASCII(C) && tryConsumeIdentifierUTF8Char(CurPtr)) 1663 Consumed = true; 1664 else 1665 return CurPtr; 1666 } 1667 1668 if (!getLangOpts().CPlusPlus11) { 1669 if (!isLexingRawMode()) 1670 Diag(CurPtr, 1671 C == '_' ? diag::warn_cxx11_compat_user_defined_literal 1672 : diag::warn_cxx11_compat_reserved_user_defined_literal) 1673 << FixItHint::CreateInsertion(getSourceLocation(CurPtr), " "); 1674 return CurPtr; 1675 } 1676 1677 // C++11 [lex.ext]p10, [usrlit.suffix]p1: A program containing a ud-suffix 1678 // that does not start with an underscore is ill-formed. As a conforming 1679 // extension, we treat all such suffixes as if they had whitespace before 1680 // them. We assume a suffix beginning with a UCN or UTF-8 character is more 1681 // likely to be a ud-suffix than a macro, however, and accept that. 1682 if (!Consumed) { 1683 bool IsUDSuffix = false; 1684 if (C == '_') 1685 IsUDSuffix = true; 1686 else if (IsStringLiteral && getLangOpts().CPlusPlus14) { 1687 // In C++1y, we need to look ahead a few characters to see if this is a 1688 // valid suffix for a string literal or a numeric literal (this could be 1689 // the 'operator""if' defining a numeric literal operator). 1690 const unsigned MaxStandardSuffixLength = 3; 1691 char Buffer[MaxStandardSuffixLength] = { C }; 1692 unsigned Consumed = Size; 1693 unsigned Chars = 1; 1694 while (true) { 1695 unsigned NextSize; 1696 char Next = getCharAndSizeNoWarn(CurPtr + Consumed, NextSize, 1697 getLangOpts()); 1698 if (!isIdentifierBody(Next)) { 1699 // End of suffix. Check whether this is on the whitelist. 1700 IsUDSuffix = (Chars == 1 && Buffer[0] == 's') || 1701 NumericLiteralParser::isValidUDSuffix( 1702 getLangOpts(), StringRef(Buffer, Chars)); 1703 break; 1704 } 1705 1706 if (Chars == MaxStandardSuffixLength) 1707 // Too long: can't be a standard suffix. 1708 break; 1709 1710 Buffer[Chars++] = Next; 1711 Consumed += NextSize; 1712 } 1713 } 1714 1715 if (!IsUDSuffix) { 1716 if (!isLexingRawMode()) 1717 Diag(CurPtr, getLangOpts().MSVCCompat 1718 ? diag::ext_ms_reserved_user_defined_literal 1719 : diag::ext_reserved_user_defined_literal) 1720 << FixItHint::CreateInsertion(getSourceLocation(CurPtr), " "); 1721 return CurPtr; 1722 } 1723 1724 CurPtr = ConsumeChar(CurPtr, Size, Result); 1725 } 1726 1727 Result.setFlag(Token::HasUDSuffix); 1728 while (true) { 1729 C = getCharAndSize(CurPtr, Size); 1730 if (isIdentifierBody(C)) { CurPtr = ConsumeChar(CurPtr, Size, Result); } 1731 else if (C == '\\' && tryConsumeIdentifierUCN(CurPtr, Size, Result)) {} 1732 else if (!isASCII(C) && tryConsumeIdentifierUTF8Char(CurPtr)) {} 1733 else break; 1734 } 1735 1736 return CurPtr; 1737 } 1738 1739 /// LexStringLiteral - Lex the remainder of a string literal, after having lexed 1740 /// either " or L" or u8" or u" or U". 1741 bool Lexer::LexStringLiteral(Token &Result, const char *CurPtr, 1742 tok::TokenKind Kind) { 1743 // Does this string contain the \0 character? 1744 const char *NulCharacter = nullptr; 1745 1746 if (!isLexingRawMode() && 1747 (Kind == tok::utf8_string_literal || 1748 Kind == tok::utf16_string_literal || 1749 Kind == tok::utf32_string_literal)) 1750 Diag(BufferPtr, getLangOpts().CPlusPlus 1751 ? diag::warn_cxx98_compat_unicode_literal 1752 : diag::warn_c99_compat_unicode_literal); 1753 1754 char C = getAndAdvanceChar(CurPtr, Result); 1755 while (C != '"') { 1756 // Skip escaped characters. Escaped newlines will already be processed by 1757 // getAndAdvanceChar. 1758 if (C == '\\') 1759 C = getAndAdvanceChar(CurPtr, Result); 1760 1761 if (C == '\n' || C == '\r' || // Newline. 1762 (C == 0 && CurPtr-1 == BufferEnd)) { // End of file. 1763 if (!isLexingRawMode() && !LangOpts.AsmPreprocessor) 1764 Diag(BufferPtr, diag::ext_unterminated_char_or_string) << 1; 1765 FormTokenWithChars(Result, CurPtr-1, tok::unknown); 1766 return true; 1767 } 1768 1769 if (C == 0) { 1770 if (isCodeCompletionPoint(CurPtr-1)) { 1771 PP->CodeCompleteNaturalLanguage(); 1772 FormTokenWithChars(Result, CurPtr-1, tok::unknown); 1773 cutOffLexing(); 1774 return true; 1775 } 1776 1777 NulCharacter = CurPtr-1; 1778 } 1779 C = getAndAdvanceChar(CurPtr, Result); 1780 } 1781 1782 // If we are in C++11, lex the optional ud-suffix. 1783 if (getLangOpts().CPlusPlus) 1784 CurPtr = LexUDSuffix(Result, CurPtr, true); 1785 1786 // If a nul character existed in the string, warn about it. 1787 if (NulCharacter && !isLexingRawMode()) 1788 Diag(NulCharacter, diag::null_in_char_or_string) << 1; 1789 1790 // Update the location of the token as well as the BufferPtr instance var. 1791 const char *TokStart = BufferPtr; 1792 FormTokenWithChars(Result, CurPtr, Kind); 1793 Result.setLiteralData(TokStart); 1794 return true; 1795 } 1796 1797 /// LexRawStringLiteral - Lex the remainder of a raw string literal, after 1798 /// having lexed R", LR", u8R", uR", or UR". 1799 bool Lexer::LexRawStringLiteral(Token &Result, const char *CurPtr, 1800 tok::TokenKind Kind) { 1801 // This function doesn't use getAndAdvanceChar because C++0x [lex.pptoken]p3: 1802 // Between the initial and final double quote characters of the raw string, 1803 // any transformations performed in phases 1 and 2 (trigraphs, 1804 // universal-character-names, and line splicing) are reverted. 1805 1806 if (!isLexingRawMode()) 1807 Diag(BufferPtr, diag::warn_cxx98_compat_raw_string_literal); 1808 1809 unsigned PrefixLen = 0; 1810 1811 while (PrefixLen != 16 && isRawStringDelimBody(CurPtr[PrefixLen])) 1812 ++PrefixLen; 1813 1814 // If the last character was not a '(', then we didn't lex a valid delimiter. 1815 if (CurPtr[PrefixLen] != '(') { 1816 if (!isLexingRawMode()) { 1817 const char *PrefixEnd = &CurPtr[PrefixLen]; 1818 if (PrefixLen == 16) { 1819 Diag(PrefixEnd, diag::err_raw_delim_too_long); 1820 } else { 1821 Diag(PrefixEnd, diag::err_invalid_char_raw_delim) 1822 << StringRef(PrefixEnd, 1); 1823 } 1824 } 1825 1826 // Search for the next '"' in hopes of salvaging the lexer. Unfortunately, 1827 // it's possible the '"' was intended to be part of the raw string, but 1828 // there's not much we can do about that. 1829 while (1) { 1830 char C = *CurPtr++; 1831 1832 if (C == '"') 1833 break; 1834 if (C == 0 && CurPtr-1 == BufferEnd) { 1835 --CurPtr; 1836 break; 1837 } 1838 } 1839 1840 FormTokenWithChars(Result, CurPtr, tok::unknown); 1841 return true; 1842 } 1843 1844 // Save prefix and move CurPtr past it 1845 const char *Prefix = CurPtr; 1846 CurPtr += PrefixLen + 1; // skip over prefix and '(' 1847 1848 while (1) { 1849 char C = *CurPtr++; 1850 1851 if (C == ')') { 1852 // Check for prefix match and closing quote. 1853 if (strncmp(CurPtr, Prefix, PrefixLen) == 0 && CurPtr[PrefixLen] == '"') { 1854 CurPtr += PrefixLen + 1; // skip over prefix and '"' 1855 break; 1856 } 1857 } else if (C == 0 && CurPtr-1 == BufferEnd) { // End of file. 1858 if (!isLexingRawMode()) 1859 Diag(BufferPtr, diag::err_unterminated_raw_string) 1860 << StringRef(Prefix, PrefixLen); 1861 FormTokenWithChars(Result, CurPtr-1, tok::unknown); 1862 return true; 1863 } 1864 } 1865 1866 // If we are in C++11, lex the optional ud-suffix. 1867 if (getLangOpts().CPlusPlus) 1868 CurPtr = LexUDSuffix(Result, CurPtr, true); 1869 1870 // Update the location of token as well as BufferPtr. 1871 const char *TokStart = BufferPtr; 1872 FormTokenWithChars(Result, CurPtr, Kind); 1873 Result.setLiteralData(TokStart); 1874 return true; 1875 } 1876 1877 /// LexAngledStringLiteral - Lex the remainder of an angled string literal, 1878 /// after having lexed the '<' character. This is used for #include filenames. 1879 bool Lexer::LexAngledStringLiteral(Token &Result, const char *CurPtr) { 1880 // Does this string contain the \0 character? 1881 const char *NulCharacter = nullptr; 1882 const char *AfterLessPos = CurPtr; 1883 char C = getAndAdvanceChar(CurPtr, Result); 1884 while (C != '>') { 1885 // Skip escaped characters. 1886 if (C == '\\' && CurPtr < BufferEnd) { 1887 // Skip the escaped character. 1888 getAndAdvanceChar(CurPtr, Result); 1889 } else if (C == '\n' || C == '\r' || // Newline. 1890 (C == 0 && (CurPtr-1 == BufferEnd || // End of file. 1891 isCodeCompletionPoint(CurPtr-1)))) { 1892 // If the filename is unterminated, then it must just be a lone < 1893 // character. Return this as such. 1894 FormTokenWithChars(Result, AfterLessPos, tok::less); 1895 return true; 1896 } else if (C == 0) { 1897 NulCharacter = CurPtr-1; 1898 } 1899 C = getAndAdvanceChar(CurPtr, Result); 1900 } 1901 1902 // If a nul character existed in the string, warn about it. 1903 if (NulCharacter && !isLexingRawMode()) 1904 Diag(NulCharacter, diag::null_in_char_or_string) << 1; 1905 1906 // Update the location of token as well as BufferPtr. 1907 const char *TokStart = BufferPtr; 1908 FormTokenWithChars(Result, CurPtr, tok::angle_string_literal); 1909 Result.setLiteralData(TokStart); 1910 return true; 1911 } 1912 1913 1914 /// LexCharConstant - Lex the remainder of a character constant, after having 1915 /// lexed either ' or L' or u8' or u' or U'. 1916 bool Lexer::LexCharConstant(Token &Result, const char *CurPtr, 1917 tok::TokenKind Kind) { 1918 // Does this character contain the \0 character? 1919 const char *NulCharacter = nullptr; 1920 1921 if (!isLexingRawMode()) { 1922 if (Kind == tok::utf16_char_constant || Kind == tok::utf32_char_constant) 1923 Diag(BufferPtr, getLangOpts().CPlusPlus 1924 ? diag::warn_cxx98_compat_unicode_literal 1925 : diag::warn_c99_compat_unicode_literal); 1926 else if (Kind == tok::utf8_char_constant) 1927 Diag(BufferPtr, diag::warn_cxx14_compat_u8_character_literal); 1928 } 1929 1930 char C = getAndAdvanceChar(CurPtr, Result); 1931 if (C == '\'') { 1932 if (!isLexingRawMode() && !LangOpts.AsmPreprocessor) 1933 Diag(BufferPtr, diag::ext_empty_character); 1934 FormTokenWithChars(Result, CurPtr, tok::unknown); 1935 return true; 1936 } 1937 1938 while (C != '\'') { 1939 // Skip escaped characters. 1940 if (C == '\\') 1941 C = getAndAdvanceChar(CurPtr, Result); 1942 1943 if (C == '\n' || C == '\r' || // Newline. 1944 (C == 0 && CurPtr-1 == BufferEnd)) { // End of file. 1945 if (!isLexingRawMode() && !LangOpts.AsmPreprocessor) 1946 Diag(BufferPtr, diag::ext_unterminated_char_or_string) << 0; 1947 FormTokenWithChars(Result, CurPtr-1, tok::unknown); 1948 return true; 1949 } 1950 1951 if (C == 0) { 1952 if (isCodeCompletionPoint(CurPtr-1)) { 1953 PP->CodeCompleteNaturalLanguage(); 1954 FormTokenWithChars(Result, CurPtr-1, tok::unknown); 1955 cutOffLexing(); 1956 return true; 1957 } 1958 1959 NulCharacter = CurPtr-1; 1960 } 1961 C = getAndAdvanceChar(CurPtr, Result); 1962 } 1963 1964 // If we are in C++11, lex the optional ud-suffix. 1965 if (getLangOpts().CPlusPlus) 1966 CurPtr = LexUDSuffix(Result, CurPtr, false); 1967 1968 // If a nul character existed in the character, warn about it. 1969 if (NulCharacter && !isLexingRawMode()) 1970 Diag(NulCharacter, diag::null_in_char_or_string) << 0; 1971 1972 // Update the location of token as well as BufferPtr. 1973 const char *TokStart = BufferPtr; 1974 FormTokenWithChars(Result, CurPtr, Kind); 1975 Result.setLiteralData(TokStart); 1976 return true; 1977 } 1978 1979 /// SkipWhitespace - Efficiently skip over a series of whitespace characters. 1980 /// Update BufferPtr to point to the next non-whitespace character and return. 1981 /// 1982 /// This method forms a token and returns true if KeepWhitespaceMode is enabled. 1983 /// 1984 bool Lexer::SkipWhitespace(Token &Result, const char *CurPtr, 1985 bool &TokAtPhysicalStartOfLine) { 1986 // Whitespace - Skip it, then return the token after the whitespace. 1987 bool SawNewline = isVerticalWhitespace(CurPtr[-1]); 1988 1989 unsigned char Char = *CurPtr; 1990 1991 // Skip consecutive spaces efficiently. 1992 while (1) { 1993 // Skip horizontal whitespace very aggressively. 1994 while (isHorizontalWhitespace(Char)) 1995 Char = *++CurPtr; 1996 1997 // Otherwise if we have something other than whitespace, we're done. 1998 if (!isVerticalWhitespace(Char)) 1999 break; 2000 2001 if (ParsingPreprocessorDirective) { 2002 // End of preprocessor directive line, let LexTokenInternal handle this. 2003 BufferPtr = CurPtr; 2004 return false; 2005 } 2006 2007 // OK, but handle newline. 2008 SawNewline = true; 2009 Char = *++CurPtr; 2010 } 2011 2012 // If the client wants us to return whitespace, return it now. 2013 if (isKeepWhitespaceMode()) { 2014 FormTokenWithChars(Result, CurPtr, tok::unknown); 2015 if (SawNewline) { 2016 IsAtStartOfLine = true; 2017 IsAtPhysicalStartOfLine = true; 2018 } 2019 // FIXME: The next token will not have LeadingSpace set. 2020 return true; 2021 } 2022 2023 // If this isn't immediately after a newline, there is leading space. 2024 char PrevChar = CurPtr[-1]; 2025 bool HasLeadingSpace = !isVerticalWhitespace(PrevChar); 2026 2027 Result.setFlagValue(Token::LeadingSpace, HasLeadingSpace); 2028 if (SawNewline) { 2029 Result.setFlag(Token::StartOfLine); 2030 TokAtPhysicalStartOfLine = true; 2031 } 2032 2033 BufferPtr = CurPtr; 2034 return false; 2035 } 2036 2037 /// We have just read the // characters from input. Skip until we find the 2038 /// newline character thats terminate the comment. Then update BufferPtr and 2039 /// return. 2040 /// 2041 /// If we're in KeepCommentMode or any CommentHandler has inserted 2042 /// some tokens, this will store the first token and return true. 2043 bool Lexer::SkipLineComment(Token &Result, const char *CurPtr, 2044 bool &TokAtPhysicalStartOfLine) { 2045 // If Line comments aren't explicitly enabled for this language, emit an 2046 // extension warning. 2047 if (!LangOpts.LineComment && !isLexingRawMode()) { 2048 Diag(BufferPtr, diag::ext_line_comment); 2049 2050 // Mark them enabled so we only emit one warning for this translation 2051 // unit. 2052 LangOpts.LineComment = true; 2053 } 2054 2055 // Scan over the body of the comment. The common case, when scanning, is that 2056 // the comment contains normal ascii characters with nothing interesting in 2057 // them. As such, optimize for this case with the inner loop. 2058 char C; 2059 do { 2060 C = *CurPtr; 2061 // Skip over characters in the fast loop. 2062 while (C != 0 && // Potentially EOF. 2063 C != '\n' && C != '\r') // Newline or DOS-style newline. 2064 C = *++CurPtr; 2065 2066 const char *NextLine = CurPtr; 2067 if (C != 0) { 2068 // We found a newline, see if it's escaped. 2069 const char *EscapePtr = CurPtr-1; 2070 bool HasSpace = false; 2071 while (isHorizontalWhitespace(*EscapePtr)) { // Skip whitespace. 2072 --EscapePtr; 2073 HasSpace = true; 2074 } 2075 2076 if (*EscapePtr == '\\') // Escaped newline. 2077 CurPtr = EscapePtr; 2078 else if (EscapePtr[0] == '/' && EscapePtr[-1] == '?' && 2079 EscapePtr[-2] == '?') // Trigraph-escaped newline. 2080 CurPtr = EscapePtr-2; 2081 else 2082 break; // This is a newline, we're done. 2083 2084 // If there was space between the backslash and newline, warn about it. 2085 if (HasSpace && !isLexingRawMode()) 2086 Diag(EscapePtr, diag::backslash_newline_space); 2087 } 2088 2089 // Otherwise, this is a hard case. Fall back on getAndAdvanceChar to 2090 // properly decode the character. Read it in raw mode to avoid emitting 2091 // diagnostics about things like trigraphs. If we see an escaped newline, 2092 // we'll handle it below. 2093 const char *OldPtr = CurPtr; 2094 bool OldRawMode = isLexingRawMode(); 2095 LexingRawMode = true; 2096 C = getAndAdvanceChar(CurPtr, Result); 2097 LexingRawMode = OldRawMode; 2098 2099 // If we only read only one character, then no special handling is needed. 2100 // We're done and can skip forward to the newline. 2101 if (C != 0 && CurPtr == OldPtr+1) { 2102 CurPtr = NextLine; 2103 break; 2104 } 2105 2106 // If we read multiple characters, and one of those characters was a \r or 2107 // \n, then we had an escaped newline within the comment. Emit diagnostic 2108 // unless the next line is also a // comment. 2109 if (CurPtr != OldPtr+1 && C != '/' && CurPtr[0] != '/') { 2110 for (; OldPtr != CurPtr; ++OldPtr) 2111 if (OldPtr[0] == '\n' || OldPtr[0] == '\r') { 2112 // Okay, we found a // comment that ends in a newline, if the next 2113 // line is also a // comment, but has spaces, don't emit a diagnostic. 2114 if (isWhitespace(C)) { 2115 const char *ForwardPtr = CurPtr; 2116 while (isWhitespace(*ForwardPtr)) // Skip whitespace. 2117 ++ForwardPtr; 2118 if (ForwardPtr[0] == '/' && ForwardPtr[1] == '/') 2119 break; 2120 } 2121 2122 if (!isLexingRawMode()) 2123 Diag(OldPtr-1, diag::ext_multi_line_line_comment); 2124 break; 2125 } 2126 } 2127 2128 if (CurPtr == BufferEnd+1) { 2129 --CurPtr; 2130 break; 2131 } 2132 2133 if (C == '\0' && isCodeCompletionPoint(CurPtr-1)) { 2134 PP->CodeCompleteNaturalLanguage(); 2135 cutOffLexing(); 2136 return false; 2137 } 2138 2139 } while (C != '\n' && C != '\r'); 2140 2141 // Found but did not consume the newline. Notify comment handlers about the 2142 // comment unless we're in a #if 0 block. 2143 if (PP && !isLexingRawMode() && 2144 PP->HandleComment(Result, SourceRange(getSourceLocation(BufferPtr), 2145 getSourceLocation(CurPtr)))) { 2146 BufferPtr = CurPtr; 2147 return true; // A token has to be returned. 2148 } 2149 2150 // If we are returning comments as tokens, return this comment as a token. 2151 if (inKeepCommentMode()) 2152 return SaveLineComment(Result, CurPtr); 2153 2154 // If we are inside a preprocessor directive and we see the end of line, 2155 // return immediately, so that the lexer can return this as an EOD token. 2156 if (ParsingPreprocessorDirective || CurPtr == BufferEnd) { 2157 BufferPtr = CurPtr; 2158 return false; 2159 } 2160 2161 // Otherwise, eat the \n character. We don't care if this is a \n\r or 2162 // \r\n sequence. This is an efficiency hack (because we know the \n can't 2163 // contribute to another token), it isn't needed for correctness. Note that 2164 // this is ok even in KeepWhitespaceMode, because we would have returned the 2165 /// comment above in that mode. 2166 ++CurPtr; 2167 2168 // The next returned token is at the start of the line. 2169 Result.setFlag(Token::StartOfLine); 2170 TokAtPhysicalStartOfLine = true; 2171 // No leading whitespace seen so far. 2172 Result.clearFlag(Token::LeadingSpace); 2173 BufferPtr = CurPtr; 2174 return false; 2175 } 2176 2177 /// If in save-comment mode, package up this Line comment in an appropriate 2178 /// way and return it. 2179 bool Lexer::SaveLineComment(Token &Result, const char *CurPtr) { 2180 // If we're not in a preprocessor directive, just return the // comment 2181 // directly. 2182 FormTokenWithChars(Result, CurPtr, tok::comment); 2183 2184 if (!ParsingPreprocessorDirective || LexingRawMode) 2185 return true; 2186 2187 // If this Line-style comment is in a macro definition, transmogrify it into 2188 // a C-style block comment. 2189 bool Invalid = false; 2190 std::string Spelling = PP->getSpelling(Result, &Invalid); 2191 if (Invalid) 2192 return true; 2193 2194 assert(Spelling[0] == '/' && Spelling[1] == '/' && "Not line comment?"); 2195 Spelling[1] = '*'; // Change prefix to "/*". 2196 Spelling += "*/"; // add suffix. 2197 2198 Result.setKind(tok::comment); 2199 PP->CreateString(Spelling, Result, 2200 Result.getLocation(), Result.getLocation()); 2201 return true; 2202 } 2203 2204 /// isBlockCommentEndOfEscapedNewLine - Return true if the specified newline 2205 /// character (either \\n or \\r) is part of an escaped newline sequence. Issue 2206 /// a diagnostic if so. We know that the newline is inside of a block comment. 2207 static bool isEndOfBlockCommentWithEscapedNewLine(const char *CurPtr, 2208 Lexer *L) { 2209 assert(CurPtr[0] == '\n' || CurPtr[0] == '\r'); 2210 2211 // Back up off the newline. 2212 --CurPtr; 2213 2214 // If this is a two-character newline sequence, skip the other character. 2215 if (CurPtr[0] == '\n' || CurPtr[0] == '\r') { 2216 // \n\n or \r\r -> not escaped newline. 2217 if (CurPtr[0] == CurPtr[1]) 2218 return false; 2219 // \n\r or \r\n -> skip the newline. 2220 --CurPtr; 2221 } 2222 2223 // If we have horizontal whitespace, skip over it. We allow whitespace 2224 // between the slash and newline. 2225 bool HasSpace = false; 2226 while (isHorizontalWhitespace(*CurPtr) || *CurPtr == 0) { 2227 --CurPtr; 2228 HasSpace = true; 2229 } 2230 2231 // If we have a slash, we know this is an escaped newline. 2232 if (*CurPtr == '\\') { 2233 if (CurPtr[-1] != '*') return false; 2234 } else { 2235 // It isn't a slash, is it the ?? / trigraph? 2236 if (CurPtr[0] != '/' || CurPtr[-1] != '?' || CurPtr[-2] != '?' || 2237 CurPtr[-3] != '*') 2238 return false; 2239 2240 // This is the trigraph ending the comment. Emit a stern warning! 2241 CurPtr -= 2; 2242 2243 // If no trigraphs are enabled, warn that we ignored this trigraph and 2244 // ignore this * character. 2245 if (!L->getLangOpts().Trigraphs) { 2246 if (!L->isLexingRawMode()) 2247 L->Diag(CurPtr, diag::trigraph_ignored_block_comment); 2248 return false; 2249 } 2250 if (!L->isLexingRawMode()) 2251 L->Diag(CurPtr, diag::trigraph_ends_block_comment); 2252 } 2253 2254 // Warn about having an escaped newline between the */ characters. 2255 if (!L->isLexingRawMode()) 2256 L->Diag(CurPtr, diag::escaped_newline_block_comment_end); 2257 2258 // If there was space between the backslash and newline, warn about it. 2259 if (HasSpace && !L->isLexingRawMode()) 2260 L->Diag(CurPtr, diag::backslash_newline_space); 2261 2262 return true; 2263 } 2264 2265 #ifdef __SSE2__ 2266 #include <emmintrin.h> 2267 #elif __ALTIVEC__ 2268 #include <altivec.h> 2269 #undef bool 2270 #endif 2271 2272 /// We have just read from input the / and * characters that started a comment. 2273 /// Read until we find the * and / characters that terminate the comment. 2274 /// Note that we don't bother decoding trigraphs or escaped newlines in block 2275 /// comments, because they cannot cause the comment to end. The only thing 2276 /// that can happen is the comment could end with an escaped newline between 2277 /// the terminating * and /. 2278 /// 2279 /// If we're in KeepCommentMode or any CommentHandler has inserted 2280 /// some tokens, this will store the first token and return true. 2281 bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr, 2282 bool &TokAtPhysicalStartOfLine) { 2283 // Scan one character past where we should, looking for a '/' character. Once 2284 // we find it, check to see if it was preceded by a *. This common 2285 // optimization helps people who like to put a lot of * characters in their 2286 // comments. 2287 2288 // The first character we get with newlines and trigraphs skipped to handle 2289 // the degenerate /*/ case below correctly if the * has an escaped newline 2290 // after it. 2291 unsigned CharSize; 2292 unsigned char C = getCharAndSize(CurPtr, CharSize); 2293 CurPtr += CharSize; 2294 if (C == 0 && CurPtr == BufferEnd+1) { 2295 if (!isLexingRawMode()) 2296 Diag(BufferPtr, diag::err_unterminated_block_comment); 2297 --CurPtr; 2298 2299 // KeepWhitespaceMode should return this broken comment as a token. Since 2300 // it isn't a well formed comment, just return it as an 'unknown' token. 2301 if (isKeepWhitespaceMode()) { 2302 FormTokenWithChars(Result, CurPtr, tok::unknown); 2303 return true; 2304 } 2305 2306 BufferPtr = CurPtr; 2307 return false; 2308 } 2309 2310 // Check to see if the first character after the '/*' is another /. If so, 2311 // then this slash does not end the block comment, it is part of it. 2312 if (C == '/') 2313 C = *CurPtr++; 2314 2315 while (1) { 2316 // Skip over all non-interesting characters until we find end of buffer or a 2317 // (probably ending) '/' character. 2318 if (CurPtr + 24 < BufferEnd && 2319 // If there is a code-completion point avoid the fast scan because it 2320 // doesn't check for '\0'. 2321 !(PP && PP->getCodeCompletionFileLoc() == FileLoc)) { 2322 // While not aligned to a 16-byte boundary. 2323 while (C != '/' && ((intptr_t)CurPtr & 0x0F) != 0) 2324 C = *CurPtr++; 2325 2326 if (C == '/') goto FoundSlash; 2327 2328 #ifdef __SSE2__ 2329 __m128i Slashes = _mm_set1_epi8('/'); 2330 while (CurPtr+16 <= BufferEnd) { 2331 int cmp = _mm_movemask_epi8(_mm_cmpeq_epi8(*(const __m128i*)CurPtr, 2332 Slashes)); 2333 if (cmp != 0) { 2334 // Adjust the pointer to point directly after the first slash. It's 2335 // not necessary to set C here, it will be overwritten at the end of 2336 // the outer loop. 2337 CurPtr += llvm::countTrailingZeros<unsigned>(cmp) + 1; 2338 goto FoundSlash; 2339 } 2340 CurPtr += 16; 2341 } 2342 #elif __ALTIVEC__ 2343 __vector unsigned char Slashes = { 2344 '/', '/', '/', '/', '/', '/', '/', '/', 2345 '/', '/', '/', '/', '/', '/', '/', '/' 2346 }; 2347 while (CurPtr+16 <= BufferEnd && 2348 !vec_any_eq(*(const vector unsigned char*)CurPtr, Slashes)) 2349 CurPtr += 16; 2350 #else 2351 // Scan for '/' quickly. Many block comments are very large. 2352 while (CurPtr[0] != '/' && 2353 CurPtr[1] != '/' && 2354 CurPtr[2] != '/' && 2355 CurPtr[3] != '/' && 2356 CurPtr+4 < BufferEnd) { 2357 CurPtr += 4; 2358 } 2359 #endif 2360 2361 // It has to be one of the bytes scanned, increment to it and read one. 2362 C = *CurPtr++; 2363 } 2364 2365 // Loop to scan the remainder. 2366 while (C != '/' && C != '\0') 2367 C = *CurPtr++; 2368 2369 if (C == '/') { 2370 FoundSlash: 2371 if (CurPtr[-2] == '*') // We found the final */. We're done! 2372 break; 2373 2374 if ((CurPtr[-2] == '\n' || CurPtr[-2] == '\r')) { 2375 if (isEndOfBlockCommentWithEscapedNewLine(CurPtr-2, this)) { 2376 // We found the final */, though it had an escaped newline between the 2377 // * and /. We're done! 2378 break; 2379 } 2380 } 2381 if (CurPtr[0] == '*' && CurPtr[1] != '/') { 2382 // If this is a /* inside of the comment, emit a warning. Don't do this 2383 // if this is a /*/, which will end the comment. This misses cases with 2384 // embedded escaped newlines, but oh well. 2385 if (!isLexingRawMode()) 2386 Diag(CurPtr-1, diag::warn_nested_block_comment); 2387 } 2388 } else if (C == 0 && CurPtr == BufferEnd+1) { 2389 if (!isLexingRawMode()) 2390 Diag(BufferPtr, diag::err_unterminated_block_comment); 2391 // Note: the user probably forgot a */. We could continue immediately 2392 // after the /*, but this would involve lexing a lot of what really is the 2393 // comment, which surely would confuse the parser. 2394 --CurPtr; 2395 2396 // KeepWhitespaceMode should return this broken comment as a token. Since 2397 // it isn't a well formed comment, just return it as an 'unknown' token. 2398 if (isKeepWhitespaceMode()) { 2399 FormTokenWithChars(Result, CurPtr, tok::unknown); 2400 return true; 2401 } 2402 2403 BufferPtr = CurPtr; 2404 return false; 2405 } else if (C == '\0' && isCodeCompletionPoint(CurPtr-1)) { 2406 PP->CodeCompleteNaturalLanguage(); 2407 cutOffLexing(); 2408 return false; 2409 } 2410 2411 C = *CurPtr++; 2412 } 2413 2414 // Notify comment handlers about the comment unless we're in a #if 0 block. 2415 if (PP && !isLexingRawMode() && 2416 PP->HandleComment(Result, SourceRange(getSourceLocation(BufferPtr), 2417 getSourceLocation(CurPtr)))) { 2418 BufferPtr = CurPtr; 2419 return true; // A token has to be returned. 2420 } 2421 2422 // If we are returning comments as tokens, return this comment as a token. 2423 if (inKeepCommentMode()) { 2424 FormTokenWithChars(Result, CurPtr, tok::comment); 2425 return true; 2426 } 2427 2428 // It is common for the tokens immediately after a /**/ comment to be 2429 // whitespace. Instead of going through the big switch, handle it 2430 // efficiently now. This is safe even in KeepWhitespaceMode because we would 2431 // have already returned above with the comment as a token. 2432 if (isHorizontalWhitespace(*CurPtr)) { 2433 SkipWhitespace(Result, CurPtr+1, TokAtPhysicalStartOfLine); 2434 return false; 2435 } 2436 2437 // Otherwise, just return so that the next character will be lexed as a token. 2438 BufferPtr = CurPtr; 2439 Result.setFlag(Token::LeadingSpace); 2440 return false; 2441 } 2442 2443 //===----------------------------------------------------------------------===// 2444 // Primary Lexing Entry Points 2445 //===----------------------------------------------------------------------===// 2446 2447 /// ReadToEndOfLine - Read the rest of the current preprocessor line as an 2448 /// uninterpreted string. This switches the lexer out of directive mode. 2449 void Lexer::ReadToEndOfLine(SmallVectorImpl<char> *Result) { 2450 assert(ParsingPreprocessorDirective && ParsingFilename == false && 2451 "Must be in a preprocessing directive!"); 2452 Token Tmp; 2453 2454 // CurPtr - Cache BufferPtr in an automatic variable. 2455 const char *CurPtr = BufferPtr; 2456 while (1) { 2457 char Char = getAndAdvanceChar(CurPtr, Tmp); 2458 switch (Char) { 2459 default: 2460 if (Result) 2461 Result->push_back(Char); 2462 break; 2463 case 0: // Null. 2464 // Found end of file? 2465 if (CurPtr-1 != BufferEnd) { 2466 if (isCodeCompletionPoint(CurPtr-1)) { 2467 PP->CodeCompleteNaturalLanguage(); 2468 cutOffLexing(); 2469 return; 2470 } 2471 2472 // Nope, normal character, continue. 2473 if (Result) 2474 Result->push_back(Char); 2475 break; 2476 } 2477 // FALL THROUGH. 2478 case '\r': 2479 case '\n': 2480 // Okay, we found the end of the line. First, back up past the \0, \r, \n. 2481 assert(CurPtr[-1] == Char && "Trigraphs for newline?"); 2482 BufferPtr = CurPtr-1; 2483 2484 // Next, lex the character, which should handle the EOD transition. 2485 Lex(Tmp); 2486 if (Tmp.is(tok::code_completion)) { 2487 if (PP) 2488 PP->CodeCompleteNaturalLanguage(); 2489 Lex(Tmp); 2490 } 2491 assert(Tmp.is(tok::eod) && "Unexpected token!"); 2492 2493 // Finally, we're done; 2494 return; 2495 } 2496 } 2497 } 2498 2499 /// LexEndOfFile - CurPtr points to the end of this file. Handle this 2500 /// condition, reporting diagnostics and handling other edge cases as required. 2501 /// This returns true if Result contains a token, false if PP.Lex should be 2502 /// called again. 2503 bool Lexer::LexEndOfFile(Token &Result, const char *CurPtr) { 2504 // If we hit the end of the file while parsing a preprocessor directive, 2505 // end the preprocessor directive first. The next token returned will 2506 // then be the end of file. 2507 if (ParsingPreprocessorDirective) { 2508 // Done parsing the "line". 2509 ParsingPreprocessorDirective = false; 2510 // Update the location of token as well as BufferPtr. 2511 FormTokenWithChars(Result, CurPtr, tok::eod); 2512 2513 // Restore comment saving mode, in case it was disabled for directive. 2514 if (PP) 2515 resetExtendedTokenMode(); 2516 return true; // Have a token. 2517 } 2518 2519 // If we are in raw mode, return this event as an EOF token. Let the caller 2520 // that put us in raw mode handle the event. 2521 if (isLexingRawMode()) { 2522 Result.startToken(); 2523 BufferPtr = BufferEnd; 2524 FormTokenWithChars(Result, BufferEnd, tok::eof); 2525 return true; 2526 } 2527 2528 // Issue diagnostics for unterminated #if and missing newline. 2529 2530 // If we are in a #if directive, emit an error. 2531 while (!ConditionalStack.empty()) { 2532 if (PP->getCodeCompletionFileLoc() != FileLoc) 2533 PP->Diag(ConditionalStack.back().IfLoc, 2534 diag::err_pp_unterminated_conditional); 2535 ConditionalStack.pop_back(); 2536 } 2537 2538 // C99 5.1.1.2p2: If the file is non-empty and didn't end in a newline, issue 2539 // a pedwarn. 2540 if (CurPtr != BufferStart && (CurPtr[-1] != '\n' && CurPtr[-1] != '\r')) { 2541 DiagnosticsEngine &Diags = PP->getDiagnostics(); 2542 SourceLocation EndLoc = getSourceLocation(BufferEnd); 2543 unsigned DiagID; 2544 2545 if (LangOpts.CPlusPlus11) { 2546 // C++11 [lex.phases] 2.2 p2 2547 // Prefer the C++98 pedantic compatibility warning over the generic, 2548 // non-extension, user-requested "missing newline at EOF" warning. 2549 if (!Diags.isIgnored(diag::warn_cxx98_compat_no_newline_eof, EndLoc)) { 2550 DiagID = diag::warn_cxx98_compat_no_newline_eof; 2551 } else { 2552 DiagID = diag::warn_no_newline_eof; 2553 } 2554 } else { 2555 DiagID = diag::ext_no_newline_eof; 2556 } 2557 2558 Diag(BufferEnd, DiagID) 2559 << FixItHint::CreateInsertion(EndLoc, "\n"); 2560 } 2561 2562 BufferPtr = CurPtr; 2563 2564 // Finally, let the preprocessor handle this. 2565 return PP->HandleEndOfFile(Result, isPragmaLexer()); 2566 } 2567 2568 /// isNextPPTokenLParen - Return 1 if the next unexpanded token lexed from 2569 /// the specified lexer will return a tok::l_paren token, 0 if it is something 2570 /// else and 2 if there are no more tokens in the buffer controlled by the 2571 /// lexer. 2572 unsigned Lexer::isNextPPTokenLParen() { 2573 assert(!LexingRawMode && "How can we expand a macro from a skipping buffer?"); 2574 2575 // Switch to 'skipping' mode. This will ensure that we can lex a token 2576 // without emitting diagnostics, disables macro expansion, and will cause EOF 2577 // to return an EOF token instead of popping the include stack. 2578 LexingRawMode = true; 2579 2580 // Save state that can be changed while lexing so that we can restore it. 2581 const char *TmpBufferPtr = BufferPtr; 2582 bool inPPDirectiveMode = ParsingPreprocessorDirective; 2583 bool atStartOfLine = IsAtStartOfLine; 2584 bool atPhysicalStartOfLine = IsAtPhysicalStartOfLine; 2585 bool leadingSpace = HasLeadingSpace; 2586 2587 Token Tok; 2588 Lex(Tok); 2589 2590 // Restore state that may have changed. 2591 BufferPtr = TmpBufferPtr; 2592 ParsingPreprocessorDirective = inPPDirectiveMode; 2593 HasLeadingSpace = leadingSpace; 2594 IsAtStartOfLine = atStartOfLine; 2595 IsAtPhysicalStartOfLine = atPhysicalStartOfLine; 2596 2597 // Restore the lexer back to non-skipping mode. 2598 LexingRawMode = false; 2599 2600 if (Tok.is(tok::eof)) 2601 return 2; 2602 return Tok.is(tok::l_paren); 2603 } 2604 2605 /// \brief Find the end of a version control conflict marker. 2606 static const char *FindConflictEnd(const char *CurPtr, const char *BufferEnd, 2607 ConflictMarkerKind CMK) { 2608 const char *Terminator = CMK == CMK_Perforce ? "<<<<\n" : ">>>>>>>"; 2609 size_t TermLen = CMK == CMK_Perforce ? 5 : 7; 2610 StringRef RestOfBuffer(CurPtr+TermLen, BufferEnd-CurPtr-TermLen); 2611 size_t Pos = RestOfBuffer.find(Terminator); 2612 while (Pos != StringRef::npos) { 2613 // Must occur at start of line. 2614 if (Pos == 0 || 2615 (RestOfBuffer[Pos - 1] != '\r' && RestOfBuffer[Pos - 1] != '\n')) { 2616 RestOfBuffer = RestOfBuffer.substr(Pos+TermLen); 2617 Pos = RestOfBuffer.find(Terminator); 2618 continue; 2619 } 2620 return RestOfBuffer.data()+Pos; 2621 } 2622 return nullptr; 2623 } 2624 2625 /// IsStartOfConflictMarker - If the specified pointer is the start of a version 2626 /// control conflict marker like '<<<<<<<', recognize it as such, emit an error 2627 /// and recover nicely. This returns true if it is a conflict marker and false 2628 /// if not. 2629 bool Lexer::IsStartOfConflictMarker(const char *CurPtr) { 2630 // Only a conflict marker if it starts at the beginning of a line. 2631 if (CurPtr != BufferStart && 2632 CurPtr[-1] != '\n' && CurPtr[-1] != '\r') 2633 return false; 2634 2635 // Check to see if we have <<<<<<< or >>>>. 2636 if ((BufferEnd-CurPtr < 8 || StringRef(CurPtr, 7) != "<<<<<<<") && 2637 (BufferEnd-CurPtr < 6 || StringRef(CurPtr, 5) != ">>>> ")) 2638 return false; 2639 2640 // If we have a situation where we don't care about conflict markers, ignore 2641 // it. 2642 if (CurrentConflictMarkerState || isLexingRawMode()) 2643 return false; 2644 2645 ConflictMarkerKind Kind = *CurPtr == '<' ? CMK_Normal : CMK_Perforce; 2646 2647 // Check to see if there is an ending marker somewhere in the buffer at the 2648 // start of a line to terminate this conflict marker. 2649 if (FindConflictEnd(CurPtr, BufferEnd, Kind)) { 2650 // We found a match. We are really in a conflict marker. 2651 // Diagnose this, and ignore to the end of line. 2652 Diag(CurPtr, diag::err_conflict_marker); 2653 CurrentConflictMarkerState = Kind; 2654 2655 // Skip ahead to the end of line. We know this exists because the 2656 // end-of-conflict marker starts with \r or \n. 2657 while (*CurPtr != '\r' && *CurPtr != '\n') { 2658 assert(CurPtr != BufferEnd && "Didn't find end of line"); 2659 ++CurPtr; 2660 } 2661 BufferPtr = CurPtr; 2662 return true; 2663 } 2664 2665 // No end of conflict marker found. 2666 return false; 2667 } 2668 2669 2670 /// HandleEndOfConflictMarker - If this is a '====' or '||||' or '>>>>', or if 2671 /// it is '<<<<' and the conflict marker started with a '>>>>' marker, then it 2672 /// is the end of a conflict marker. Handle it by ignoring up until the end of 2673 /// the line. This returns true if it is a conflict marker and false if not. 2674 bool Lexer::HandleEndOfConflictMarker(const char *CurPtr) { 2675 // Only a conflict marker if it starts at the beginning of a line. 2676 if (CurPtr != BufferStart && 2677 CurPtr[-1] != '\n' && CurPtr[-1] != '\r') 2678 return false; 2679 2680 // If we have a situation where we don't care about conflict markers, ignore 2681 // it. 2682 if (!CurrentConflictMarkerState || isLexingRawMode()) 2683 return false; 2684 2685 // Check to see if we have the marker (4 characters in a row). 2686 for (unsigned i = 1; i != 4; ++i) 2687 if (CurPtr[i] != CurPtr[0]) 2688 return false; 2689 2690 // If we do have it, search for the end of the conflict marker. This could 2691 // fail if it got skipped with a '#if 0' or something. Note that CurPtr might 2692 // be the end of conflict marker. 2693 if (const char *End = FindConflictEnd(CurPtr, BufferEnd, 2694 CurrentConflictMarkerState)) { 2695 CurPtr = End; 2696 2697 // Skip ahead to the end of line. 2698 while (CurPtr != BufferEnd && *CurPtr != '\r' && *CurPtr != '\n') 2699 ++CurPtr; 2700 2701 BufferPtr = CurPtr; 2702 2703 // No longer in the conflict marker. 2704 CurrentConflictMarkerState = CMK_None; 2705 return true; 2706 } 2707 2708 return false; 2709 } 2710 2711 bool Lexer::isCodeCompletionPoint(const char *CurPtr) const { 2712 if (PP && PP->isCodeCompletionEnabled()) { 2713 SourceLocation Loc = FileLoc.getLocWithOffset(CurPtr-BufferStart); 2714 return Loc == PP->getCodeCompletionLoc(); 2715 } 2716 2717 return false; 2718 } 2719 2720 uint32_t Lexer::tryReadUCN(const char *&StartPtr, const char *SlashLoc, 2721 Token *Result) { 2722 unsigned CharSize; 2723 char Kind = getCharAndSize(StartPtr, CharSize); 2724 2725 unsigned NumHexDigits; 2726 if (Kind == 'u') 2727 NumHexDigits = 4; 2728 else if (Kind == 'U') 2729 NumHexDigits = 8; 2730 else 2731 return 0; 2732 2733 if (!LangOpts.CPlusPlus && !LangOpts.C99) { 2734 if (Result && !isLexingRawMode()) 2735 Diag(SlashLoc, diag::warn_ucn_not_valid_in_c89); 2736 return 0; 2737 } 2738 2739 const char *CurPtr = StartPtr + CharSize; 2740 const char *KindLoc = &CurPtr[-1]; 2741 2742 uint32_t CodePoint = 0; 2743 for (unsigned i = 0; i < NumHexDigits; ++i) { 2744 char C = getCharAndSize(CurPtr, CharSize); 2745 2746 unsigned Value = llvm::hexDigitValue(C); 2747 if (Value == -1U) { 2748 if (Result && !isLexingRawMode()) { 2749 if (i == 0) { 2750 Diag(BufferPtr, diag::warn_ucn_escape_no_digits) 2751 << StringRef(KindLoc, 1); 2752 } else { 2753 Diag(BufferPtr, diag::warn_ucn_escape_incomplete); 2754 2755 // If the user wrote \U1234, suggest a fixit to \u. 2756 if (i == 4 && NumHexDigits == 8) { 2757 CharSourceRange URange = makeCharRange(*this, KindLoc, KindLoc + 1); 2758 Diag(KindLoc, diag::note_ucn_four_not_eight) 2759 << FixItHint::CreateReplacement(URange, "u"); 2760 } 2761 } 2762 } 2763 2764 return 0; 2765 } 2766 2767 CodePoint <<= 4; 2768 CodePoint += Value; 2769 2770 CurPtr += CharSize; 2771 } 2772 2773 if (Result) { 2774 Result->setFlag(Token::HasUCN); 2775 if (CurPtr - StartPtr == (ptrdiff_t)NumHexDigits + 2) 2776 StartPtr = CurPtr; 2777 else 2778 while (StartPtr != CurPtr) 2779 (void)getAndAdvanceChar(StartPtr, *Result); 2780 } else { 2781 StartPtr = CurPtr; 2782 } 2783 2784 // Don't apply C family restrictions to UCNs in assembly mode 2785 if (LangOpts.AsmPreprocessor) 2786 return CodePoint; 2787 2788 // C99 6.4.3p2: A universal character name shall not specify a character whose 2789 // short identifier is less than 00A0 other than 0024 ($), 0040 (@), or 2790 // 0060 (`), nor one in the range D800 through DFFF inclusive.) 2791 // C++11 [lex.charset]p2: If the hexadecimal value for a 2792 // universal-character-name corresponds to a surrogate code point (in the 2793 // range 0xD800-0xDFFF, inclusive), the program is ill-formed. Additionally, 2794 // if the hexadecimal value for a universal-character-name outside the 2795 // c-char-sequence, s-char-sequence, or r-char-sequence of a character or 2796 // string literal corresponds to a control character (in either of the 2797 // ranges 0x00-0x1F or 0x7F-0x9F, both inclusive) or to a character in the 2798 // basic source character set, the program is ill-formed. 2799 if (CodePoint < 0xA0) { 2800 if (CodePoint == 0x24 || CodePoint == 0x40 || CodePoint == 0x60) 2801 return CodePoint; 2802 2803 // We don't use isLexingRawMode() here because we need to warn about bad 2804 // UCNs even when skipping preprocessing tokens in a #if block. 2805 if (Result && PP) { 2806 if (CodePoint < 0x20 || CodePoint >= 0x7F) 2807 Diag(BufferPtr, diag::err_ucn_control_character); 2808 else { 2809 char C = static_cast<char>(CodePoint); 2810 Diag(BufferPtr, diag::err_ucn_escape_basic_scs) << StringRef(&C, 1); 2811 } 2812 } 2813 2814 return 0; 2815 2816 } else if (CodePoint >= 0xD800 && CodePoint <= 0xDFFF) { 2817 // C++03 allows UCNs representing surrogate characters. C99 and C++11 don't. 2818 // We don't use isLexingRawMode() here because we need to diagnose bad 2819 // UCNs even when skipping preprocessing tokens in a #if block. 2820 if (Result && PP) { 2821 if (LangOpts.CPlusPlus && !LangOpts.CPlusPlus11) 2822 Diag(BufferPtr, diag::warn_ucn_escape_surrogate); 2823 else 2824 Diag(BufferPtr, diag::err_ucn_escape_invalid); 2825 } 2826 return 0; 2827 } 2828 2829 return CodePoint; 2830 } 2831 2832 bool Lexer::CheckUnicodeWhitespace(Token &Result, uint32_t C, 2833 const char *CurPtr) { 2834 static const llvm::sys::UnicodeCharSet UnicodeWhitespaceChars( 2835 UnicodeWhitespaceCharRanges); 2836 if (!isLexingRawMode() && !PP->isPreprocessedOutput() && 2837 UnicodeWhitespaceChars.contains(C)) { 2838 Diag(BufferPtr, diag::ext_unicode_whitespace) 2839 << makeCharRange(*this, BufferPtr, CurPtr); 2840 2841 Result.setFlag(Token::LeadingSpace); 2842 return true; 2843 } 2844 return false; 2845 } 2846 2847 bool Lexer::LexUnicode(Token &Result, uint32_t C, const char *CurPtr) { 2848 if (isAllowedIDChar(C, LangOpts) && isAllowedInitiallyIDChar(C, LangOpts)) { 2849 if (!isLexingRawMode() && !ParsingPreprocessorDirective && 2850 !PP->isPreprocessedOutput()) { 2851 maybeDiagnoseIDCharCompat(PP->getDiagnostics(), C, 2852 makeCharRange(*this, BufferPtr, CurPtr), 2853 /*IsFirst=*/true); 2854 } 2855 2856 MIOpt.ReadToken(); 2857 return LexIdentifier(Result, CurPtr); 2858 } 2859 2860 if (!isLexingRawMode() && !ParsingPreprocessorDirective && 2861 !PP->isPreprocessedOutput() && 2862 !isASCII(*BufferPtr) && !isAllowedIDChar(C, LangOpts)) { 2863 // Non-ASCII characters tend to creep into source code unintentionally. 2864 // Instead of letting the parser complain about the unknown token, 2865 // just drop the character. 2866 // Note that we can /only/ do this when the non-ASCII character is actually 2867 // spelled as Unicode, not written as a UCN. The standard requires that 2868 // we not throw away any possible preprocessor tokens, but there's a 2869 // loophole in the mapping of Unicode characters to basic character set 2870 // characters that allows us to map these particular characters to, say, 2871 // whitespace. 2872 Diag(BufferPtr, diag::err_non_ascii) 2873 << FixItHint::CreateRemoval(makeCharRange(*this, BufferPtr, CurPtr)); 2874 2875 BufferPtr = CurPtr; 2876 return false; 2877 } 2878 2879 // Otherwise, we have an explicit UCN or a character that's unlikely to show 2880 // up by accident. 2881 MIOpt.ReadToken(); 2882 FormTokenWithChars(Result, CurPtr, tok::unknown); 2883 return true; 2884 } 2885 2886 void Lexer::PropagateLineStartLeadingSpaceInfo(Token &Result) { 2887 IsAtStartOfLine = Result.isAtStartOfLine(); 2888 HasLeadingSpace = Result.hasLeadingSpace(); 2889 HasLeadingEmptyMacro = Result.hasLeadingEmptyMacro(); 2890 // Note that this doesn't affect IsAtPhysicalStartOfLine. 2891 } 2892 2893 bool Lexer::Lex(Token &Result) { 2894 // Start a new token. 2895 Result.startToken(); 2896 2897 // Set up misc whitespace flags for LexTokenInternal. 2898 if (IsAtStartOfLine) { 2899 Result.setFlag(Token::StartOfLine); 2900 IsAtStartOfLine = false; 2901 } 2902 2903 if (HasLeadingSpace) { 2904 Result.setFlag(Token::LeadingSpace); 2905 HasLeadingSpace = false; 2906 } 2907 2908 if (HasLeadingEmptyMacro) { 2909 Result.setFlag(Token::LeadingEmptyMacro); 2910 HasLeadingEmptyMacro = false; 2911 } 2912 2913 bool atPhysicalStartOfLine = IsAtPhysicalStartOfLine; 2914 IsAtPhysicalStartOfLine = false; 2915 bool isRawLex = isLexingRawMode(); 2916 (void) isRawLex; 2917 bool returnedToken = LexTokenInternal(Result, atPhysicalStartOfLine); 2918 // (After the LexTokenInternal call, the lexer might be destroyed.) 2919 assert((returnedToken || !isRawLex) && "Raw lex must succeed"); 2920 return returnedToken; 2921 } 2922 2923 /// LexTokenInternal - This implements a simple C family lexer. It is an 2924 /// extremely performance critical piece of code. This assumes that the buffer 2925 /// has a null character at the end of the file. This returns a preprocessing 2926 /// token, not a normal token, as such, it is an internal interface. It assumes 2927 /// that the Flags of result have been cleared before calling this. 2928 bool Lexer::LexTokenInternal(Token &Result, bool TokAtPhysicalStartOfLine) { 2929 LexNextToken: 2930 // New token, can't need cleaning yet. 2931 Result.clearFlag(Token::NeedsCleaning); 2932 Result.setIdentifierInfo(nullptr); 2933 2934 // CurPtr - Cache BufferPtr in an automatic variable. 2935 const char *CurPtr = BufferPtr; 2936 2937 // Small amounts of horizontal whitespace is very common between tokens. 2938 if ((*CurPtr == ' ') || (*CurPtr == '\t')) { 2939 ++CurPtr; 2940 while ((*CurPtr == ' ') || (*CurPtr == '\t')) 2941 ++CurPtr; 2942 2943 // If we are keeping whitespace and other tokens, just return what we just 2944 // skipped. The next lexer invocation will return the token after the 2945 // whitespace. 2946 if (isKeepWhitespaceMode()) { 2947 FormTokenWithChars(Result, CurPtr, tok::unknown); 2948 // FIXME: The next token will not have LeadingSpace set. 2949 return true; 2950 } 2951 2952 BufferPtr = CurPtr; 2953 Result.setFlag(Token::LeadingSpace); 2954 } 2955 2956 unsigned SizeTmp, SizeTmp2; // Temporaries for use in cases below. 2957 2958 // Read a character, advancing over it. 2959 char Char = getAndAdvanceChar(CurPtr, Result); 2960 tok::TokenKind Kind; 2961 2962 switch (Char) { 2963 case 0: // Null. 2964 // Found end of file? 2965 if (CurPtr-1 == BufferEnd) 2966 return LexEndOfFile(Result, CurPtr-1); 2967 2968 // Check if we are performing code completion. 2969 if (isCodeCompletionPoint(CurPtr-1)) { 2970 // Return the code-completion token. 2971 Result.startToken(); 2972 FormTokenWithChars(Result, CurPtr, tok::code_completion); 2973 return true; 2974 } 2975 2976 if (!isLexingRawMode()) 2977 Diag(CurPtr-1, diag::null_in_file); 2978 Result.setFlag(Token::LeadingSpace); 2979 if (SkipWhitespace(Result, CurPtr, TokAtPhysicalStartOfLine)) 2980 return true; // KeepWhitespaceMode 2981 2982 // We know the lexer hasn't changed, so just try again with this lexer. 2983 // (We manually eliminate the tail call to avoid recursion.) 2984 goto LexNextToken; 2985 2986 case 26: // DOS & CP/M EOF: "^Z". 2987 // If we're in Microsoft extensions mode, treat this as end of file. 2988 if (LangOpts.MicrosoftExt) { 2989 if (!isLexingRawMode()) 2990 Diag(CurPtr-1, diag::ext_ctrl_z_eof_microsoft); 2991 return LexEndOfFile(Result, CurPtr-1); 2992 } 2993 2994 // If Microsoft extensions are disabled, this is just random garbage. 2995 Kind = tok::unknown; 2996 break; 2997 2998 case '\n': 2999 case '\r': 3000 // If we are inside a preprocessor directive and we see the end of line, 3001 // we know we are done with the directive, so return an EOD token. 3002 if (ParsingPreprocessorDirective) { 3003 // Done parsing the "line". 3004 ParsingPreprocessorDirective = false; 3005 3006 // Restore comment saving mode, in case it was disabled for directive. 3007 if (PP) 3008 resetExtendedTokenMode(); 3009 3010 // Since we consumed a newline, we are back at the start of a line. 3011 IsAtStartOfLine = true; 3012 IsAtPhysicalStartOfLine = true; 3013 3014 Kind = tok::eod; 3015 break; 3016 } 3017 3018 // No leading whitespace seen so far. 3019 Result.clearFlag(Token::LeadingSpace); 3020 3021 if (SkipWhitespace(Result, CurPtr, TokAtPhysicalStartOfLine)) 3022 return true; // KeepWhitespaceMode 3023 3024 // We only saw whitespace, so just try again with this lexer. 3025 // (We manually eliminate the tail call to avoid recursion.) 3026 goto LexNextToken; 3027 case ' ': 3028 case '\t': 3029 case '\f': 3030 case '\v': 3031 SkipHorizontalWhitespace: 3032 Result.setFlag(Token::LeadingSpace); 3033 if (SkipWhitespace(Result, CurPtr, TokAtPhysicalStartOfLine)) 3034 return true; // KeepWhitespaceMode 3035 3036 SkipIgnoredUnits: 3037 CurPtr = BufferPtr; 3038 3039 // If the next token is obviously a // or /* */ comment, skip it efficiently 3040 // too (without going through the big switch stmt). 3041 if (CurPtr[0] == '/' && CurPtr[1] == '/' && !inKeepCommentMode() && 3042 LangOpts.LineComment && 3043 (LangOpts.CPlusPlus || !LangOpts.TraditionalCPP)) { 3044 if (SkipLineComment(Result, CurPtr+2, TokAtPhysicalStartOfLine)) 3045 return true; // There is a token to return. 3046 goto SkipIgnoredUnits; 3047 } else if (CurPtr[0] == '/' && CurPtr[1] == '*' && !inKeepCommentMode()) { 3048 if (SkipBlockComment(Result, CurPtr+2, TokAtPhysicalStartOfLine)) 3049 return true; // There is a token to return. 3050 goto SkipIgnoredUnits; 3051 } else if (isHorizontalWhitespace(*CurPtr)) { 3052 goto SkipHorizontalWhitespace; 3053 } 3054 // We only saw whitespace, so just try again with this lexer. 3055 // (We manually eliminate the tail call to avoid recursion.) 3056 goto LexNextToken; 3057 3058 // C99 6.4.4.1: Integer Constants. 3059 // C99 6.4.4.2: Floating Constants. 3060 case '0': case '1': case '2': case '3': case '4': 3061 case '5': case '6': case '7': case '8': case '9': 3062 // Notify MIOpt that we read a non-whitespace/non-comment token. 3063 MIOpt.ReadToken(); 3064 return LexNumericConstant(Result, CurPtr); 3065 3066 case 'u': // Identifier (uber) or C11/C++11 UTF-8 or UTF-16 string literal 3067 // Notify MIOpt that we read a non-whitespace/non-comment token. 3068 MIOpt.ReadToken(); 3069 3070 if (LangOpts.CPlusPlus11 || LangOpts.C11) { 3071 Char = getCharAndSize(CurPtr, SizeTmp); 3072 3073 // UTF-16 string literal 3074 if (Char == '"') 3075 return LexStringLiteral(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3076 tok::utf16_string_literal); 3077 3078 // UTF-16 character constant 3079 if (Char == '\'') 3080 return LexCharConstant(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3081 tok::utf16_char_constant); 3082 3083 // UTF-16 raw string literal 3084 if (Char == 'R' && LangOpts.CPlusPlus11 && 3085 getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == '"') 3086 return LexRawStringLiteral(Result, 3087 ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3088 SizeTmp2, Result), 3089 tok::utf16_string_literal); 3090 3091 if (Char == '8') { 3092 char Char2 = getCharAndSize(CurPtr + SizeTmp, SizeTmp2); 3093 3094 // UTF-8 string literal 3095 if (Char2 == '"') 3096 return LexStringLiteral(Result, 3097 ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3098 SizeTmp2, Result), 3099 tok::utf8_string_literal); 3100 if (Char2 == '\'' && LangOpts.CPlusPlus1z) 3101 return LexCharConstant( 3102 Result, ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3103 SizeTmp2, Result), 3104 tok::utf8_char_constant); 3105 3106 if (Char2 == 'R' && LangOpts.CPlusPlus11) { 3107 unsigned SizeTmp3; 3108 char Char3 = getCharAndSize(CurPtr + SizeTmp + SizeTmp2, SizeTmp3); 3109 // UTF-8 raw string literal 3110 if (Char3 == '"') { 3111 return LexRawStringLiteral(Result, 3112 ConsumeChar(ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3113 SizeTmp2, Result), 3114 SizeTmp3, Result), 3115 tok::utf8_string_literal); 3116 } 3117 } 3118 } 3119 } 3120 3121 // treat u like the start of an identifier. 3122 return LexIdentifier(Result, CurPtr); 3123 3124 case 'U': // Identifier (Uber) or C11/C++11 UTF-32 string literal 3125 // Notify MIOpt that we read a non-whitespace/non-comment token. 3126 MIOpt.ReadToken(); 3127 3128 if (LangOpts.CPlusPlus11 || LangOpts.C11) { 3129 Char = getCharAndSize(CurPtr, SizeTmp); 3130 3131 // UTF-32 string literal 3132 if (Char == '"') 3133 return LexStringLiteral(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3134 tok::utf32_string_literal); 3135 3136 // UTF-32 character constant 3137 if (Char == '\'') 3138 return LexCharConstant(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3139 tok::utf32_char_constant); 3140 3141 // UTF-32 raw string literal 3142 if (Char == 'R' && LangOpts.CPlusPlus11 && 3143 getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == '"') 3144 return LexRawStringLiteral(Result, 3145 ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3146 SizeTmp2, Result), 3147 tok::utf32_string_literal); 3148 } 3149 3150 // treat U like the start of an identifier. 3151 return LexIdentifier(Result, CurPtr); 3152 3153 case 'R': // Identifier or C++0x raw string literal 3154 // Notify MIOpt that we read a non-whitespace/non-comment token. 3155 MIOpt.ReadToken(); 3156 3157 if (LangOpts.CPlusPlus11) { 3158 Char = getCharAndSize(CurPtr, SizeTmp); 3159 3160 if (Char == '"') 3161 return LexRawStringLiteral(Result, 3162 ConsumeChar(CurPtr, SizeTmp, Result), 3163 tok::string_literal); 3164 } 3165 3166 // treat R like the start of an identifier. 3167 return LexIdentifier(Result, CurPtr); 3168 3169 case 'L': // Identifier (Loony) or wide literal (L'x' or L"xyz"). 3170 // Notify MIOpt that we read a non-whitespace/non-comment token. 3171 MIOpt.ReadToken(); 3172 Char = getCharAndSize(CurPtr, SizeTmp); 3173 3174 // Wide string literal. 3175 if (Char == '"') 3176 return LexStringLiteral(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3177 tok::wide_string_literal); 3178 3179 // Wide raw string literal. 3180 if (LangOpts.CPlusPlus11 && Char == 'R' && 3181 getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == '"') 3182 return LexRawStringLiteral(Result, 3183 ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3184 SizeTmp2, Result), 3185 tok::wide_string_literal); 3186 3187 // Wide character constant. 3188 if (Char == '\'') 3189 return LexCharConstant(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3190 tok::wide_char_constant); 3191 // FALL THROUGH, treating L like the start of an identifier. 3192 3193 // C99 6.4.2: Identifiers. 3194 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': 3195 case 'H': case 'I': case 'J': case 'K': /*'L'*/case 'M': case 'N': 3196 case 'O': case 'P': case 'Q': /*'R'*/case 'S': case 'T': /*'U'*/ 3197 case 'V': case 'W': case 'X': case 'Y': case 'Z': 3198 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': 3199 case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': 3200 case 'o': case 'p': case 'q': case 'r': case 's': case 't': /*'u'*/ 3201 case 'v': case 'w': case 'x': case 'y': case 'z': 3202 case '_': 3203 // Notify MIOpt that we read a non-whitespace/non-comment token. 3204 MIOpt.ReadToken(); 3205 return LexIdentifier(Result, CurPtr); 3206 3207 case '$': // $ in identifiers. 3208 if (LangOpts.DollarIdents) { 3209 if (!isLexingRawMode()) 3210 Diag(CurPtr-1, diag::ext_dollar_in_identifier); 3211 // Notify MIOpt that we read a non-whitespace/non-comment token. 3212 MIOpt.ReadToken(); 3213 return LexIdentifier(Result, CurPtr); 3214 } 3215 3216 Kind = tok::unknown; 3217 break; 3218 3219 // C99 6.4.4: Character Constants. 3220 case '\'': 3221 // Notify MIOpt that we read a non-whitespace/non-comment token. 3222 MIOpt.ReadToken(); 3223 return LexCharConstant(Result, CurPtr, tok::char_constant); 3224 3225 // C99 6.4.5: String Literals. 3226 case '"': 3227 // Notify MIOpt that we read a non-whitespace/non-comment token. 3228 MIOpt.ReadToken(); 3229 return LexStringLiteral(Result, CurPtr, tok::string_literal); 3230 3231 // C99 6.4.6: Punctuators. 3232 case '?': 3233 Kind = tok::question; 3234 break; 3235 case '[': 3236 Kind = tok::l_square; 3237 break; 3238 case ']': 3239 Kind = tok::r_square; 3240 break; 3241 case '(': 3242 Kind = tok::l_paren; 3243 break; 3244 case ')': 3245 Kind = tok::r_paren; 3246 break; 3247 case '{': 3248 Kind = tok::l_brace; 3249 break; 3250 case '}': 3251 Kind = tok::r_brace; 3252 break; 3253 case '.': 3254 Char = getCharAndSize(CurPtr, SizeTmp); 3255 if (Char >= '0' && Char <= '9') { 3256 // Notify MIOpt that we read a non-whitespace/non-comment token. 3257 MIOpt.ReadToken(); 3258 3259 return LexNumericConstant(Result, ConsumeChar(CurPtr, SizeTmp, Result)); 3260 } else if (LangOpts.CPlusPlus && Char == '*') { 3261 Kind = tok::periodstar; 3262 CurPtr += SizeTmp; 3263 } else if (Char == '.' && 3264 getCharAndSize(CurPtr+SizeTmp, SizeTmp2) == '.') { 3265 Kind = tok::ellipsis; 3266 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3267 SizeTmp2, Result); 3268 } else { 3269 Kind = tok::period; 3270 } 3271 break; 3272 case '&': 3273 Char = getCharAndSize(CurPtr, SizeTmp); 3274 if (Char == '&') { 3275 Kind = tok::ampamp; 3276 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3277 } else if (Char == '=') { 3278 Kind = tok::ampequal; 3279 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3280 } else { 3281 Kind = tok::amp; 3282 } 3283 break; 3284 case '*': 3285 if (getCharAndSize(CurPtr, SizeTmp) == '=') { 3286 Kind = tok::starequal; 3287 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3288 } else { 3289 Kind = tok::star; 3290 } 3291 break; 3292 case '+': 3293 Char = getCharAndSize(CurPtr, SizeTmp); 3294 if (Char == '+') { 3295 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3296 Kind = tok::plusplus; 3297 } else if (Char == '=') { 3298 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3299 Kind = tok::plusequal; 3300 } else { 3301 Kind = tok::plus; 3302 } 3303 break; 3304 case '-': 3305 Char = getCharAndSize(CurPtr, SizeTmp); 3306 if (Char == '-') { // -- 3307 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3308 Kind = tok::minusminus; 3309 } else if (Char == '>' && LangOpts.CPlusPlus && 3310 getCharAndSize(CurPtr+SizeTmp, SizeTmp2) == '*') { // C++ ->* 3311 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3312 SizeTmp2, Result); 3313 Kind = tok::arrowstar; 3314 } else if (Char == '>') { // -> 3315 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3316 Kind = tok::arrow; 3317 } else if (Char == '=') { // -= 3318 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3319 Kind = tok::minusequal; 3320 } else { 3321 Kind = tok::minus; 3322 } 3323 break; 3324 case '~': 3325 Kind = tok::tilde; 3326 break; 3327 case '!': 3328 if (getCharAndSize(CurPtr, SizeTmp) == '=') { 3329 Kind = tok::exclaimequal; 3330 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3331 } else { 3332 Kind = tok::exclaim; 3333 } 3334 break; 3335 case '/': 3336 // 6.4.9: Comments 3337 Char = getCharAndSize(CurPtr, SizeTmp); 3338 if (Char == '/') { // Line comment. 3339 // Even if Line comments are disabled (e.g. in C89 mode), we generally 3340 // want to lex this as a comment. There is one problem with this though, 3341 // that in one particular corner case, this can change the behavior of the 3342 // resultant program. For example, In "foo //**/ bar", C89 would lex 3343 // this as "foo / bar" and langauges with Line comments would lex it as 3344 // "foo". Check to see if the character after the second slash is a '*'. 3345 // If so, we will lex that as a "/" instead of the start of a comment. 3346 // However, we never do this if we are just preprocessing. 3347 bool TreatAsComment = LangOpts.LineComment && 3348 (LangOpts.CPlusPlus || !LangOpts.TraditionalCPP); 3349 if (!TreatAsComment) 3350 if (!(PP && PP->isPreprocessedOutput())) 3351 TreatAsComment = getCharAndSize(CurPtr+SizeTmp, SizeTmp2) != '*'; 3352 3353 if (TreatAsComment) { 3354 if (SkipLineComment(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3355 TokAtPhysicalStartOfLine)) 3356 return true; // There is a token to return. 3357 3358 // It is common for the tokens immediately after a // comment to be 3359 // whitespace (indentation for the next line). Instead of going through 3360 // the big switch, handle it efficiently now. 3361 goto SkipIgnoredUnits; 3362 } 3363 } 3364 3365 if (Char == '*') { // /**/ comment. 3366 if (SkipBlockComment(Result, ConsumeChar(CurPtr, SizeTmp, Result), 3367 TokAtPhysicalStartOfLine)) 3368 return true; // There is a token to return. 3369 3370 // We only saw whitespace, so just try again with this lexer. 3371 // (We manually eliminate the tail call to avoid recursion.) 3372 goto LexNextToken; 3373 } 3374 3375 if (Char == '=') { 3376 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3377 Kind = tok::slashequal; 3378 } else { 3379 Kind = tok::slash; 3380 } 3381 break; 3382 case '%': 3383 Char = getCharAndSize(CurPtr, SizeTmp); 3384 if (Char == '=') { 3385 Kind = tok::percentequal; 3386 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3387 } else if (LangOpts.Digraphs && Char == '>') { 3388 Kind = tok::r_brace; // '%>' -> '}' 3389 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3390 } else if (LangOpts.Digraphs && Char == ':') { 3391 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3392 Char = getCharAndSize(CurPtr, SizeTmp); 3393 if (Char == '%' && getCharAndSize(CurPtr+SizeTmp, SizeTmp2) == ':') { 3394 Kind = tok::hashhash; // '%:%:' -> '##' 3395 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3396 SizeTmp2, Result); 3397 } else if (Char == '@' && LangOpts.MicrosoftExt) {// %:@ -> #@ -> Charize 3398 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3399 if (!isLexingRawMode()) 3400 Diag(BufferPtr, diag::ext_charize_microsoft); 3401 Kind = tok::hashat; 3402 } else { // '%:' -> '#' 3403 // We parsed a # character. If this occurs at the start of the line, 3404 // it's actually the start of a preprocessing directive. Callback to 3405 // the preprocessor to handle it. 3406 // TODO: -fpreprocessed mode?? 3407 if (TokAtPhysicalStartOfLine && !LexingRawMode && !Is_PragmaLexer) 3408 goto HandleDirective; 3409 3410 Kind = tok::hash; 3411 } 3412 } else { 3413 Kind = tok::percent; 3414 } 3415 break; 3416 case '<': 3417 Char = getCharAndSize(CurPtr, SizeTmp); 3418 if (ParsingFilename) { 3419 return LexAngledStringLiteral(Result, CurPtr); 3420 } else if (Char == '<') { 3421 char After = getCharAndSize(CurPtr+SizeTmp, SizeTmp2); 3422 if (After == '=') { 3423 Kind = tok::lesslessequal; 3424 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3425 SizeTmp2, Result); 3426 } else if (After == '<' && IsStartOfConflictMarker(CurPtr-1)) { 3427 // If this is actually a '<<<<<<<' version control conflict marker, 3428 // recognize it as such and recover nicely. 3429 goto LexNextToken; 3430 } else if (After == '<' && HandleEndOfConflictMarker(CurPtr-1)) { 3431 // If this is '<<<<' and we're in a Perforce-style conflict marker, 3432 // ignore it. 3433 goto LexNextToken; 3434 } else if (LangOpts.CUDA && After == '<') { 3435 Kind = tok::lesslessless; 3436 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3437 SizeTmp2, Result); 3438 } else { 3439 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3440 Kind = tok::lessless; 3441 } 3442 } else if (Char == '=') { 3443 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3444 Kind = tok::lessequal; 3445 } else if (LangOpts.Digraphs && Char == ':') { // '<:' -> '[' 3446 if (LangOpts.CPlusPlus11 && 3447 getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == ':') { 3448 // C++0x [lex.pptoken]p3: 3449 // Otherwise, if the next three characters are <:: and the subsequent 3450 // character is neither : nor >, the < is treated as a preprocessor 3451 // token by itself and not as the first character of the alternative 3452 // token <:. 3453 unsigned SizeTmp3; 3454 char After = getCharAndSize(CurPtr + SizeTmp + SizeTmp2, SizeTmp3); 3455 if (After != ':' && After != '>') { 3456 Kind = tok::less; 3457 if (!isLexingRawMode()) 3458 Diag(BufferPtr, diag::warn_cxx98_compat_less_colon_colon); 3459 break; 3460 } 3461 } 3462 3463 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3464 Kind = tok::l_square; 3465 } else if (LangOpts.Digraphs && Char == '%') { // '<%' -> '{' 3466 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3467 Kind = tok::l_brace; 3468 } else { 3469 Kind = tok::less; 3470 } 3471 break; 3472 case '>': 3473 Char = getCharAndSize(CurPtr, SizeTmp); 3474 if (Char == '=') { 3475 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3476 Kind = tok::greaterequal; 3477 } else if (Char == '>') { 3478 char After = getCharAndSize(CurPtr+SizeTmp, SizeTmp2); 3479 if (After == '=') { 3480 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3481 SizeTmp2, Result); 3482 Kind = tok::greatergreaterequal; 3483 } else if (After == '>' && IsStartOfConflictMarker(CurPtr-1)) { 3484 // If this is actually a '>>>>' conflict marker, recognize it as such 3485 // and recover nicely. 3486 goto LexNextToken; 3487 } else if (After == '>' && HandleEndOfConflictMarker(CurPtr-1)) { 3488 // If this is '>>>>>>>' and we're in a conflict marker, ignore it. 3489 goto LexNextToken; 3490 } else if (LangOpts.CUDA && After == '>') { 3491 Kind = tok::greatergreatergreater; 3492 CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), 3493 SizeTmp2, Result); 3494 } else { 3495 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3496 Kind = tok::greatergreater; 3497 } 3498 3499 } else { 3500 Kind = tok::greater; 3501 } 3502 break; 3503 case '^': 3504 Char = getCharAndSize(CurPtr, SizeTmp); 3505 if (Char == '=') { 3506 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3507 Kind = tok::caretequal; 3508 } else { 3509 Kind = tok::caret; 3510 } 3511 break; 3512 case '|': 3513 Char = getCharAndSize(CurPtr, SizeTmp); 3514 if (Char == '=') { 3515 Kind = tok::pipeequal; 3516 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3517 } else if (Char == '|') { 3518 // If this is '|||||||' and we're in a conflict marker, ignore it. 3519 if (CurPtr[1] == '|' && HandleEndOfConflictMarker(CurPtr-1)) 3520 goto LexNextToken; 3521 Kind = tok::pipepipe; 3522 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3523 } else { 3524 Kind = tok::pipe; 3525 } 3526 break; 3527 case ':': 3528 Char = getCharAndSize(CurPtr, SizeTmp); 3529 if (LangOpts.Digraphs && Char == '>') { 3530 Kind = tok::r_square; // ':>' -> ']' 3531 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3532 } else if (LangOpts.CPlusPlus && Char == ':') { 3533 Kind = tok::coloncolon; 3534 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3535 } else { 3536 Kind = tok::colon; 3537 } 3538 break; 3539 case ';': 3540 Kind = tok::semi; 3541 break; 3542 case '=': 3543 Char = getCharAndSize(CurPtr, SizeTmp); 3544 if (Char == '=') { 3545 // If this is '====' and we're in a conflict marker, ignore it. 3546 if (CurPtr[1] == '=' && HandleEndOfConflictMarker(CurPtr-1)) 3547 goto LexNextToken; 3548 3549 Kind = tok::equalequal; 3550 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3551 } else { 3552 Kind = tok::equal; 3553 } 3554 break; 3555 case ',': 3556 Kind = tok::comma; 3557 break; 3558 case '#': 3559 Char = getCharAndSize(CurPtr, SizeTmp); 3560 if (Char == '#') { 3561 Kind = tok::hashhash; 3562 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3563 } else if (Char == '@' && LangOpts.MicrosoftExt) { // #@ -> Charize 3564 Kind = tok::hashat; 3565 if (!isLexingRawMode()) 3566 Diag(BufferPtr, diag::ext_charize_microsoft); 3567 CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); 3568 } else { 3569 // We parsed a # character. If this occurs at the start of the line, 3570 // it's actually the start of a preprocessing directive. Callback to 3571 // the preprocessor to handle it. 3572 // TODO: -fpreprocessed mode?? 3573 if (TokAtPhysicalStartOfLine && !LexingRawMode && !Is_PragmaLexer) 3574 goto HandleDirective; 3575 3576 Kind = tok::hash; 3577 } 3578 break; 3579 3580 case '@': 3581 // Objective C support. 3582 if (CurPtr[-1] == '@' && LangOpts.ObjC1) 3583 Kind = tok::at; 3584 else 3585 Kind = tok::unknown; 3586 break; 3587 3588 // UCNs (C99 6.4.3, C++11 [lex.charset]p2) 3589 case '\\': 3590 if (uint32_t CodePoint = tryReadUCN(CurPtr, BufferPtr, &Result)) { 3591 if (CheckUnicodeWhitespace(Result, CodePoint, CurPtr)) { 3592 if (SkipWhitespace(Result, CurPtr, TokAtPhysicalStartOfLine)) 3593 return true; // KeepWhitespaceMode 3594 3595 // We only saw whitespace, so just try again with this lexer. 3596 // (We manually eliminate the tail call to avoid recursion.) 3597 goto LexNextToken; 3598 } 3599 3600 return LexUnicode(Result, CodePoint, CurPtr); 3601 } 3602 3603 Kind = tok::unknown; 3604 break; 3605 3606 default: { 3607 if (isASCII(Char)) { 3608 Kind = tok::unknown; 3609 break; 3610 } 3611 3612 UTF32 CodePoint; 3613 3614 // We can't just reset CurPtr to BufferPtr because BufferPtr may point to 3615 // an escaped newline. 3616 --CurPtr; 3617 ConversionResult Status = 3618 llvm::convertUTF8Sequence((const UTF8 **)&CurPtr, 3619 (const UTF8 *)BufferEnd, 3620 &CodePoint, 3621 strictConversion); 3622 if (Status == conversionOK) { 3623 if (CheckUnicodeWhitespace(Result, CodePoint, CurPtr)) { 3624 if (SkipWhitespace(Result, CurPtr, TokAtPhysicalStartOfLine)) 3625 return true; // KeepWhitespaceMode 3626 3627 // We only saw whitespace, so just try again with this lexer. 3628 // (We manually eliminate the tail call to avoid recursion.) 3629 goto LexNextToken; 3630 } 3631 return LexUnicode(Result, CodePoint, CurPtr); 3632 } 3633 3634 if (isLexingRawMode() || ParsingPreprocessorDirective || 3635 PP->isPreprocessedOutput()) { 3636 ++CurPtr; 3637 Kind = tok::unknown; 3638 break; 3639 } 3640 3641 // Non-ASCII characters tend to creep into source code unintentionally. 3642 // Instead of letting the parser complain about the unknown token, 3643 // just diagnose the invalid UTF-8, then drop the character. 3644 Diag(CurPtr, diag::err_invalid_utf8); 3645 3646 BufferPtr = CurPtr+1; 3647 // We're pretending the character didn't exist, so just try again with 3648 // this lexer. 3649 // (We manually eliminate the tail call to avoid recursion.) 3650 goto LexNextToken; 3651 } 3652 } 3653 3654 // Notify MIOpt that we read a non-whitespace/non-comment token. 3655 MIOpt.ReadToken(); 3656 3657 // Update the location of token as well as BufferPtr. 3658 FormTokenWithChars(Result, CurPtr, Kind); 3659 return true; 3660 3661 HandleDirective: 3662 // We parsed a # character and it's the start of a preprocessing directive. 3663 3664 FormTokenWithChars(Result, CurPtr, tok::hash); 3665 PP->HandleDirective(Result); 3666 3667 if (PP->hadModuleLoaderFatalFailure()) { 3668 // With a fatal failure in the module loader, we abort parsing. 3669 assert(Result.is(tok::eof) && "Preprocessor did not set tok:eof"); 3670 return true; 3671 } 3672 3673 // We parsed the directive; lex a token with the new state. 3674 return false; 3675 } 3676