<div dir="ltr">I wonder if '-ivfsoverlay' is the right name for this? I have two nits:<div>1. If we ever added non-overlay operations into the format, it would be a misnomer.</div><div>2. While the implementation of the option requires using the VFS, the name is loaded enough that I think it might be good to call it something more related to its function (like c-index-test's '-remap-file', or "header maps"). I don't have a suggestion I am in love with though, the best alternative I can think of at the moment is '-ifsmap' (or '-ifs-map', or maybe just '-iremap' since the -i already indicates it is include path specific).</div>
<div><br></div><div> - Daniel</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Feb 25, 2014 at 10:23 AM, Ben Langmuir <span dir="ltr"><<a href="mailto:blangmuir@apple.com" target="_blank">blangmuir@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: benlangmuir<br>
Date: Tue Feb 25 12:23:47 2014<br>
New Revision: 202176<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=202176&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=202176&view=rev</a><br>
Log:<br>
Add a driver option -ivfsoverlay<br>
<br>
Reads the description of a virtual filesystem from a file and overlays<br>
it over the real file system.<br>
<br>
Added:<br>
    cfe/trunk/test/Driver/vfsoverlay.c<br>
    cfe/trunk/test/VFS/<br>
    cfe/trunk/test/VFS/Inputs/<br>
    cfe/trunk/test/VFS/Inputs/actual_header.h<br>
    cfe/trunk/test/VFS/Inputs/actual_module.map<br>
    cfe/trunk/test/VFS/Inputs/include_real.h<br>
    cfe/trunk/test/VFS/Inputs/invalid-yaml.yaml<br>
    cfe/trunk/test/VFS/Inputs/missing-key.yaml<br>
    cfe/trunk/test/VFS/Inputs/public_header.h<br>
    cfe/trunk/test/VFS/Inputs/unknown-key.yaml<br>
    cfe/trunk/test/VFS/Inputs/unknown-value.yaml<br>
    cfe/trunk/test/VFS/Inputs/vfsoverlay.yaml<br>
    cfe/trunk/test/VFS/framework-import.m<br>
    cfe/trunk/test/VFS/implicit-include.c<br>
    cfe/trunk/test/VFS/include-mixed-real-and-virtual.c<br>
    cfe/trunk/test/VFS/include-real-from-virtual.c<br>
    cfe/trunk/test/VFS/include-virtual-from-real.c<br>
    cfe/trunk/test/VFS/include.c<br>
    cfe/trunk/test/VFS/module-import.m<br>
    cfe/trunk/test/VFS/parse-errors.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/include/clang/Lex/HeaderSearchOptions.h<br>
    cfe/trunk/lib/Basic/VirtualFileSystem.cpp<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/lib/Frontend/FrontendAction.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=202176&r1=202175&r2=202176&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=202176&r1=202175&r2=202176&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Tue Feb 25 12:23:47 2014<br>
@@ -158,4 +158,9 @@ def warn_module_config_macro_undef : War<br>
   InGroup<ConfigMacros>;<br>
 def note_module_def_undef_here : Note<<br>
   "macro was %select{defined|#undef'd}0 here">;<br>
+<br>
+def err_missing_vfs_overlay_file : Error<<br>
+  "virtual filesystem overlay file '%0' not found">, DefaultFatal;<br>
+def err_invalid_vfs_overlay : Error<<br>
+  "invalid virtual filesystem overlay file '%0'">, DefaultFatal;<br>
 }<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=202176&r1=202175&r2=202176&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=202176&r1=202175&r2=202176&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Tue Feb 25 12:23:47 2014<br>
