vsapsai updated this revision to Diff 156911. vsapsai added a comment. - Tweak the comment according to review comments.
Undiscussed changes: we don't stop preprocessing entirely, only in included files; not using better-sounding "skip" deliberately as it might be confused with `FileSkipped` API. https://reviews.llvm.org/D48786 Files: clang/lib/Lex/PPDirectives.cpp clang/test/Preprocessor/Inputs/cycle/a.h clang/test/Preprocessor/Inputs/cycle/b.h clang/test/Preprocessor/Inputs/cycle/c.h clang/test/Preprocessor/include-cycle.c Index: clang/test/Preprocessor/include-cycle.c =================================================================== --- /dev/null +++ clang/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" Index: clang/test/Preprocessor/Inputs/cycle/c.h =================================================================== --- /dev/null +++ clang/test/Preprocessor/Inputs/cycle/c.h @@ -0,0 +1 @@ +#include "a.h" Index: clang/test/Preprocessor/Inputs/cycle/b.h =================================================================== --- /dev/null +++ clang/test/Preprocessor/Inputs/cycle/b.h @@ -0,0 +1 @@ +#include "a.h" Index: clang/test/Preprocessor/Inputs/cycle/a.h =================================================================== --- /dev/null +++ clang/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" Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1871,6 +1871,12 @@ 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).
Index: clang/test/Preprocessor/include-cycle.c =================================================================== --- /dev/null +++ clang/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" Index: clang/test/Preprocessor/Inputs/cycle/c.h =================================================================== --- /dev/null +++ clang/test/Preprocessor/Inputs/cycle/c.h @@ -0,0 +1 @@ +#include "a.h" Index: clang/test/Preprocessor/Inputs/cycle/b.h =================================================================== --- /dev/null +++ clang/test/Preprocessor/Inputs/cycle/b.h @@ -0,0 +1 @@ +#include "a.h" Index: clang/test/Preprocessor/Inputs/cycle/a.h =================================================================== --- /dev/null +++ clang/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" Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1871,6 +1871,12 @@ 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).
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits