Index: clang/include/clang/Basic/DiagnosticCommonKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticCommonKinds.td +++ clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -304,4 +304,9 @@ "no analyzer checkers or packages are associated with '%0'">; def note_suggest_disabling_all_checkers : Note< "use -analyzer-disable-all-checks to disable all static analyzer checkers">; + +// Poison system directories. +def warn_poison_system_directories : Warning < + "include location '%0' is unsafe for cross-compilation">, + InGroup, DefaultIgnore; } Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -1066,6 +1066,10 @@ // multiversioning. def FunctionMultiVersioning : DiagGroup<"function-multiversion">; +// A warning group for warnings about including system headers when +// cross-compiling. +def PoisonSystemDirectories : DiagGroup<"poison-system-directories">; + def NoDeref : DiagGroup<"noderef">; // A group for cross translation unit static analysis related warnings. Index: clang/lib/Frontend/InitHeaderSearch.cpp =================================================================== --- clang/lib/Frontend/InitHeaderSearch.cpp +++ clang/lib/Frontend/InitHeaderSearch.cpp @@ -137,6 +137,18 @@ SmallString<256> MappedPathStorage; StringRef MappedPathStr = Path.toStringRef(MappedPathStorage); + // If use system headers/libraries while cross-compiling, + // emit the warning. + if (HasSysroot) { + if (MappedPathStr.startswith("/usr/include") || + MappedPathStr.startswith("/usr/local/include") || + MappedPathStr.startswith("/lib") || + MappedPathStr.startswith("/usr/local/lib")) { + Headers.getDiags().Report(diag::warn_poison_system_directories) + << MappedPathStr.str(); + } + } + // Compute the DirectoryLookup type. SrcMgr::CharacteristicKind Type; if (Group == Quoted || Group == Angled || Group == IndexHeaderMap) { Index: clang/test/Frontend/warning-poison-system-directories.c =================================================================== --- /dev/null +++ clang/test/Frontend/warning-poison-system-directories.c @@ -0,0 +1,27 @@ +// System directory and sysroot option causes warning. +// RUN: %clang -Wpoison-system-directories -target x86_64 -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s +// RUN: %clang -Wpoison-system-directories -target x86_64 -cxx-isystem/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s +// RUN: %clang -Wpoison-system-directories -target x86_64 -iquote/usr/local/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s +// RUN: %clang -Wpoison-system-directories -target x86_64 -isystem/usr/local/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s + +// Missing target but included sysroot still causes the warning. +// RUN: %clang -Wpoison-system-directories -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.2.stderr +// RUN: FileCheck -check-prefix=WARN < %t.2.stderr %s + +// With -Werror the warning causes the failure. +// RUN: not %clang -Werror=poison-system-directories -target x86_64 -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.3.stderr +// RUN: FileCheck -check-prefix=ERROR < %t.3.stderr %s + +// Cros target without sysroot causes no warning. +// RUN: %clang -Wpoison-system-directories -Werror -target x86_64 -I/usr/include -c -o - %s + +// By default the warning is off. +// RUN: %clang -Werror -target x86_64 -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s + +// WARN: warning: include location {{[^ ]+}} is unsafe for cross-compilation [-Wpoison-system-directories] + +// ERROR: error: include location {{[^ ]+}} is unsafe for cross-compilation [-Werror,-Wpoison-system-directories]