<div dir="ltr">Why not enable it by default, or put it in -Wall at least? We don't like off-by-default warnings :-)</div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jun 22, 2018 at 2:09 PM Bruno Cardoso Lopes via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">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: bruno<br>
Date: Fri Jun 22 11:05:17 2018<br>
New Revision: 335375<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=335375&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=335375&view=rev</a><br>
Log:<br>
Re-apply: Warning for framework headers using double quote includes<br>
<br>
Introduce -Wquoted-include-in-framework-header, which should fire a warning<br>
whenever a quote include appears in a framework header and suggest a fix-it.<br>
For instance, for header A.h added in the tests, this is how the warning looks<br>
like:<br>
<br>
./A.framework/Headers/A.h:2:10: warning: double-quoted include "A0.h" in framework header, expected angle-bracketed instead [-Wquoted-include-in-framework-header]<br>
#include "A0.h"<br>
         ^~~~~~<br>
         <A/A0.h><br>
./A.framework/Headers/A.h:3:10: warning: double-quoted include "B.h" in framework header, expected angle-bracketed instead [-Wquoted-include-in-framework-header]<br>
#include "B.h"<br>
         ^~~~~<br>
         <B.h><br>
<br>
This helps users to prevent frameworks from using local headers when in fact<br>
they should be targetting system level ones.<br>
<br>
The warning is off by default.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D47157" rel="noreferrer" target="_blank">https://reviews.llvm.org/D47157</a><br>
<br>
rdar://problem/37077034<br>
<br>
Added:<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A.h<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A0.h<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Modules/module.modulemap<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/B.h<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Headers/X.h<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Modules/module.modulemap<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/a.hmap.json<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.h<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.modulemap<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/x.hmap.json<br>
    cfe/trunk/test/Modules/Inputs/double-quotes/z.yaml<br>
    cfe/trunk/test/Modules/double-quotes.m<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticGroups.td<br>
    cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td<br>
    cfe/trunk/lib/Lex/HeaderSearch.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=335375&r1=335374&r2=335375&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=335375&r1=335374&r2=335375&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Jun 22 11:05:17 2018<br>
@@ -31,6 +31,7 @@ def AutoDisableVptrSanitizer : DiagGroup<br>
 def Availability : DiagGroup<"availability">;<br>
 def Section : DiagGroup<"section">;<br>
 def AutoImport : DiagGroup<"auto-import">;<br>
+def FrameworkHdrQuotedInclude : DiagGroup<"quoted-include-in-framework-header">;<br>
 def CXX14BinaryLiteral : DiagGroup<"c++14-binary-literal">;<br>
 def CXXPre14CompatBinaryLiteral : DiagGroup<"c++98-c++11-compat-binary-literal">;<br>
 def GNUBinaryLiteral : DiagGroup<"gnu-binary-literal">;<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=335375&r1=335374&r2=335375&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=335375&r1=335374&r2=335375&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Fri Jun 22 11:05:17 2018<br>
@@ -714,6 +714,11 @@ def warn_mmap_redundant_export_as : Warn<br>
 def err_mmap_submodule_export_as : Error<<br>
   "only top-level modules can be re-exported as public">;<br>
<br>
+def warn_quoted_include_in_framework_header : Warning<<br>
+  "double-quoted include \"%0\" in framework header, "<br>
+  "expected angle-bracketed instead"<br>
+  >, InGroup<FrameworkHdrQuotedInclude>, DefaultIgnore;<br>
+<br>
 def warn_auto_module_import : Warning<<br>
   "treating #%select{include|import|include_next|__include_macros}0 as an "<br>
   "import of module '%1'">, InGroup<AutoImport>, DefaultIgnore;<br>
<br>
Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=335375&r1=335374&r2=335375&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=335375&r1=335374&r2=335375&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)<br>
+++ cfe/trunk/lib/Lex/HeaderSearch.cpp Fri Jun 22 11:05:17 2018<br>
@@ -621,6 +621,59 @@ static const char *copyString(StringRef<br>
   return CopyStr;<br>
 }<br>
