<div dir="ltr">Sorry for the late response,<br><br><div class="gmail_quote"><div dir="ltr">On Sat, 18 Aug 2018 at 20:10, Nico Weber <<a href="mailto:thakis@chromium.org">thakis@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Also, the diag text should probably say "pass '-stdlib=libc++' " not "pass '-std=libc++' "?</div></blockquote><div><br></div><div>Good catch, thanks! I'll commit a fixup for it.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><div class="gmail_quote"><div dir="ltr">On Sat, Aug 18, 2018 at 11:06 PM Nico Weber <<a href="mailto:thakis@chromium.org" target="_blank">thakis@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Should this maybe not be emitted when compiling e.g. .ii files (preprocessed output)? I just got this when I built a standalone .ii file with some bug repro after I deleted all -I and -isysroot flags and whatnot, since they aren't needed for preprocessed files.</div></blockquote></div></blockquote><div><br></div><div>That would make sense, but I'm not sure how easy it is to determine if a file is already preprocessed. I'll try to create a patch for this fixup.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 19, 2018 at 6:52 PM Alex Lorenz via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: arphaman<br>
Date: Tue Jun 19 15:47:53 2018<br>
New Revision: 335081<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=335081&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=335081&view=rev</a><br>
Log:<br>
Recommit r335063: [Darwin] Add a warning for missing include path for libstdc++<br>
<br>
The recommit ensures that the tests that failed on bots don't trigger the warning.<br>
<br>
Xcode 10 removes support for libstdc++, but the users just get a confusing<br>
include not file warning when including an STL header (when building for iOS6<br>
which uses libstdc++ by default for example).<br>
This patch adds a new warning that lets the user know that the libstdc++ include<br>
path was not found to ensure that the user is more aware of why the error occurs.<br>
<br>
rdar://40830462<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D48297" rel="noreferrer" target="_blank">https://reviews.llvm.org/D48297</a><br>
<br>
Added:<br>
    cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
    cfe/trunk/include/clang/Lex/HeaderSearch.h<br>
    cfe/trunk/lib/Frontend/InitHeaderSearch.cpp<br>
    cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp<br>
    cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=335081&r1=335080&r2=335081&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=335081&r1=335080&r2=335081&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Tue Jun 19 15:47:53 2018<br>
@@ -236,4 +236,9 @@ def err_invalid_vfs_overlay : Error<<br>
<br>
 def warn_option_invalid_ocl_version : Warning<<br>
   "OpenCL version %0 does not support the option '%1'">, InGroup<Deprecated>;<br>
+<br>
+def warn_stdlibcxx_not_found : Warning<<br>
+  "include path for stdlibc++ headers not found; pass '-std=libc++' on the "<br>
+  "command line to use the libc++ standard library instead">,<br>
+  InGroup<DiagGroup<"stdlibcxx-not-found">>;<br>
 }<br>
<br>
Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=335081&r1=335080&r2=335081&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=335081&r1=335080&r2=335081&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)<br>
+++ cfe/trunk/include/clang/Lex/HeaderSearch.h Tue Jun 19 15:47:53 2018<br>
@@ -272,6 +272,8 @@ public:<br>
<br>
   FileManager &getFileMgr() const { return FileMgr; }<br>
