diff options
Diffstat (limited to 'lib/Lex')
-rw-r--r-- | lib/Lex/Lexer.cpp | 11 | ||||
-rw-r--r-- | lib/Lex/LiteralSupport.cpp | 42 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 5 | ||||
-rw-r--r-- | lib/Lex/PPLexerChange.cpp | 20 | ||||
-rw-r--r-- | lib/Lex/PTHLexer.cpp | 14 |
5 files changed, 45 insertions, 47 deletions
diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index f4a4432..52a7a04 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -95,13 +95,11 @@ void Lexer::InitLexer(const char *BufStart, const char *BufPtr, /// with the specified preprocessor managing the lexing process. This lexer /// assumes that the associated file buffer and Preprocessor objects will /// outlive it, so it doesn't take ownership of either of them. -Lexer::Lexer(FileID FID, Preprocessor &PP) +Lexer::Lexer(FileID FID, const llvm::MemoryBuffer *InputFile, Preprocessor &PP) : PreprocessorLexer(&PP, FID), FileLoc(PP.getSourceManager().getLocForStartOfFile(FID)), Features(PP.getLangOptions()) { - const llvm::MemoryBuffer *InputFile = PP.getSourceManager().getBuffer(FID); - InitLexer(InputFile->getBufferStart(), InputFile->getBufferStart(), InputFile->getBufferEnd()); @@ -129,9 +127,9 @@ Lexer::Lexer(SourceLocation fileloc, const LangOptions &features, /// Lexer constructor - Create a new raw lexer object. This object is only /// suitable for calls to 'LexRawToken'. This lexer assumes that the text /// range will outlive it, so it doesn't take ownership of it. -Lexer::Lexer(FileID FID, const SourceManager &SM, const LangOptions &features) +Lexer::Lexer(FileID FID, const llvm::MemoryBuffer *FromFile, + const SourceManager &SM, const LangOptions &features) : FileLoc(SM.getLocForStartOfFile(FID)), Features(features) { - const llvm::MemoryBuffer *FromFile = SM.getBuffer(FID); InitLexer(FromFile->getBufferStart(), FromFile->getBufferStart(), FromFile->getBufferEnd()); @@ -163,7 +161,8 @@ Lexer *Lexer::Create_PragmaLexer(SourceLocation SpellingLoc, // Create the lexer as if we were going to lex the file normally. FileID SpellingFID = SM.getFileID(SpellingLoc); - Lexer *L = new Lexer(SpellingFID, PP); + const llvm::MemoryBuffer *InputFile = SM.getBuffer(SpellingFID); + Lexer *L = new Lexer(SpellingFID, InputFile, PP); // Now that the lexer is created, change the start/end locations so that we // just lex the subsection of the file that we want. This is lexing from a diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index 42dd75e..ab66942 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -375,46 +375,34 @@ NumericLiteralParser(const char *begin, const char *end, continue; // Success. case 'i': if (PP.getLangOptions().Microsoft) { + if (isFPConstant || isUnsigned || isLong || isLongLong) break; + // Allow i8, i16, i32, i64, and i128. if (s + 1 != ThisTokEnd) { switch (s[1]) { case '8': s += 2; // i8 suffix isMicrosoftInteger = true; - continue; + break; case '1': - s += 2; - if (s == ThisTokEnd) break; - if (*s == '6') s++; // i16 suffix - else if (*s == '2') { - if (++s == ThisTokEnd) break; - if (*s == '8') s++; // i128 suffix + if (s + 2 == ThisTokEnd) break; + if (s[2] == '6') s += 3; // i16 suffix + else if (s[2] == '2') { + if (s + 3 == ThisTokEnd) break; + if (s[3] == '8') s += 4; // i128 suffix } isMicrosoftInteger = true; - continue; + break; case '3': - s += 2; - if (s == ThisTokEnd) break; - if (*s == '2') s++; // i32 suffix + if (s + 2 == ThisTokEnd) break; + if (s[2] == '2') s += 3; // i32 suffix isMicrosoftInteger = true; - continue; + break; case '6': - s += 2; - if (s == ThisTokEnd) break; - if (*s == '4') s++; // i64 suffix + if (s + 2 == ThisTokEnd) break; + if (s[2] == '4') s += 3; // i64 suffix isMicrosoftInteger = true; - continue; - case 'f': // FP Suffix for "float" - case 'F': - if (!isFPConstant) break; // Error for integer constant. - if (isFloat || isLong) break; // FF, LF invalid. - isFloat = true; - if (isImaginary) break; // Cannot be repeated. - PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin), - diag::ext_imaginary_constant); - isImaginary = true; - s++; - continue; // Success. + break; default: break; } diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index dc7d95e..9caca33 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -16,6 +16,7 @@ #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/MacroInfo.h" #include "clang/Lex/LexDiagnostic.h" +#include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/APInt.h" using namespace clang; @@ -1111,7 +1112,9 @@ void Preprocessor::HandleIncludeDirective(Token &IncludeTok, } // Finally, if all is good, enter the new file! - EnterSourceFile(FID, CurDir); + if (EnterSourceFile(FID, CurDir)) + Diag(FilenameTok, diag::err_pp_error_opening_file) + << std::string(SourceMgr.getFileEntryForID(FID)->getName()); } /// HandleIncludeNextDirective - Implements #include_next. diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 41ed991..8a61d7b 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -63,9 +63,8 @@ PreprocessorLexer *Preprocessor::getCurrentFileLexer() const { //===----------------------------------------------------------------------===// /// EnterSourceFile - Add a source file to the top of the include stack and -/// start lexing tokens from it instead of the current buffer. Return true -/// on failure. -void Preprocessor::EnterSourceFile(FileID FID, const DirectoryLookup *CurDir) { +/// start lexing tokens from it instead of the current buffer. +bool Preprocessor::EnterSourceFile(FileID FID, const DirectoryLookup *CurDir) { assert(CurTokenLexer == 0 && "Cannot #include a file inside a macro!"); ++NumEnteredSourceFiles; @@ -73,10 +72,19 @@ void Preprocessor::EnterSourceFile(FileID FID, const DirectoryLookup *CurDir) { MaxIncludeStackDepth = IncludeMacroStack.size(); if (PTH) { - if (PTHLexer *PL = PTH->CreateLexer(FID)) - return EnterSourceFileWithPTH(PL, CurDir); + if (PTHLexer *PL = PTH->CreateLexer(FID)) { + EnterSourceFileWithPTH(PL, CurDir); + return false; + } } - EnterSourceFileWithLexer(new Lexer(FID, *this), CurDir); + + // Get the MemoryBuffer for this FID, if it fails, we fail. + const llvm::MemoryBuffer *InputFile = getSourceManager().getBuffer(FID); + if (InputFile == 0) + return true; + + EnterSourceFileWithLexer(new Lexer(FID, InputFile, *this), CurDir); + return false; } /// EnterSourceFileWithLexer - Add a source file to the top of the include stack diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index d6a73cc..a64008a 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -285,7 +285,7 @@ SourceLocation PTHLexer::getSourceLocation() { /// to map from FileEntry objects managed by FileManager to offsets within /// the PTH file. namespace { -class VISIBILITY_HIDDEN PTHFileData { +class PTHFileData { const uint32_t TokenOff; const uint32_t PPCondOff; public: @@ -297,7 +297,7 @@ public: }; -class VISIBILITY_HIDDEN PTHFileLookupCommonTrait { +class PTHFileLookupCommonTrait { public: typedef std::pair<unsigned char, const char*> internal_key_type; @@ -318,7 +318,7 @@ public: } }; -class VISIBILITY_HIDDEN PTHFileLookupTrait : public PTHFileLookupCommonTrait { +class PTHFileLookupTrait : public PTHFileLookupCommonTrait { public: typedef const FileEntry* external_key_type; typedef PTHFileData data_type; @@ -340,7 +340,7 @@ public: } }; -class VISIBILITY_HIDDEN PTHStringLookupTrait { +class PTHStringLookupTrait { public: typedef uint32_t data_type; @@ -597,7 +597,7 @@ PTHLexer *PTHManager::CreateLexer(FileID FID) { //===----------------------------------------------------------------------===// namespace { -class VISIBILITY_HIDDEN PTHStatData { +class PTHStatData { public: const bool hasStat; const ino_t ino; @@ -613,7 +613,7 @@ public: : hasStat(false), ino(0), dev(0), mode(0), mtime(0), size(0) {} }; -class VISIBILITY_HIDDEN PTHStatLookupTrait : public PTHFileLookupCommonTrait { +class PTHStatLookupTrait : public PTHFileLookupCommonTrait { public: typedef const char* external_key_type; // const char* typedef PTHStatData data_type; @@ -646,7 +646,7 @@ public: } }; -class VISIBILITY_HIDDEN PTHStatCache : public StatSysCallCache { +class PTHStatCache : public StatSysCallCache { typedef OnDiskChainedHashTable<PTHStatLookupTrait> CacheTy; CacheTy Cache; |