<br>
+static bool isFrameworkStylePath(StringRef Path,<br>
+                                 SmallVectorImpl<char> &FrameworkName) {<br>
+  using namespace llvm::sys;<br>
+  path::const_iterator I = path::begin(Path);<br>
+  path::const_iterator E = path::end(Path);<br>
+<br>
+  // Detect different types of framework style paths:<br>
+  //<br>
+  //   ...Foo.framework/{Headers,PrivateHeaders}<br>
+  //   ...Foo.framework/Versions/{A,Current}/{Headers,PrivateHeaders}<br>
+  //   ...Foo.framework/Frameworks/Nested.framework/{Headers,PrivateHeaders}<br>
+  //   ...<other variations with 'Versions' like in the above path><br>
+  //<br>
+  // and some other variations among these lines.<br>
+  int FoundComp = 0;<br>
+  while (I != E) {<br>
+    if (I->endswith(".framework")) {<br>
+      FrameworkName.append(I->begin(), I->end());<br>
+      ++FoundComp;<br>
+    }<br>
+    if (*I == "Headers" || *I == "PrivateHeaders")<br>
+      ++FoundComp;<br>
+    ++I;<br>
+  }<br>
+<br>
+  return FoundComp >= 2;<br>
+}<br>
+<br>
+static void<br>
+diagnoseFrameworkInclude(DiagnosticsEngine &Diags, SourceLocation IncludeLoc,<br>
+                         StringRef Includer, StringRef IncludeFilename,<br>
+                         const FileEntry *IncludeFE, bool isAngled = false,<br>
+                         bool FoundByHeaderMap = false) {<br>
+  SmallString<128> FromFramework, ToFramework;<br>
+  if (!isFrameworkStylePath(Includer, FromFramework))<br>
+    return;<br>
+  bool IsIncludeeInFramework =<br>
+      isFrameworkStylePath(IncludeFE->getName(), ToFramework);<br>
+<br>
+  if (!isAngled && !FoundByHeaderMap) {<br>
+    SmallString<128> NewInclude("<");<br>
+    if (IsIncludeeInFramework) {<br>
+      NewInclude += StringRef(ToFramework).drop_back(10); // drop .framework<br>
+      NewInclude += "/";<br>
+    }<br>
+    NewInclude += IncludeFilename;<br>
+    NewInclude += ">";<br>
+    Diags.Report(IncludeLoc, diag::warn_quoted_include_in_framework_header)<br>
+        << IncludeFilename<br>
+        << FixItHint::CreateReplacement(IncludeLoc, NewInclude);<br>
+  }<br>
+}<br>
+<br>
 /// LookupFile - Given a "foo" or \<foo> reference, look up the indicated file,<br>
 /// return null on failure.  isAngled indicates whether the file reference is<br>
 /// for system \#include's or not (i.e. using <> instead of ""). Includers, if<br>
@@ -722,8 +775,12 @@ const FileEntry *HeaderSearch::LookupFil<br>
           RelativePath->clear();<br>
           RelativePath->append(Filename.begin(), Filename.end());<br>
         }<br>
-        if (First)<br>
+        if (First) {<br>
+          diagnoseFrameworkInclude(Diags, IncludeLoc,<br>
+                                   IncluderAndDir.second->getName(), Filename,<br>
+                                   FE);<br>
           return FE;<br>
+        }<br>
<br>
         // Otherwise, we found the path via MSVC header search rules.  If<br>
         // -Wmsvc-include is enabled, we have to keep searching to see if we<br>
@@ -834,6 +891,12 @@ const FileEntry *HeaderSearch::LookupFil<br>
       return MSFE;<br>
     }<br>
<br>
+    bool FoundByHeaderMap = !IsMapped ? false : *IsMapped;<br>
+    if (!Includers.empty())<br>
+      diagnoseFrameworkInclude(Diags, IncludeLoc,<br>
+                               Includers.front().second->getName(), Filename,<br>
+                               FE, isAngled, FoundByHeaderMap);<br>
+<br>
     // Remember this location for the next lookup we do.<br>
     CacheLookup.HitIdx = i;<br>
     return FE;<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A.h?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A.h?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A.h Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,6 @@<br>
