From aaf848cee4819e05ac6de949a6246c2d2b12299d Mon Sep 17 00:00:00 2001
From: Landon Fuller <landonf@macports.org>
Date: Fri, 23 Apr 2021 13:46:40 -0600
Subject: [PATCH 1/2] clang-11: Backport upstream clang-12 patch for <sysroot>
 for C++ headers

See https://reviews.llvm.org/D89001
---
 lang/llvm-11/Portfile                         |   5 +-
 ...-fix-include-next-sysroot-cpp-headers.diff | 232 ++++++++++++++++++
 2 files changed, 235 insertions(+), 2 deletions(-)
 create mode 100644 lang/llvm-11/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff

diff --git a/lang/llvm-11/Portfile b/lang/llvm-11/Portfile
index f658b8435ae..c7f59592658 100644
--- a/lang/llvm-11/Portfile
+++ b/lang/llvm-11/Portfile
@@ -25,7 +25,7 @@ checksums               rmd160  f566b4b75c8f30418f19069a9a84864ead766401 \
 
 name                    llvm-${llvm_version}
 revision                0
-subport                 clang-${llvm_version} { revision 1 }
+subport                 clang-${llvm_version} { revision 2 }
 subport                 flang-${llvm_version} { revision 0 }
 subport                 lldb-${llvm_version} { revision 0 }
 set suffix              mp-${llvm_version}