@@ -966,6 +966,8 @@ def iwithsysroot : JoinedOrSeparate<["-"<br>
   HelpText<"Add directory to SYSTEM include search path, "<br>
            "absolute paths are relative to -isysroot">, MetaVarName<"<directory>">,<br>
   Flags<[CC1Option]>;<br>
+def ivfsoverlay : JoinedOrSeparate<["-"], "ivfsoverlay">, Group<clang_i_Group>, Flags<[CC1Option]>,<br>
+  HelpText<"Overlay the virtual filesystem described by file over the real file system">;<br>
 def i : Joined<["-"], "i">, Group<i_Group>;<br>
 def keep__private__externs : Flag<["-"], "keep_private_externs">;<br>
 def l : JoinedOrSeparate<["-"], "l">, Flags<[LinkerInput, RenderJoined]>;<br>
<br>
Modified: cfe/trunk/include/clang/Lex/HeaderSearchOptions.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearchOptions.h?rev=202176&r1=202175&r2=202176&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearchOptions.h?rev=202176&r1=202175&r2=202176&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Lex/HeaderSearchOptions.h (original)<br>
+++ cfe/trunk/include/clang/Lex/HeaderSearchOptions.h Tue Feb 25 12:23:47 2014<br>
@@ -129,6 +129,9 @@ public:<br>
   /// \brief The set of user-provided module-map-files.<br>
   llvm::SetVector<std::string> ModuleMapFiles;<br>
<br>
+  /// \brief The set of user-provided virtual filesystem overlay files.<br>
+  std::vector<std::string> VFSOverlayFiles;<br>
+<br>
   /// Include the compiler builtin includes.<br>
   unsigned UseBuiltinIncludes : 1;<br>
<br>
@@ -172,6 +175,10 @@ public:<br>
   void AddSystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader) {<br>
     SystemHeaderPrefixes.push_back(SystemHeaderPrefix(Prefix, IsSystemHeader));<br>
   }<br>
+<br>
+  void AddVFSOverlayFile(StringRef Name) {<br>
+    VFSOverlayFiles.push_back(Name);<br>
+  }<br>
 };<br>
<br>
 } // end namespace clang<br>
<br>
Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=202176&r1=202175&r2=202176&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=202176&r1=202175&r2=202176&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original)<br>
+++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Tue Feb 25 12:23:47 2014<br>
@@ -761,7 +761,7 @@ error_code VFSFromYAML::openFileForRead(<br>
   if (!F) // FIXME: errc::not_a_file?<br>
     return error_code(errc::invalid_argument, system_category());<br>
<br>
-  return ExternalFS->openFileForRead(Path, Result);<br>
+  return ExternalFS->openFileForRead(F->getExternalContentsPath(), Result);<br>
 }<br>
<br>
 IntrusiveRefCntPtr<FileSystem><br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=202176&r1=202175&r2=202176&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=202176&r1=202175&r2=202176&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue Feb 25 12:23:47 2014<br>
@@ -1020,6 +1020,10 @@ static void ParseHeaderSearchArgs(Header<br>
        I != E; ++I)<br>
     Opts.AddSystemHeaderPrefix((*I)->getValue(),<br>
                                (*I)->getOption().matches(OPT_isystem_prefix));<br>
+<br>
+  for (arg_iterator I = Args.filtered_begin(OPT_ivfsoverlay),<br>
+       E = Args.filtered_end(); I != E; ++I)<br>
+    Opts.AddVFSOverlayFile((*I)->getValue());<br>
 }<br>
<br>
 void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,<br>
<br>
Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=202176&r1=202175&r2=202176&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=202176&r1=202175&r2=202176&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Frontend/FrontendAction.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/FrontendAction.cpp Tue Feb 25 12:23:47 2014<br>
@@ -211,6 +211,32 @@ bool FrontendAction::BeginSourceFile(Com<br>
     return true;<br>
   }<br>
<br>
+  if (!CI.getHeaderSearchOpts().VFSOverlayFiles.empty()) {<br>
+    IntrusiveRefCntPtr<vfs::OverlayFileSystem><br>
+        Overlay(new vfs::OverlayFileSystem(vfs::getRealFileSystem()));<br>
+    // earlier vfs files are on the bottom<br>
+    const std::vector<std::string> &Files =<br>
+        CI.getHeaderSearchOpts().VFSOverlayFiles;<br>
+    for (std::vector<std::string>::const_iterator I = Files.begin(),<br>
+                                                  E = Files.end();<br>
+         I != E; ++I) {<br>
+      OwningPtr<llvm::MemoryBuffer> Buffer;<br>
+      if (llvm::errc::success != llvm::MemoryBuffer::getFile(*I, Buffer)) {<br>
+        CI.getDiagnostics().Report(diag::err_missing_vfs_overlay_file) << *I;<br>
+        goto failure;<br>
+      }<br>
+<br>
+      IntrusiveRefCntPtr<vfs::FileSystem> FS =<br>
+          vfs::getVFSFromYAML(Buffer.take(), /*DiagHandler*/0);<br>
+      if (!FS.getPtr()) {<br>
+        CI.getDiagnostics().Report(diag::err_invalid_vfs_overlay) << *I;<br>
+        goto failure;<br>
+      }<br>
+      Overlay->pushOverlay(FS);<br>
+    }<br>
+    CI.setVirtualFileSystem(Overlay);<br>
+  }<br>
+<br>
   // Set up the file and source managers, if needed.<br>
   if (!CI.hasFileManager())<br>
     CI.createFileManager();<br>