+#include "A0.h"<br>
+#include "B.h"<br>
+<br>
+#include "X.h"<br>
+<br>
+int foo();<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A0.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A0.h?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A0.h?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A0.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Headers/A0.h Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1 @@<br>
+// double-quotes/A.framework/Headers/A0.h<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Modules/module.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Modules/module.modulemap?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Modules/module.modulemap?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Modules/module.modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/A.framework/Modules/module.modulemap Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,5 @@<br>
+// double-quotes/A.framework/Modules/module.modulemap<br>
+framework module A {<br>
+  header "A.h"<br>
+  header "A0.h"<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/B.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/B.h?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/B.h?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/B.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/B.h Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1 @@<br>
+// double-quotes/B.h<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Headers/X.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Headers/X.h?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Headers/X.h?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Headers/X.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Headers/X.h Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1 @@<br>
+// double-quotes/X.framework/Headers/X.h<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Modules/module.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Modules/module.modulemap?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Modules/module.modulemap?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Modules/module.modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/X.framework/Modules/module.modulemap Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,4 @@<br>
+// double-quotes/X.framework/Modules/module.modulemap<br>
+framework module X {<br>
+  header "X.h"<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/a.hmap.json<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/a.hmap.json?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/a.hmap.json?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/a.hmap.json (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/a.hmap.json Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,6 @@<br>
+{<br>
+  "mappings" :<br>
+    {<br>
+     "A.h" : "A/A.h"<br>
+    }<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.h?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.h?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.h (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.h Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1 @@<br>
+#import "B.h" // Included from Z.h & A.h<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.modulemap?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.modulemap?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.modulemap (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/flat-header-path/Z.modulemap Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,4 @@<br>
+// double-quotes/flat-header-path/Z.modulemap<br>
+framework module Z {<br>
+  header "Z.h"<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/x.hmap.json<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/x.hmap.json?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/x.hmap.json?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/x.hmap.json (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/x.hmap.json Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,7 @@<br>
+<br>
+{<br>
+  "mappings" :<br>
+    {<br>
+     "X.h" : "X/X.h"<br>
+    }<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/Inputs/double-quotes/z.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/z.yaml?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/double-quotes/z.yaml?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/double-quotes/z.yaml (added)<br>
+++ cfe/trunk/test/Modules/Inputs/double-quotes/z.yaml Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,28 @@<br>
+{<br>
+  'version': 0,<br>
+  'case-sensitive': 'false',<br>
+  'roots': [<br>
+    {<br>
+      'type': 'directory',<br>
+      'name': "TEST_DIR/Z.framework/Headers",<br>
+      'contents': [<br>
+        {<br>
+          'type': 'file',<br>
+          'name': "Z.h",<br>
+          'external-contents': "TEST_DIR/flat-header-path/Z.h"<br>
+        }<br>
+      ]<br>
+    },<br>
+    {<br>
+      'type': 'directory',<br>
+      'name': "TEST_DIR/Z.framework/Modules",<br>
+      'contents': [<br>
+        {<br>
+          'type': 'file',<br>
+          'name': "module.modulemap",<br>
+          'external-contents': "TEST_DIR/flat-header-path/Z.modulemap"<br>
+        }<br>
+      ]<br>
+    }<br>
+  ]<br>
+}<br>
<br>
Added: cfe/trunk/test/Modules/double-quotes.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/double-quotes.m?rev=335375&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/double-quotes.m?rev=335375&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/double-quotes.m (added)<br>
+++ cfe/trunk/test/Modules/double-quotes.m Fri Jun 22 11:05:17 2018<br>
@@ -0,0 +1,39 @@<br>
+// REQUIRES: shell<br>
+<br>
+// RUN: rm -rf %t<br>
+// RUN: mkdir %t<br>
+<br>
+// RUN: %hmaptool write %S/Inputs/double-quotes/a.hmap.json %t/a.hmap<br>
+// RUN: %hmaptool write %S/Inputs/double-quotes/x.hmap.json %t/x.hmap<br>
+<br>
+// RUN: sed -e "s:TEST_DIR:%S/Inputs/double-quotes:g" \<br>
+// RUN:   %S/Inputs/double-quotes/z.yaml > %t/z.yaml<br>
+<br>
+// The output with and without modules should be the same<br>
+<br>
+// RUN: %clang_cc1 \<br>
+// RUN:   -I %t/x.hmap -iquote %t/a.hmap -ivfsoverlay %t/z.yaml \<br>
+// RUN:   -F%S/Inputs/double-quotes -I%S/Inputs/double-quotes \<br>
+// RUN:   -Wquoted-include-in-framework-header -fsyntax-only %s -verify<br>
+<br>
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache \<br>
+// RUN:   -I %t/x.hmap -iquote %t/a.hmap -ivfsoverlay %t/z.yaml \<br>
+// RUN:   -F%S/Inputs/double-quotes -I%S/Inputs/double-quotes \<br>
+// RUN:   -Wquoted-include-in-framework-header -fsyntax-only %s \<br>
+// RUN:   2>%t/stderr<br>
+<br>
+// The same warnings show up when modules is on but -verify doesn't get it<br>
+// because they only show up under the module A building context.<br>
+// RUN: FileCheck --input-file=%t/stderr %s<br>
+// CHECK: double-quoted include "A0.h" in framework header, expected angle-bracketed instead<br>
+// CHECK: double-quoted include "B.h" in framework header, expected angle-bracketed instead<br>
+// CHECK: double-quoted include "B.h" in framework header, expected angle-bracketed instead<br>
+<br>
+#import "A.h"<br>
+#import <Z/Z.h><br>
+<br>
+int bar() { return foo(); }<br>
+<br>
+// expected-warning@Inputs/double-quotes/A.framework/Headers/A.h:1{{double-quoted include "A0.h" in framework header, expected angle-bracketed instead}}<br>
+// expected-warning@Inputs/double-quotes/A.framework/Headers/A.h:2{{double-quoted include "B.h" in framework header, expected angle-bracketed instead}}<br>
+// expected-warning@Inputs/double-quotes/flat-header-path/Z.h:1{{double-quoted include "B.h" in framework header, expected angle-bracketed instead}}<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>