[clang] bce360b - Detect source location overflow due includes
Diogo Sampaio via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 24 15:56:54 PST 2020
Author: Diogo Sampaio
Date: 2020-01-24T23:56:47Z
New Revision: bce360b7048cc6306c9d04faf27b71eec8762041
URL: https://github.com/llvm/llvm-project/commit/bce360b7048cc6306c9d04faf27b71eec8762041
DIFF: https://github.com/llvm/llvm-project/commit/bce360b7048cc6306c9d04faf27b71eec8762041.diff
LOG: Detect source location overflow due includes
Summary:
As discussed in http://lists.llvm.org/pipermail/cfe-dev/2019-October/063459.html
the overflow of the souce locations (limited to 2^31 chars) can generate all sorts of
weird things (bogus warnings, hangs, crashes, miscompilation and correct compilation).
In debug mode this assert would fail. So it might be a good start, as in PR42301,
to detect the failure and exit with a proper error message.
Reviewers: rsmith, thakis, miyuki
Reviewed By: miyuki
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70183
Added:
clang/test/Lexer/Inputs/inc1.h
clang/test/Lexer/Inputs/inc2.h
clang/test/Lexer/SourceLocationsOverflow.c
Modified:
clang/include/clang/Basic/DiagnosticCommonKinds.td
clang/include/clang/Lex/Preprocessor.h
clang/lib/Basic/SourceManager.cpp
clang/lib/Lex/PPDirectives.cpp
clang/lib/Lex/Preprocessor.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index d6281f157eea..20b49605eb6f 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -282,6 +282,9 @@ def err_file_modified : Error<
"file '%0' modified since it was first processed">, DefaultFatal;
def err_file_too_large : Error<
"sorry, unsupported: file '%0' is too large for Clang to process">;
+def err_include_too_large : Error<
+ "sorry, this include generates a translation unit too large for"
+ " Clang to process.">, DefaultFatal;
def err_unsupported_bom : Error<"%0 byte order mark detected in '%1', but "
"encoding is not supported">, DefaultFatal;
def err_unable_to_rename_temp : Error<
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h
index 9716196b95c2..91f294b1d9b3 100644
--- a/clang/include/clang/Lex/Preprocessor.h
+++ b/clang/include/clang/Lex/Preprocessor.h
@@ -2203,12 +2203,14 @@ class Preprocessor {
ModuleBegin,
ModuleImport,
SkippedModuleImport,
+ Failure,
} Kind;
Module *ModuleForHeader = nullptr;
ImportAction(ActionKind AK, Module *Mod = nullptr)
: Kind(AK), ModuleForHeader(Mod) {
- assert((AK == None || Mod) && "no module for module action");
+ assert((AK == None || Mod || AK == Failure) &&
+ "no module for module action");
}
};
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index 73f2ae96d4a3..187c33ab9020 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -577,13 +577,15 @@ FileID SourceManager::createFileID(const ContentCache *File, StringRef Filename,
SLocEntryLoaded[Index] = true;
return FileID::get(LoadedID);
}
+ unsigned FileSize = File->getSize();
+ if (!(NextLocalOffset + FileSize + 1 > NextLocalOffset &&
+ NextLocalOffset + FileSize + 1 <= CurrentLoadedOffset)) {
+ Diag.Report(IncludePos, diag::err_include_too_large);
+ return FileID();
+ }
LocalSLocEntryTable.push_back(
SLocEntry::get(NextLocalOffset,
FileInfo::get(IncludePos, File, FileCharacter, Filename)));
- unsigned FileSize = File->getSize();
- assert(NextLocalOffset + FileSize + 1 > NextLocalOffset &&
- NextLocalOffset + FileSize + 1 <= CurrentLoadedOffset &&
- "Ran out of source locations!");
// We do a +1 here because we want a SourceLocation that means "the end of the
// file", e.g. for the "no newline at the end of the file" diagnostic.
NextLocalOffset += FileSize + 1;
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index e433b2cf1b95..660c4a5e089d 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -1708,6 +1708,13 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
tok::annot_module_include, Action.ModuleForHeader);
break;
+ case ImportAction::Failure:
+ assert(TheModuleLoader.HadFatalFailure &&
+ "This should be an early exit only to a fatal error");
+ TheModuleLoader.HadFatalFailure = true;
+ IncludeTok.setKind(tok::eof);
+ CurLexer->cutOffLexing();
+ return;
}
}
@@ -2165,7 +2172,10 @@ Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport(
if (IncludePos.isMacroID())
IncludePos = SourceMgr.getExpansionRange(IncludePos).getEnd();
FileID FID = SourceMgr.createFileID(*File, IncludePos, FileCharacter);
- assert(FID.isValid() && "Expected valid file ID");
+ if (!FID.isValid()) {
+ TheModuleLoader.HadFatalFailure = true;
+ return ImportAction::Failure;
+ }
// If all is good, enter the new file!
if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp
index 0e9be3923630..a18dc4af4226 100644
--- a/clang/lib/Lex/Preprocessor.cpp
+++ b/clang/lib/Lex/Preprocessor.cpp
@@ -906,6 +906,9 @@ void Preprocessor::Lex(Token &Result) {
}
} while (!ReturnedToken);
+ if (Result.is(tok::unknown) && TheModuleLoader.HadFatalFailure)
+ return;
+
if (Result.is(tok::code_completion) && Result.getIdentifierInfo()) {
// Remember the identifier before code completion token.
setCodeCompletionIdentifierInfo(Result.getIdentifierInfo());
@@ -1200,6 +1203,13 @@ bool Preprocessor::LexAfterModuleImport(Token &Result) {
Suffix[0].setAnnotationValue(Action.ModuleForHeader);
// FIXME: Call the moduleImport callback?
break;
+ case ImportAction::Failure:
+ assert(TheModuleLoader.HadFatalFailure &&
+ "This should be an early exit only to a fatal error");
+ Result.setKind(tok::eof);
+ CurLexer->cutOffLexing();
+ EnterTokens(Suffix);
+ return true;
}
EnterTokens(Suffix);
diff --git a/clang/test/Lexer/Inputs/inc1.h b/clang/test/Lexer/Inputs/inc1.h
new file mode 100644
index 000000000000..f7fd716d54c9
--- /dev/null
+++ b/clang/test/Lexer/Inputs/inc1.h
@@ -0,0 +1,1470 @@
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
+#include "inc2.h"
diff --git a/clang/test/Lexer/Inputs/inc2.h b/clang/test/Lexer/Inputs/inc2.h
new file mode 100644
index 000000000000..a827dc7fc0d0
--- /dev/null
+++ b/clang/test/Lexer/Inputs/inc2.h
@@ -0,0 +1,1000 @@
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
+/*...............................................................................................*/
diff --git a/clang/test/Lexer/SourceLocationsOverflow.c b/clang/test/Lexer/SourceLocationsOverflow.c
new file mode 100644
index 000000000000..d2313ea4324d
--- /dev/null
+++ b/clang/test/Lexer/SourceLocationsOverflow.c
@@ -0,0 +1,25 @@
+// RUN: not %clang %s -S -o - 2>&1 | FileCheck %s
+// CHECK: In file included from {{.*}}SourceLocationsOverflow.c
+// CHECK-NEXT: inc1.h{{.*}}: fatal error: sorry, this include generates a translation unit too large for Clang to process.
+// CHECK-NEXT: #include "inc2.h"
+// CHECK-NEXT: ^
+// CHECK-NEXT: 1 error generated.
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
+#include "Inputs/inc1.h"
More information about the cfe-commits
mailing list