From: Volodymyr Sapsai Date: Wed, 25 Jul 2018 19:16:26 +0000 (+0000) Subject: [Preprocessor] Stop entering included files after hitting a fatal error. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb27abbb2b60f0f3c40844e81f1d1a378a05e360;p=clang [Preprocessor] Stop entering included files after hitting a fatal error. Fixes a problem when we have multiple inclusion cycles and try to enumerate all possible ways to reach the max inclusion depth. rdar://problem/38871876 Reviewers: bruno, rsmith, jkorous, aaron.ballman Reviewed By: bruno, jkorous, aaron.ballman Subscribers: dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D48786 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@337953 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 4ea0f485d3..d8dae73037 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1896,6 +1896,12 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, if (PPOpts->SingleFileParseMode) ShouldEnter = false; + // Any diagnostics after the fatal error will not be visible. As the + // compilation failed already and errors in subsequently included files won't + // be visible, avoid preprocessing those files. + if (ShouldEnter && Diags->hasFatalErrorOccurred()) + ShouldEnter = false; + // Determine whether we should try to import the module for this #include, if // there is one. Don't do so if precompiled module support is disabled or we // are processing this module textually (because we're building the module). diff --git a/test/Preprocessor/Inputs/cycle/a.h b/test/Preprocessor/Inputs/cycle/a.h new file mode 100644 index 0000000000..dd3ef35d61 --- /dev/null +++ b/test/Preprocessor/Inputs/cycle/a.h @@ -0,0 +1,8 @@ +// Presence of 2 inclusion cycles +// b.h -> a.h -> b.h -> ... +// c.h -> a.h -> c.h -> ... +// makes it unfeasible to reach max inclusion depth in all possible ways. Need +// to stop earlier. + +#include "b.h" +#include "c.h" diff --git a/test/Preprocessor/Inputs/cycle/b.h b/test/Preprocessor/Inputs/cycle/b.h new file mode 100644 index 0000000000..2243de1baf --- /dev/null +++ b/test/Preprocessor/Inputs/cycle/b.h @@ -0,0 +1 @@ +#include "a.h" diff --git a/test/Preprocessor/Inputs/cycle/c.h b/test/Preprocessor/Inputs/cycle/c.h new file mode 100644 index 0000000000..2243de1baf --- /dev/null +++ b/test/Preprocessor/Inputs/cycle/c.h @@ -0,0 +1 @@ +#include "a.h" diff --git a/test/Preprocessor/include-cycle.c b/test/Preprocessor/include-cycle.c new file mode 100644 index 0000000000..52fcfbd27a --- /dev/null +++ b/test/Preprocessor/include-cycle.c @@ -0,0 +1,5 @@ +// RUN: not %clang_cc1 -E -I%S/Inputs -ferror-limit 20 %s + +// Test that preprocessing terminates even if we have inclusion cycles. + +#include "cycle/a.h"