<br>
Added: cfe/trunk/test/Driver/vfsoverlay.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/vfsoverlay.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/vfsoverlay.c?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/Driver/vfsoverlay.c (added)<br>
+++ cfe/trunk/test/Driver/vfsoverlay.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,5 @@<br>
+// RUN: %clang -ivfsoverlay foo.h -### %s 2>&1 | FileCheck %s<br>
+// CHECK: "-ivfsoverlay" "foo.h"<br>
+<br>
+// RUN: not %clang -ivfsoverlay foo.h %s 2>&1 | FileCheck -check-prefix=CHECK-MISSING %s<br>
+// CHECK-MISSING: virtual filesystem overlay file 'foo.h' not found<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/actual_header.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/actual_header.h?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/actual_header.h?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/actual_header.h (added)<br>
+++ cfe/trunk/test/VFS/Inputs/actual_header.h Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1 @@<br>
+void bar(void);<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/actual_module.map<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/actual_module.map?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/actual_module.map?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/actual_module.map (added)<br>
+++ cfe/trunk/test/VFS/Inputs/actual_module.map Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,4 @@<br>
+module not_real {<br>
+  header "not_real.h"<br>
+  export *<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/include_real.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/include_real.h?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/include_real.h?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/include_real.h (added)<br>
+++ cfe/trunk/test/VFS/Inputs/include_real.h Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1 @@<br>
+#include "real.h"<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/invalid-yaml.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/invalid-yaml.yaml?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/invalid-yaml.yaml?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/invalid-yaml.yaml (added)<br>
+++ cfe/trunk/test/VFS/Inputs/invalid-yaml.yaml Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,4 @@<br>
+{<br>
+  'version': 0,<br>
+  'roots': []<br>
+]<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/missing-key.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/missing-key.yaml?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/missing-key.yaml?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/missing-key.yaml (added)<br>
+++ cfe/trunk/test/VFS/Inputs/missing-key.yaml Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,4 @@<br>
+{<br>
+  'version': 0,<br>
+  'roots': [ { 'name' : 'foo', 'external-contents': 'bar' } ]<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/public_header.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/public_header.h?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/public_header.h?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/public_header.h (added)<br>
+++ cfe/trunk/test/VFS/Inputs/public_header.h Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1 @@<br>
+void from_framework(void);<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/unknown-key.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/unknown-key.yaml?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/unknown-key.yaml?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/unknown-key.yaml (added)<br>
+++ cfe/trunk/test/VFS/Inputs/unknown-key.yaml Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,5 @@<br>
+{<br>
+  'version': 0,<br>
+  'unknown-key': 'value',<br>
+  'roots': []<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/unknown-value.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/unknown-value.yaml?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/unknown-value.yaml?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/unknown-value.yaml (added)<br>
+++ cfe/trunk/test/VFS/Inputs/unknown-value.yaml Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,5 @@<br>
+{<br>
+  'version': 0,<br>
+  'case-sensitive': 'Maybe?',<br>
+  'roots': []<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/Inputs/vfsoverlay.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/vfsoverlay.yaml?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/Inputs/vfsoverlay.yaml?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/Inputs/vfsoverlay.yaml (added)<br>
+++ cfe/trunk/test/VFS/Inputs/vfsoverlay.yaml Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,21 @@<br>
+{<br>
+  'version': 0,<br>
+  'roots': [<br>
+    { 'name': 'OUT_DIR', 'type': 'directory',<br>
+      'contents': [<br>
+        { 'name': 'not_real.h', 'type': 'file',<br>
+          'external-contents': 'INPUT_DIR/actual_header.h'<br>
+        },<br>
+        { 'name': 'module.map', 'type': 'file',<br>
+          'external-contents': 'INPUT_DIR/actual_module.map'<br>
+        },<br>
+        { 'name': 'include_real.h', 'type': 'file',<br>
+          'external-contents': 'INPUT_DIR/include_real.h'<br>
+        },<br>
+        { 'name': 'SomeFramework.framework/Headers/public_header.h', 'type': 'file',<br>
+          'external-contents': 'INPUT_DIR/public_header.h'<br>
+        }<br>
+      ]<br>
+    }<br>
+  ]<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/framework-import.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/framework-import.m?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/framework-import.m?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/framework-import.m (added)<br>
+++ cfe/trunk/test/VFS/framework-import.m Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,9 @@<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -F %t -ivfsoverlay %t.yaml -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+#import <SomeFramework/public_header.h><br>
+<br>
+void foo() {<br>
+  from_framework();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/implicit-include.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/implicit-include.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/implicit-include.c?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/implicit-include.c (added)<br>
+++ cfe/trunk/test/VFS/implicit-include.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,7 @@<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -include "not_real.h" -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+void foo() {<br>
+  bar();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/include-mixed-real-and-virtual.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include-mixed-real-and-virtual.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include-mixed-real-and-virtual.c?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/include-mixed-real-and-virtual.c (added)<br>
+++ cfe/trunk/test/VFS/include-mixed-real-and-virtual.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,14 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: mkdir -p %t<br>
+// RUN: echo "void baz(void);" > %t/real.h<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+#include "not_real.h"<br>
+#include "real.h"<br>
+<br>
+void foo() {<br>
+  bar();<br>
+  baz();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/include-real-from-virtual.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include-real-from-virtual.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include-real-from-virtual.c?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/include-real-from-virtual.c (added)<br>
+++ cfe/trunk/test/VFS/include-real-from-virtual.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,12 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: mkdir -p %t<br>
+// RUN: echo "void baz(void);" > %t/real.h<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+#include "include_real.h"<br>
+<br>
+void foo() {<br>
+  baz();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/include-virtual-from-real.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include-virtual-from-real.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include-virtual-from-real.c?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/include-virtual-from-real.c (added)<br>
+++ cfe/trunk/test/VFS/include-virtual-from-real.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,12 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: mkdir -p %t<br>
+// RUN: echo '#include "not_real.h"' > %t/include_not_real.h<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -ivfsoverlay %t.yaml -I %t -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+#include "include_not_real.h"<br>
+<br>
+void foo() {<br>
+  bar();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/include.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/include.c?rev=202176&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/VFS/include.c (added)<br>
+++ cfe/trunk/test/VFS/include.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,9 @@<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -I %t -ivfsoverlay %t.yaml -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+#include "not_real.h"<br>
+<br>
+void foo() {<br>
+  bar();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/module-import.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/module-import.m?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/module-import.m?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/module-import.m (added)<br>
+++ cfe/trunk/test/VFS/module-import.m Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,9 @@<br>
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml<br>
+// RUN: %clang_cc1 -Werror -fmodules -fmodules-cache-path=%t -ivfsoverlay %t.yaml -I %t -fsyntax-only %s<br>
+// REQUIRES: shell<br>
+<br>
+@import not_real;<br>
+<br>
+void foo() {<br>
+  bar();<br>
+}<br>
<br>
Added: cfe/trunk/test/VFS/parse-errors.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/parse-errors.c?rev=202176&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/VFS/parse-errors.c?rev=202176&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/VFS/parse-errors.c (added)<br>
+++ cfe/trunk/test/VFS/parse-errors.c Tue Feb 25 12:23:47 2014<br>
@@ -0,0 +1,14 @@<br>
+// RUN: not %clang_cc1 -ivfsoverlay %S/Inputs/invalid-yaml.yaml -fsyntax-only %s 2>&1 | FileCheck %s<br>
+// CHECK: invalid virtual filesystem overlay file<br>
+<br>
+// RUN: not %clang_cc1 -ivfsoverlay %S/Inputs/missing-key.yaml -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-MISSING-TYPE %s<br>
+// CHECK-MISSING-TYPE: missing key 'type'<br>
+// CHECK-MISSING-TYPE: invalid virtual filesystem overlay file<br>
+<br>
+// RUN: not %clang_cc1 -ivfsoverlay %S/Inputs/unknown-key.yaml -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-UNKNOWN-KEY %s<br>
+// CHECK-UNKNOWN-KEY: unknown key<br>
+// CHECK-UNKNOWN-KEY: invalid virtual filesystem overlay file<br>
+<br>
+// RUN: not %clang_cc1 -ivfsoverlay %S/Inputs/unknown-value.yaml -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-UNKNOWN-VALUE %s<br>
+// CHECK-UNKNOWN-VALUE: expected boolean value<br>
+// CHECK-UNKNOWN-VALUE: invalid virtual filesystem overlay file<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>