<div dir="ltr">It seems that cl.exe lets /showIncludes write to stderr if /E is passed, but to stdout else (!).</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 21, 2014 at 4:42 PM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@hanshq.net" target="_blank">hans@hanshq.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hans<br>
Date: Mon Jul 21 18:42:07 2014<br>
New Revision: 213589<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=213589&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=213589&view=rev</a><br>
Log:<br>
clang-cl: ignore /showIncludes when combined with /E (PR20336)<br>
<br>
Both /showIncludes and /E write to stdout. Allowing both results<br>
in interleaved output and an error when double-closing the file<br>
descriptor, intended to catch issues like this.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
    cfe/trunk/test/Driver/cl-options.c<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=213589&r1=213588&r2=213589&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=213589&r1=213588&r2=213589&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Mon Jul 21 18:42:07 2014<br>
@@ -4640,8 +4640,11 @@ void Clang::AddClangCLArgs(const ArgList<br>
   // implemented in clang.<br>
   CmdArgs.push_back("--dependent-lib=oldnames");<br>
<br>
-  if (Arg *A = Args.getLastArg(options::OPT_show_includes))<br>
-    A->render(Args, CmdArgs);<br>
+  // Both /showIncludes and /E (and /EP) write to stdout. Allowing both<br>
+  // would produce interleaved output, so ignore /showIncludes in such cases.<br>
+  if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))<br>
+    if (Arg *A = Args.getLastArg(options::OPT_show_includes))<br>
+      A->render(Args, CmdArgs);<br>
<br>
   // This controls whether or not we emit RTTI data for polymorphic types.<br>
   if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,<br>
<br>
Modified: cfe/trunk/test/Driver/cl-options.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-options.c?rev=213589&r1=213588&r2=213589&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-options.c?rev=213589&r1=213588&r2=213589&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Driver/cl-options.c (original)<br>
+++ cfe/trunk/test/Driver/cl-options.c Mon Jul 21 18:42:07 2014<br>
@@ -87,6 +87,10 @@<br>
 // RUN: %clang_cl /showIncludes -### -- %s 2>&1 | FileCheck -check-prefix=showIncludes %s<br>
 // showIncludes: --show-includes<br>
<br>
+// RUN: %clang_cl /E /showIncludes -### -- %s 2>&1 | FileCheck -check-prefix=showIncludes_E %s<br>
+// RUN: %clang_cl /EP /showIncludes -### -- %s 2>&1 | FileCheck -check-prefix=showIncludes_E %s<br>
+// showIncludes_E: warning: argument unused during compilation: '--show-includes'<br>
+<br>
 // RUN: %clang_cl /Umymacro -### -- %s 2>&1 | FileCheck -check-prefix=U %s<br>
 // RUN: %clang_cl /U mymacro -### -- %s 2>&1 | FileCheck -check-prefix=U %s<br>
 // U: "-U" "mymacro"<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>