Index: cfe/trunk/lib/Lex/PPDirectives.cpp =================================================================== --- cfe/trunk/lib/Lex/PPDirectives.cpp +++ cfe/trunk/lib/Lex/PPDirectives.cpp @@ -1896,6 +1896,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: cfe/trunk/test/Preprocessor/Inputs/cycle/a.h =================================================================== --- cfe/trunk/test/Preprocessor/Inputs/cycle/a.h +++ cfe/trunk/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: cfe/trunk/test/Preprocessor/Inputs/cycle/b.h =================================================================== --- cfe/trunk/test/Preprocessor/Inputs/cycle/b.h +++ cfe/trunk/test/Preprocessor/Inputs/cycle/b.h @@ -0,0 +1 @@ +#include "a.h" Index: cfe/trunk/test/Preprocessor/Inputs/cycle/c.h =================================================================== --- cfe/trunk/test/Preprocessor/Inputs/cycle/c.h +++ cfe/trunk/test/Preprocessor/Inputs/cycle/c.h @@ -0,0 +1 @@ +#include "a.h" Index: cfe/trunk/test/Preprocessor/include-cycle.c =================================================================== --- cfe/trunk/test/Preprocessor/include-cycle.c +++ cfe/trunk/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"