<br>
+  DiagnosticsEngine &getDiags() const { return Diags; }<br>
+<br>
   /// Interface for setting the file search paths.<br>
   void SetSearchPaths(const std::vector<DirectoryLookup> &dirs,<br>
                       unsigned angledDirIdx, unsigned systemDirIdx,<br>
<br>
Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=335081&r1=335080&r2=335081&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=335081&r1=335080&r2=335081&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Tue Jun 19 15:47:53 2018<br>
@@ -14,6 +14,7 @@<br>
 #include "clang/Basic/FileManager.h"<br>
 #include "clang/Basic/LangOptions.h"<br>
 #include "clang/Config/config.h" // C_INCLUDE_DIRS<br>
+#include "clang/Frontend/FrontendDiagnostic.h"<br>
 #include "clang/Frontend/Utils.h"<br>
 #include "clang/Lex/HeaderMap.h"<br>
 #include "clang/Lex/HeaderSearch.h"<br>
@@ -55,11 +56,13 @@ public:<br>
<br>
   /// AddPath - Add the specified path to the specified group list, prefixing<br>
   /// the sysroot if used.<br>
-  void AddPath(const Twine &Path, IncludeDirGroup Group, bool isFramework);<br>
+  /// Returns true if the path exists, false if it was ignored.<br>
+  bool AddPath(const Twine &Path, IncludeDirGroup Group, bool isFramework);<br>
<br>
   /// AddUnmappedPath - Add the specified path to the specified group list,<br>
   /// without performing any sysroot remapping.<br>
-  void AddUnmappedPath(const Twine &Path, IncludeDirGroup Group,<br>
+  /// Returns true if the path exists, false if it was ignored.<br>
+  bool AddUnmappedPath(const Twine &Path, IncludeDirGroup Group,<br>
                        bool isFramework);<br>
<br>
   /// AddSystemHeaderPrefix - Add the specified prefix to the system header<br>
@@ -70,10 +73,9 @@ public:<br>
<br>
   /// AddGnuCPlusPlusIncludePaths - Add the necessary paths to support a gnu<br>
   ///  libstdc++.<br>
-  void AddGnuCPlusPlusIncludePaths(StringRef Base,<br>
-                                   StringRef ArchDir,<br>
-                                   StringRef Dir32,<br>
-                                   StringRef Dir64,<br>
+  /// Returns true if the \p Base path was found, false if it does not exist.<br>
+  bool AddGnuCPlusPlusIncludePaths(StringRef Base, StringRef ArchDir,<br>
+                                   StringRef Dir32, StringRef Dir64,<br>
                                    const llvm::Triple &triple);<br>
<br>
   /// AddMinGWCPlusPlusIncludePaths - Add the necessary paths to support a MinGW<br>
@@ -88,7 +90,8 @@ public:<br>
<br>
   // AddDefaultCPlusPlusIncludePaths -  Add paths that should be searched when<br>
   //  compiling c++.<br>
-  void AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple,<br>
+  void AddDefaultCPlusPlusIncludePaths(const LangOptions &LangOpts,<br>
+                                       const llvm::Triple &triple,<br>
                                        const HeaderSearchOptions &HSOpts);<br>
<br>
   /// AddDefaultSystemIncludePaths - Adds the default system include paths so<br>
@@ -112,7 +115,7 @@ static bool CanPrefixSysroot(StringRef P<br>
 #endif<br>
 }<br>
<br>
-void InitHeaderSearch::AddPath(const Twine &Path, IncludeDirGroup Group,<br>
+bool InitHeaderSearch::AddPath(const Twine &Path, IncludeDirGroup Group,<br>
                                bool isFramework) {<br>
   // Add the path with sysroot prepended, if desired and this is a system header<br>
   // group.<br>
@@ -120,15 +123,14 @@ void InitHeaderSearch::AddPath(const Twi<br>
     SmallString<256> MappedPathStorage;<br>
     StringRef MappedPathStr = Path.toStringRef(MappedPathStorage);<br>
     if (CanPrefixSysroot(MappedPathStr)) {<br>
-      AddUnmappedPath(IncludeSysroot + Path, Group, isFramework);<br>
-      return;<br>
+      return AddUnmappedPath(IncludeSysroot + Path, Group, isFramework);<br>
     }<br>
   }<br>
<br>
-  AddUnmappedPath(Path, Group, isFramework);<br>
+  return AddUnmappedPath(Path, Group, isFramework);<br>
 }<br>
<br>
-void InitHeaderSearch::AddUnmappedPath(const Twine &Path, IncludeDirGroup Group,<br>
+bool InitHeaderSearch::AddUnmappedPath(const Twine &Path, IncludeDirGroup Group,<br>
                                        bool isFramework) {<br>
   assert(!Path.isTriviallyEmpty() && "can't handle empty path here");<br>
<br>
@@ -150,7 +152,7 @@ void InitHeaderSearch::AddUnmappedPath(c<br>
   if (const DirectoryEntry *DE = FM.getDirectory(MappedPathStr)) {<br>
     IncludePath.push_back(<br>
       std::make_pair(Group, DirectoryLookup(DE, Type, isFramework)));<br>
-    return;<br>
+    return true;<br>
   }<br>
<br>
   // Check to see if this is an apple-style headermap (which are not allowed to<br>
@@ -162,7 +164,7 @@ void InitHeaderSearch::AddUnmappedPath(c<br>
         IncludePath.push_back(<br>
           std::make_pair(Group,<br>
                          DirectoryLookup(HM, Type, Group == IndexHeaderMap)));<br>
-        return;<br>
+        return true;<br>
       }<br>
     }<br>
   }<br>
@@ -170,15 +172,16 @@ void InitHeaderSearch::AddUnmappedPath(c<br>
   if (Verbose)<br>
     llvm::errs() << "ignoring nonexistent directory \""<br>
                  << MappedPathStr << "\"\n";<br>
+  return false;<br>
 }<br>
<br>
-void InitHeaderSearch::AddGnuCPlusPlusIncludePaths(StringRef Base,<br>
+bool InitHeaderSearch::AddGnuCPlusPlusIncludePaths(StringRef Base,<br>
                                                    StringRef ArchDir,<br>
                                                    StringRef Dir32,<br>
                                                    StringRef Dir64,<br>
                                                    const llvm::Triple &triple) {<br>
   // Add the base dir<br>
-  AddPath(Base, CXXSystem, false);<br>
+  bool IsBaseFound = AddPath(Base, CXXSystem, false);<br>
<br>
   // Add the multilib dirs<br>
   llvm::Triple::ArchType arch = triple.getArch();<br>
@@ -190,6 +193,7 @@ void InitHeaderSearch::AddGnuCPlusPlusIn<br>
<br>
   // Add the backward dir<br>
   AddPath(Base + "/backward", CXXSystem, false);<br>
+  return IsBaseFound;<br>
 }<br>
<br>
 void InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(StringRef Base,<br>
@@ -354,46 +358,55 @@ void InitHeaderSearch::AddDefaultCInclud<br>
   }<br>
 }<br>
<br>
-void InitHeaderSearch::<br>
-AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts) {<br>
+void InitHeaderSearch::AddDefaultCPlusPlusIncludePaths(<br>
+    const LangOptions &LangOpts, const llvm::Triple &triple,<br>
+    const HeaderSearchOptions &HSOpts) {<br>
   llvm::Triple::OSType os = triple.getOS();<br>
   // FIXME: temporary hack: hard-coded paths.<br>
<br>
   if (triple.isOSDarwin()) {<br>
+    bool IsBaseFound = true;<br>
     switch (triple.getArch()) {<br>
     default: break;<br>
<br>
     case llvm::Triple::ppc:<br>
     case llvm::Triple::ppc64:<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
-                                  "powerpc-apple-darwin10", "", "ppc64",<br>
-                                  triple);<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",<br>
-                                  "powerpc-apple-darwin10", "", "ppc64",<br>
-                                  triple);<br>
+      IsBaseFound = AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
+                                                "powerpc-apple-darwin10", "",<br>
+                                                "ppc64", triple);<br>
+      IsBaseFound |= AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",<br>
+                                                 "powerpc-apple-darwin10", "",<br>
+                                                 "ppc64", triple);<br>
       break;<br>
<br>
     case llvm::Triple::x86:<br>
     case llvm::Triple::x86_64:<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
-                                  "i686-apple-darwin10", "", "x86_64", triple);<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",<br>
-                                  "i686-apple-darwin8", "", "", triple);<br>
+      IsBaseFound = AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
+                                                "i686-apple-darwin10", "",<br>
+                                                "x86_64", triple);<br>
+      IsBaseFound |= AddGnuCPlusPlusIncludePaths(<br>
+          "/usr/include/c++/4.0.0", "i686-apple-darwin8", "", "", triple);<br>
       break;<br>
<br>
     case llvm::Triple::arm:<br>
     case llvm::Triple::thumb:<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
-                                  "arm-apple-darwin10", "v7", "", triple);<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
-                                  "arm-apple-darwin10", "v6", "", triple);<br>
+      IsBaseFound = AddGnuCPlusPlusIncludePaths(<br>
+          "/usr/include/c++/4.2.1", "arm-apple-darwin10", "v7", "", triple);<br>
+      IsBaseFound |= AddGnuCPlusPlusIncludePaths(<br>
+          "/usr/include/c++/4.2.1", "arm-apple-darwin10", "v6", "", triple);<br>
       break;<br>
