Use SM.isWrittenInMainFile; suppress -Werror in preamble

SM.isWrittenInMainFile is to work around preamble bug: spurious err_pp_unterminated_conditional with circular #include
This commit is contained in:
Fangrui Song 2018-11-10 15:05:21 -08:00
parent d9a31a72bd
commit 985f5ec4d3
2 changed files with 7 additions and 2 deletions

View File

@ -209,7 +209,7 @@ public:
if (!L.isValid()) return; if (!L.isValid()) return;
const SourceManager &SM = Info.getSourceManager(); const SourceManager &SM = Info.getSourceManager();
StringRef Filename = SM.getFilename(Info.getLocation()); StringRef Filename = SM.getFilename(Info.getLocation());
bool concerned = IsConcerned(SM, Info.getLocation()); bool concerned = SM.isWrittenInMainFile(L);
auto fillDiagBase = [&](DiagBase &d) { auto fillDiagBase = [&](DiagBase &d) {
llvm::SmallString<64> Message; llvm::SmallString<64> Message;
Info.FormatDiagnostic(Message); Info.FormatDiagnostic(Message);
@ -303,6 +303,11 @@ void BuildPreamble(CompletionSession &session, CompilerInvocation &CI,
auto Bounds = ComputePreambleBounds(*CI.getLangOpts(), Buf.get(), 0); auto Bounds = ComputePreambleBounds(*CI.getLangOpts(), Buf.get(), 0);
if (OldP && OldP->Preamble.CanReuse(CI, Buf.get(), Bounds, FS.get())) if (OldP && OldP->Preamble.CanReuse(CI, Buf.get(), Bounds, FS.get()))
return; return;
// -Werror makes warnings issued as errors, which stops parsing
// prematurely because of -ferror-limit=. This also works around the issue
// of -Werror + -Wunused-parameter in interaction with SkipFunctionBodies.
auto &Ws = CI.getDiagnosticOpts().Warnings;
Ws.erase(std::remove(Ws.begin(), Ws.end(), "error"), Ws.end());
CI.getDiagnosticOpts().IgnoreWarnings = false; CI.getDiagnosticOpts().IgnoreWarnings = false;
CI.getFrontendOpts().SkipFunctionBodies = true; CI.getFrontendOpts().SkipFunctionBodies = true;
CI.getLangOpts()->CommentOpts.ParseAllComments = g_config->index.comments > 1; CI.getLangOpts()->CommentOpts.ParseAllComments = g_config->index.comments > 1;

View File

@ -707,7 +707,7 @@ public:
if (!db) if (!db)
return true; return true;
param.SeenFile(*FE); param.SeenFile(*FE);
if (!SM.isInMainFile(R.getBegin())) if (!SM.isWrittenInMainFile(R.getBegin()))
lid = GetFileLID(db, SM, *FE); lid = GetFileLID(db, SM, *FE);
} else { } else {
db = param.ConsumeFile(*FE); db = param.ConsumeFile(*FE);