Index: clang/lib/Basic/SourceManager.cpp =================================================================== --- clang/lib/Basic/SourceManager.cpp +++ clang/lib/Basic/SourceManager.cpp @@ -111,6 +111,10 @@ if (!ContentsEntry) return None; + // Start with the assumption that the buffer is invalid to simplify early + // return paths. + IsBufferInvalid = true; + // Check that the file's size fits in an 'unsigned' (with room for a // past-the-end value). This is deeply regrettable, but various parts of // Clang (including elsewhere in this file!) use 'unsigned' to represent file @@ -125,7 +129,6 @@ Diag.Report(Loc, diag::err_file_too_large) << ContentsEntry->getName(); - IsBufferInvalid = true; return None; } @@ -145,7 +148,6 @@ Diag.Report(Loc, diag::err_cannot_open_file) << ContentsEntry->getName() << BufferOrError.getError().message(); - IsBufferInvalid = true; return None; } @@ -161,7 +163,6 @@ Diag.Report(Loc, diag::err_file_modified) << ContentsEntry->getName(); - IsBufferInvalid = true; return None; } @@ -174,10 +175,11 @@ if (InvalidBOM) { Diag.Report(Loc, diag::err_unsupported_bom) << InvalidBOM << ContentsEntry->getName(); - IsBufferInvalid = true; return None; } + // Buffer has been validated. + IsBufferInvalid = false; return Buffer->getMemBufferRef(); }