<br>
     case llvm::Triple::aarch64:<br>
-      AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",<br>
-                                  "arm64-apple-darwin10", "", "", triple);<br>
+      IsBaseFound = AddGnuCPlusPlusIncludePaths(<br>
+          "/usr/include/c++/4.2.1", "arm64-apple-darwin10", "", "", triple);<br>
       break;<br>
     }<br>
+    // Warn when compiling pure C++ / Objective-C++ only.<br>
+    if (!IsBaseFound &&<br>
+        !(LangOpts.CUDA || LangOpts.OpenCL || LangOpts.RenderScript)) {<br>
+      Headers.getDiags().Report(SourceLocation(),<br>
+                                diag::warn_stdlibcxx_not_found);<br>
+    }<br>
     return;<br>
   }<br>
<br>
@@ -478,7 +491,7 @@ void InitHeaderSearch::AddDefaultInclude<br>
       }<br>
       AddPath("/usr/include/c++/v1", CXXSystem, false);<br>
     } else {<br>
-      AddDefaultCPlusPlusIncludePaths(triple, HSOpts);<br>
+      AddDefaultCPlusPlusIncludePaths(Lang, triple, HSOpts);<br>
     }<br>
   }<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp?rev=335081&r1=335080&r2=335081&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp?rev=335081&r1=335080&r2=335081&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp Tue Jun 19 15:47:53 2018<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang -target x86_64-apple-darwin10 -S -o %t.s -mkernel -Xclang -verify %s<br>
