diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 54dc1b62df0d..5ee8378d52dd 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -449,6 +449,20 @@ public: /// if an internal buffer is returned. unsigned getSpelling(const Token &Tok, const char *&Buffer) const; + /// getPhysicalCharacterAt - Return a pointer to the start of the specified + /// location in the appropriate MemoryBuffer. + char getPhysicalCharacterAt(SourceLocation SL) const { + if (PTH) { + SL = SourceMgr.getPhysicalLoc(SL); + unsigned fid = SourceMgr.getCanonicalFileID(SL); + unsigned fpos = SourceMgr.getFullFilePos(SL); + const char* data; + if (PTH->getSpelling(fid, fpos, data)) + return *data; + } + + return *SourceMgr.getCharacterData(SL); + } /// CreateString - Plop the specified string into a scratch buffer and return /// a location for it. If specified, the source location provides a source diff --git a/clang/lib/Lex/PTHLexer.cpp b/clang/lib/Lex/PTHLexer.cpp index c5fc6f3da795..8d04736ced80 100644 --- a/clang/lib/Lex/PTHLexer.cpp +++ b/clang/lib/Lex/PTHLexer.cpp @@ -423,7 +423,7 @@ unsigned PTHSpellingSearch::getSpellingBinarySearch(unsigned fpos, unsigned PTHLexer::getSpelling(SourceLocation sloc, const char *&Buffer) { SourceManager& SM = PP->getSourceManager(); sloc = SM.getPhysicalLoc(sloc); - unsigned fid = sloc.getFileID(); + unsigned fid = SM.getCanonicalFileID(sloc); unsigned fpos = SM.getFullFilePos(sloc); return (fid == FileID ) ? MySpellingSrch.getSpellingLinearSearch(fpos, Buffer) diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index a815265e7c9a..e09ce1312de9 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -199,7 +199,7 @@ std::string Preprocessor::getSpelling(const Token &Tok) const { if (PTH) { SourceLocation sloc = SourceMgr.getPhysicalLoc(Tok.getLocation()); - unsigned fid = sloc.getFileID(); + unsigned fid = SourceMgr.getCanonicalFileID(sloc); unsigned fpos = SourceMgr.getFullFilePos(sloc); if (unsigned len = PTH->getSpelling(fid, fpos, TokStart)) { assert(!Tok.needsCleaning()); @@ -265,7 +265,7 @@ unsigned Preprocessor::getSpelling(const Token &Tok, } else { SourceLocation sloc = SourceMgr.getPhysicalLoc(Tok.getLocation()); - unsigned fid = sloc.getFileID(); + unsigned fid = SourceMgr.getCanonicalFileID(sloc); unsigned fpos = SourceMgr.getFullFilePos(sloc); len = PTH->getSpelling(fid, fpos, Buffer); } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 41881a2e5bb3..d7a041d0ecf9 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -846,13 +846,13 @@ Action::ExprResult Sema::ActOnNumericConstant(const Token &Tok) { // fast path for a single digit (which is quite common). A single digit // cannot have a trigraph, escaped newline, radix prefix, or type suffix. if (Tok.getLength() == 1) { - const char *Ty = PP.getSourceManager().getCharacterData(Tok.getLocation()); - + const char Ty = PP.getPhysicalCharacterAt(Tok.getLocation()); unsigned IntSize =static_cast(Context.getTypeSize(Context.IntTy)); - return ExprResult(new IntegerLiteral(llvm::APInt(IntSize, *Ty-'0'), + return ExprResult(new IntegerLiteral(llvm::APInt(IntSize, Ty-'0'), Context.IntTy, Tok.getLocation())); } + llvm::SmallString<512> IntegerBuffer; // Add padding so that NumericLiteralParser can overread by one character. IntegerBuffer.resize(Tok.getLength()+1);