diff options
author | Volodymyr Sapsai <vsapsai@apple.com> | 2018-07-25 19:16:26 +0000 |
---|---|---|
committer | Volodymyr Sapsai <vsapsai@apple.com> | 2018-07-25 19:16:26 +0000 |
commit | cb27abbb2b60f0f3c40844e81f1d1a378a05e360 (patch) | |
tree | df5aab4c586eecf44869e25189195481cb92df83 | |
parent | b4e6971ad794232deb402af54d49e215f5bab364 (diff) |
[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
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 6 | ||||
-rw-r--r-- | test/Preprocessor/Inputs/cycle/a.h | 8 | ||||
-rw-r--r-- | test/Preprocessor/Inputs/cycle/b.h | 1 | ||||
-rw-r--r-- | test/Preprocessor/Inputs/cycle/c.h | 1 | ||||
-rw-r--r-- | test/Preprocessor/include-cycle.c | 5 |
5 files changed, 21 insertions, 0 deletions
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" |