+// RUN: %clang -target x86_64-apple-darwin10 -S -o %t.s -Wno-stdlibcxx-not-found -mkernel -Xclang -verify %s<br>
<br>
 // rdar://problem/9143356<br>
<br>
<br>
Added: cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp?rev=335081&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp?rev=335081&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp (added)<br>
+++ cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp Tue Jun 19 15:47:53 2018<br>
@@ -0,0 +1,5 @@<br>
+// RUN: %clang -cc1 -triple arm64-apple-ios6.0.0 -isysroot %S/doesnotexist %s 2>&1 | FileCheck %s<br>
+// RUN: %clang -cc1 -triple arm64-apple-ios6.0.0 -isysroot %S/doesnotexist -stdlib=libc++ %s -verify<br>
+// CHECK: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard library instead<br>
+<br>
+// expected-no-diagnostics<br>
<br>
Modified: cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp?rev=335081&r1=335080&r2=335081&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp?rev=335081&r1=335080&r2=335081&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp (original)<br>
+++ cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp Tue Jun 19 15:47:53 2018<br>
@@ -1,6 +1,6 @@<br>
 // REQUIRES: x86-registered-target<br>
-// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s<br>
-// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s -DIS_SYSHEADER<br>
+// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Wno-stdlibcxx-not-found -Xclang -verify -o /dev/null -c %s<br>
+// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Wno-stdlibcxx-not-found -Xclang -verify -o /dev/null -c %s -DIS_SYSHEADER<br>
<br>
 // Test that:<br>
 //  * The driver passes the option through to the backend.<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div></div>