diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-03-15 22:54:52 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-03-15 22:54:52 +0000 |
| commit | 802b77601e50161f0b0d2451a722e11f3b49cdfb (patch) | |
| tree | fa9b72b5282af43966aff1b27012e481accbf26b /clang/lib/AST/ASTContext.cpp | |
| parent | 45c1505bf60a17a02846a823fac6d8544a27501c (diff) | |
| download | bcm5719-llvm-802b77601e50161f0b0d2451a722e11f3b49cdfb.tar.gz bcm5719-llvm-802b77601e50161f0b0d2451a722e11f3b49cdfb.zip | |
Introduce a new BufferResult class to act as the return type of
SourceManager's getBuffer() (and similar) operations. This abstract
can be used to force callers to cope with errors in getBuffer(), such
as missing files and changed files. Fix a bunch of callers to use the
new interface.
Add some very basic checks for file consistency (file size,
modification time) into ContentCache::getBuffer(), although these
checks don't help much until we've updated the main callers (e.g.,
SourceManager::getSpelling()).
llvm-svn: 98585
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index c64f97a97f1..6d90884ba94 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -423,10 +423,14 @@ namespace { /// (which requires a < after the Doxygen-comment delimiter). Otherwise, /// we only return true when we find a non-member comment. static bool -isDoxygenComment(SourceManager &SourceMgr, SourceRange Comment, - bool Member = false) { +isDoxygenComment(SourceManager &SourceMgr, Diagnostic &Diags, + SourceRange Comment, bool Member = false) { const char *BufferStart - = SourceMgr.getBufferData(SourceMgr.getFileID(Comment.getBegin())).first; + = SourceMgr.getBufferData(SourceMgr.getFileID(Comment.getBegin()), + Diags).first; + if (!BufferStart) + return false; + const char *Start = BufferStart + SourceMgr.getFileOffset(Comment.getBegin()); const char* End = BufferStart + SourceMgr.getFileOffset(Comment.getEnd()); @@ -444,7 +448,7 @@ isDoxygenComment(SourceManager &SourceMgr, SourceRange Comment, /// \brief Retrieve the comment associated with the given declaration, if /// it has one. -const char *ASTContext::getCommentForDecl(const Decl *D) { +const char *ASTContext::getCommentForDecl(const Decl *D, Diagnostic &Diags) { if (!D) return 0; @@ -489,12 +493,14 @@ const char *ASTContext::getCommentForDecl(const Decl *D) { std::pair<FileID, unsigned> DeclStartDecomp = SourceMgr.getDecomposedLoc(DeclStartLoc); const char *FileBufferStart - = SourceMgr.getBufferData(DeclStartDecomp.first).first; - + = SourceMgr.getBufferData(DeclStartDecomp.first, Diags).first; + if (!FileBufferStart) + return 0; + // First check whether we have a comment for a member. if (LastComment != Comments.end() && !isa<TagDecl>(D) && !isa<NamespaceDecl>(D) && - isDoxygenComment(SourceMgr, *LastComment, true)) { + isDoxygenComment(SourceMgr, Diags, *LastComment, true)) { std::pair<FileID, unsigned> LastCommentEndDecomp = SourceMgr.getDecomposedLoc(LastComment->getEnd()); if (DeclStartDecomp.first == LastCommentEndDecomp.first && @@ -526,7 +532,7 @@ const char *ASTContext::getCommentForDecl(const Decl *D) { return 0; // Check that we actually have a Doxygen comment. - if (!isDoxygenComment(SourceMgr, *LastComment)) + if (!isDoxygenComment(SourceMgr, Diags, *LastComment)) return 0; // Compute the starting line for the declaration and for the end of the @@ -561,7 +567,7 @@ const char *ASTContext::getCommentForDecl(const Decl *D) { } // If this comment is not a Doxygen comment, we're done. - if (!isDoxygenComment(SourceMgr, *FirstComment)) { + if (!isDoxygenComment(SourceMgr, Diags, *FirstComment)) { ++FirstComment; break; } |