@@ -151,7 +151,8 @@ if {${subport} eq "clang-${llvm_version}"} {
         openmp-locations.patch \
         leopard-no-asan.patch \
         5000-patch-compilerrtdarwinutils-find-macosxsdkversion.diff \
-        5002-patch-toolchains-darwin-add-back-pre-10.6-link-libs.diff
+        5002-patch-toolchains-darwin-add-back-pre-10.6-link-libs.diff \
+        patch-clang-fix-include-next-sysroot-cpp-headers.diff
 }
 
 if {${subport} eq "flang-${llvm_version}"} {
diff --git a/lang/llvm-11/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff b/lang/llvm-11/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff
new file mode 100644
index 00000000000..59b5844f17d
--- /dev/null
+++ b/lang/llvm-11/files/patch-clang-fix-include-next-sysroot-cpp-headers.diff
@@ -0,0 +1,232 @@
+--- a/tools/clang/lib/Driver/ToolChains/Darwin.cpp
++++ b/tools/clang/lib/Driver/ToolChains/Darwin.cpp
+@@ -2021,21 +2021,42 @@ void DarwinClang::AddClangCXXStdlibIncludeArgs(
+ 
+   switch (GetCXXStdlibType(DriverArgs)) {
+   case ToolChain::CST_Libcxx: {
+-    // On Darwin, libc++ is installed alongside the compiler in
+-    // include/c++/v1, so get from '<install>/bin' to '<install>/include/c++/v1'.
+-    {
+-      llvm::SmallString<128> P = llvm::StringRef(getDriver().getInstalledDir());
+-      // Note that P can be relative, so we have to '..' and not parent_path.
+-      llvm::sys::path::append(P, "..", "include", "c++", "v1");
+-      addSystemInclude(DriverArgs, CC1Args, P);
++    // On Darwin, libc++ can be installed in one of the following two places:
++    // 1. Alongside the compiler in         <install>/include/c++/v1
++    // 2. In a SDK (or a custom sysroot) in <sysroot>/usr/include/c++/v1
++    //
++    // The precendence of paths is as listed above, i.e. we take the first path
++    // that exists. Also note that we never include libc++ twice -- we take the
++    // first path that exists and don't send the other paths to CC1 (otherwise
++    // include_next could break).
++
++    // Check for (1)
++    // Get from '<install>/bin' to '<install>/include/c++/v1'.
++    // Note that InstallBin can be relative, so we use '..' instead of
++    // parent_path.
++    llvm::SmallString<128> InstallBin =
++        llvm::StringRef(getDriver().getInstalledDir()); // <install>/bin
++    llvm::sys::path::append(InstallBin, "..", "include", "c++", "v1");
++    if (getVFS().exists(InstallBin)) {
++      addSystemInclude(DriverArgs, CC1Args, InstallBin);
++      return;
++    } else if (DriverArgs.hasArg(options::OPT_v)) {
++      llvm::errs() << "ignoring nonexistent directory \"" << InstallBin
++                   << "\"\n";
+     }
+-    // Also add <sysroot>/usr/include/c++/v1 unless -nostdinc is used,
+-    // to match the legacy behavior in CC1.
+-    if (!DriverArgs.hasArg(options::OPT_nostdinc)) {
+-      llvm::SmallString<128> P = Sysroot;
+-      llvm::sys::path::append(P, "usr", "include", "c++", "v1");
+-      addSystemInclude(DriverArgs, CC1Args, P);
++
++    // Otherwise, check for (2)
++    llvm::SmallString<128> SysrootUsr = Sysroot;
++    llvm::sys::path::append(SysrootUsr, "usr", "include", "c++", "v1");
++    if (getVFS().exists(SysrootUsr)) {
++      addSystemInclude(DriverArgs, CC1Args, SysrootUsr);
++      return;
++    } else if (DriverArgs.hasArg(options::OPT_v)) {
++      llvm::errs() << "ignoring nonexistent directory \"" << SysrootUsr
++                   << "\"\n";
+     }
++
++    // Otherwise, don't add any path.
+     break;
+   }
+ 
+--- a/tools/clang/test/Driver/darwin-header-search-libcxx.cpp
++++ b/tools/clang/test/Driver/darwin-header-search-libcxx.cpp
+@@ -13,39 +13,57 @@
+ // RUN:   | FileCheck --check-prefix=CHECK-LIBCXX-NONE %s
+ // CHECK-LIBCXX-NONE: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
+ 
+-// Check with only headers alongside the installation (those should be used,
+-// but we should still add /usr/include/c++/v1 after to preserve legacy).
++// Check with only headers alongside the installation (those 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:     --sysroot="" \
+-// RUN:   | FileCheck -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain --check-prefix=CHECK-LIBCXX-TOOLCHAIN-1 %s
++// RUN:   | FileCheck -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
++// RUN:               --check-prefix=CHECK-LIBCXX-TOOLCHAIN-1 %s
+ // CHECK-LIBCXX-TOOLCHAIN-1: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
+ // CHECK-LIBCXX-TOOLCHAIN-1: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
+-// CHECK-LIBCXX-TOOLCHAIN-1: "-internal-isystem" "/usr/include/c++/v1"
++// CHECK-LIBCXX-TOOLCHAIN-1-NOT: "-internal-isystem" "/usr/include/c++/v1"
+ //
+ // 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:     -isysroot %S/Inputs/basic_darwin_sdk_no_libcxx \
+-// RUN:   | FileCheck -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain --check-prefix=CHECK-LIBCXX-TOOLCHAIN-2 %s
++// RUN:   | FileCheck -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
++// RUN:               -DSYSROOT=%S/Inputs/basic_darwin_sdk_no_libcxx \
++// RUN:               --check-prefix=CHECK-LIBCXX-TOOLCHAIN-2 %s
+ // CHECK-LIBCXX-TOOLCHAIN-2: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
+ // CHECK-LIBCXX-TOOLCHAIN-2: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
++// CHECK-LIBCXX-TOOLCHAIN-2-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
++
++// Check with only headers in the sysroot (those 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_no_libcxx/usr/bin \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
++// RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain_no_libcxx \
++// RUN:               --check-prefix=CHECK-LIBCXX-SYSROOT-1 %s
++// CHECK-LIBCXX-SYSROOT-1: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
++// CHECK-LIBCXX-SYSROOT-1: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
++// CHECK-LIBCXX-SYSROOT-1-NOT: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
+ 
+ // Check with both headers in the sysroot and headers alongside the installation
+-// (the headers in <sysroot> should be added after the toolchain headers).
+-// Ensure that both -isysroot and --sysroot work, and that isysroot has precedence.
++// (the headers in the toolchain should be preferred over the <sysroot> headers).
++// Ensure that both -isysroot and --sysroot work, and that isysroot has precedence
++// over --sysroot.
+ //
+ // 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:     -isysroot %S/Inputs/basic_darwin_sdk_usr \
+-// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
+ // RUN:               --check-prefix=CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1 %s
+ //
+@@ -54,8 +72,8 @@
+ // 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_usr \
+-// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \
++// RUN:     --sysroot %S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
+ // RUN:               --check-prefix=CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1 %s
+ //
+@@ -64,32 +82,46 @@
+ // RUN:     -stdlib=libc++ \
+ // RUN:     -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \
+ // RUN:     -resource-dir=%S/Inputs/resource_dir \
+-// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:     --sysroot %S/Inputs/basic_darwin_sdk_no_libcxx \
+-// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
+ // RUN:               --check-prefix=CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1 %s
+ //
+ // CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
+ // CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
+-// CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
++// CHECK-LIBCXX-SYSROOT_AND_TOOLCHAIN-1-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
+ 
+-// Make sure that using -nostdinc will drop the sysroot C++ library include
+-// path, but not the toolchain one.
++// Make sure that using -nostdinc does not drop any C++ library include path.
++// This behavior is strange, but it is compatible with the legacy CC1 behavior.
+ //
+ // RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \
+ // RUN:     -target x86_64-apple-darwin16 \
+ // RUN:     -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \
+ // RUN:     -resource-dir=%S/Inputs/resource_dir \
+-// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:     -stdlib=platform \
+ // RUN:     -nostdinc \
+-// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
+-// RUN:               --check-prefix=CHECK-LIBCXX-NOSTDINC %s
+-// CHECK-LIBCXX-NOSTDINC: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
+-// CHECK-LIBCXX-NOSTDINC: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
+-// CHECK-LIBCXX-NOSTDINC-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
++// RUN:               --check-prefix=CHECK-LIBCXX-NOSTDINC-1 %s
++// CHECK-LIBCXX-NOSTDINC-1: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
++// CHECK-LIBCXX-NOSTDINC-1-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
++// CHECK-LIBCXX-NOSTDINC-1: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
++//
++// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \
++// RUN:     -target x86_64-apple-darwin16 \
++// RUN:     -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \
++// RUN:     -resource-dir=%S/Inputs/resource_dir \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_no_libcxx \
++// RUN:     -stdlib=platform \
++// RUN:     -nostdinc \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_no_libcxx \
++// RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain \
++// RUN:               --check-prefix=CHECK-LIBCXX-NOSTDINC-2 %s
++// CHECK-LIBCXX-NOSTDINC-2: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
++// CHECK-LIBCXX-NOSTDINC-2: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
++// CHECK-LIBCXX-NOSTDINC-2-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
+ 
+ // Make sure that using -nostdinc++ or -nostdlib will drop both the toolchain
+ // C++ include path and the sysroot one.
+@@ -98,7 +130,7 @@
+ // RUN:     -target x86_64-apple-darwin16 \
+ // RUN:     -ccc-install-dir %S/Inputs/basic_darwin_toolchain/usr/bin \
+ // RUN:     -resource-dir=%S/Inputs/resource_dir \
+-// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_usr_cxx_v1 \
+ // RUN:     -stdlib=platform \
+ // RUN:     -nostdinc++ \
+ // RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_usr \
+@@ -121,3 +153,26 @@
+ // CHECK-LIBCXX-NOSTDLIBINC: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
+ // CHECK-LIBCXX-NOSTDLIBINC-NOT: "-internal-isystem" "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
+ // CHECK-LIBCXX-NOSTDLIBINC-NOT: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
++
++// Make sure we explain that we considered a path but didn't add it when it
++// doesn't exist.
++//
++// RUN: %clang -no-canonical-prefixes %s -fsyntax-only -v 2>&1 \
++// RUN:     -target x86_64-apple-darwin \
++// RUN:     -ccc-install-dir %S/Inputs/basic_darwin_toolchain_no_libcxx/usr/bin \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk \
++// RUN:     -stdlib=libc++ \
++// RUN:   | FileCheck -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain_no_libcxx \
++// RUN:               --check-prefix=CHECK-LIBCXX-MISSING-TOOLCHAIN %s
++// CHECK-LIBCXX-MISSING-TOOLCHAIN: ignoring nonexistent directory "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
++//
++// RUN: %clang -no-canonical-prefixes %s -fsyntax-only -v 2>&1 \
++// RUN:     -target x86_64-apple-darwin \
++// RUN:     -ccc-install-dir %S/Inputs/basic_darwin_toolchain_no_libcxx/usr/bin \
++// RUN:     -isysroot %S/Inputs/basic_darwin_sdk_no_libcxx \
++// RUN:     -stdlib=libc++ \
++// RUN:   | FileCheck -DSYSROOT=%S/Inputs/basic_darwin_sdk_no_libcxx \
++// RUN:               -DTOOLCHAIN=%S/Inputs/basic_darwin_toolchain_no_libcxx \
++// RUN:               --check-prefix=CHECK-LIBCXX-MISSING-BOTH %s
++// CHECK-LIBCXX-MISSING-BOTH: ignoring nonexistent directory "[[TOOLCHAIN]]/usr/bin/../include/c++/v1"
++// CHECK-LIBCXX-MISSING-BOTH: ignoring nonexistent directory "[[SYSROOT]]/usr/include/c++/v1"
-- 
2.31.1

