diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -1778,7 +1778,7 @@ llvm::StringRef InstallDir = getDriver().getInstalledDir(); if (InstallDir.empty()) break; - // On Darwin, libc++ may be installed alongside the compiler in + // On Darwin, libc++ is installed alongside the compiler in // include/c++/v1. // Get from 'foo/bin' to 'foo/include/c++/v1'. SmallString<128> P = InstallDir; diff --git a/clang/lib/Frontend/InitHeaderSearch.cpp b/clang/lib/Frontend/InitHeaderSearch.cpp --- a/clang/lib/Frontend/InitHeaderSearch.cpp +++ b/clang/lib/Frontend/InitHeaderSearch.cpp @@ -467,7 +467,10 @@ if (Lang.CPlusPlus && !Lang.AsmPreprocessor && HSOpts.UseStandardCXXIncludes && HSOpts.UseStandardSystemIncludes) { if (HSOpts.UseLibcxx) { - AddPath("/usr/include/c++/v1", CXXSystem, false); + // On Darwin, all libc++ header search paths are handled in the driver. + if (!triple.isOSDarwin()) { + AddPath("/usr/include/c++/v1", CXXSystem, false); + } } else { AddDefaultCPlusPlusIncludePaths(Lang, triple, HSOpts); } diff --git a/clang/test/Driver/Inputs/basic_darwin_sdk/usr/bin/.keep b/clang/test/Driver/Inputs/basic_darwin_sdk/usr/bin/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/basic_darwin_sdk/usr/include/.keep b/clang/test/Driver/Inputs/basic_darwin_sdk/usr/include/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/basic_darwin_sdk/usr/lib/.keep b/clang/test/Driver/Inputs/basic_darwin_sdk/usr/lib/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/basic_darwin_toolchain/usr/bin/.keep b/clang/test/Driver/Inputs/basic_darwin_toolchain/usr/bin/.keep new file mode 100644 diff --git a/clang/test/Driver/Inputs/basic_darwin_toolchain/usr/include/c++/v1/.keep b/clang/test/Driver/Inputs/basic_darwin_toolchain/usr/include/c++/v1/.keep new file mode 100644 diff --git a/clang/test/Driver/darwin-header-search.cpp b/clang/test/Driver/darwin-header-search.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Driver/darwin-header-search.cpp @@ -0,0 +1,23 @@ +// General tests that the header search paths detected by the driver and passed +// to CC1 are sane on Darwin platforms. + +// Check a basic invocation (the headers alongside the toolchain should be used). +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-apple-darwin \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: | FileCheck -DINPUTS=%S/Inputs --check-prefix=CHECK-BASIC-LIBCXX-ISYSTEM %s +// CHECK-BASIC-LIBCXX-ISYSTEM: "{{[^"]*}}clang{{[^"]*}}" "-cc1" +// CHECK-BASIC-LIBCXX-ISYSTEM: "-internal-isystem" "[[INPUTS]]/basic_darwin_toolchain/usr/bin/../include/c++/v1" + +// Check with a custom -isysroot (the headers in the toolchain should still be used). +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -target x86_64-apple-darwin \ +// RUN: -stdlib=libc++ \ +// RUN: -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_darwin_sdk \ +// RUN: | FileCheck -DINPUTS=%S/Inputs --check-prefix=CHECK-BASIC-LIBCXX-ISYSTEM-WITH-SYSROOT %s +// CHECK-BASIC-LIBCXX-ISYSTEM-WITH-SYSROOT: "{{[^"]*}}clang{{[^"]*}}" "-cc1" +// CHECK-BASIC-LIBCXX-ISYSTEM-WITH-SYSROOT: "-internal-isystem" "[[INPUTS]]/basic_darwin_toolchain/usr/bin/../include/c++/v1"