]> granicus.if.org Git - clang/commitdiff
[MSVC Compat] Only warn for unknown clang-cl arguments
authorEhsan Akhgari <ehsan.akhgari@gmail.com>
Mon, 25 Jan 2016 21:14:52 +0000 (21:14 +0000)
committerEhsan Akhgari <ehsan.akhgari@gmail.com>
Mon, 25 Jan 2016 21:14:52 +0000 (21:14 +0000)
Summary:
MSVC's driver accepts all unknown arguments but warns about them.  clang
by default rejects all unknown arguments.  This causes issues
specifically with build systems such as autoconf which liberally pass
things such as $LDFLAGS to the compiler and expect everything to work.
This patch teaches clang-cl to ignore unknown driver arguments.

Reviewers: rnk

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D16511

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@258720 91177308-0d34-0410-b5e6-96231b3b80d8

docs/UsersManual.rst
include/clang/Basic/DiagnosticDriverKinds.td
include/clang/Basic/DiagnosticGroups.td
lib/Driver/Driver.cpp
lib/Driver/Tools.cpp
test/Driver/cl-fallback.c
test/Driver/unknown-arg.c
test/Misc/serialized-diags-driver.c

index ea75d1e2227a3f6796b825ba4cc23688259948c2..32c6ac2270fe7b2db0de97ffc1b887f5b1bf023e 100644 (file)
@@ -2024,8 +2024,9 @@ with a warning. For example:
 
 To suppress warnings about unused arguments, use the ``-Qunused-arguments`` option.
 
-Options that are not known to clang-cl will cause errors. If they are spelled with a
-leading ``/``, they will be mistaken for a filename:
+Options that are not known to clang-cl will be ignored by default. Use the
+``-Werror=unknown-argument`` option in order to treat them as errors. If these
+options are spelled with a leading ``/``, they will be mistaken for a filename:
 
   ::
 
index b04498f3188c0be06347520e3cbd4b1c4266eb4a..1ba9e1464cdddabd64e99c2bc15e569f3baf2ab4 100644 (file)
@@ -93,6 +93,9 @@ def err_target_unsupported_arch
 def err_drv_I_dash_not_supported : Error<
   "'%0' not supported, please use -iquote instead">;
 def err_drv_unknown_argument : Error<"unknown argument: '%0'">;
+def warn_drv_unknown_argument_clang_cl : Warning<
+  "unknown argument ignored in clang-cl: '%0'">,
+  InGroup<UnknownArgument>;
 def err_drv_invalid_value : Error<"invalid value '%1' in '%0'">;
 def err_drv_invalid_int_value : Error<"invalid integral value '%1' in '%0'">;
 def err_drv_invalid_remap_file : Error<
index 41e7d2a85e1dc7a99513a3587ac39070ca327ac7..969050df59632447e9e6a28d2e9ff3efe6953d50 100644 (file)
@@ -848,3 +848,5 @@ def FutureCompat : DiagGroup<"future-compat">;
 def InvalidOrNonExistentDirectory : DiagGroup<"invalid-or-nonexistent-directory">;
 
 def OptionIgnored : DiagGroup<"option-ignored">;
+
+def UnknownArgument : DiagGroup<"unknown-argument">;
index 5c01ef0bba7c132c786afb3ac71eb48ec7efa5ad..22eed5cab6f7d8dc369ce27e3319d29020c84dea 100644 (file)
@@ -146,7 +146,9 @@ InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings) {
   }
 
   for (const Arg *A : Args.filtered(options::OPT_UNKNOWN))
-    Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(Args);
+    Diags.Report(IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl :
+                              diag::err_drv_unknown_argument)
+      << A->getAsString(Args);
 
   return Args;
 }
@@ -1710,8 +1712,11 @@ void Driver::BuildJobs(Compilation &C) const {
           continue;
       }
 
-      Diag(clang::diag::warn_drv_unused_argument)
-          << A->getAsString(C.getArgs());
+      // In clang-cl, don't mention unknown arguments here since they have
+      // already been warned about.
+      if (!IsCLMode() || !A->getOption().matches(options::OPT_UNKNOWN))
+        Diag(clang::diag::warn_drv_unused_argument)
+            << A->getAsString(C.getArgs());
     }
   }
 }
index 2bbcb275a4b894a928e1ec5e8e30c7ff9270a814..814eb353c5cedf9d48d02e7acf8f8cb09765a4f4 100644 (file)
@@ -9708,6 +9708,10 @@ std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
                                options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
     A->render(Args, CmdArgs);
 
+  // Pass through all unknown arguments so that the fallback command can see
+  // them too.
+  Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
+
   // Input filename.
   assert(Inputs.size() == 1);
   const InputInfo &II = Inputs[0];
index e5ebde5c0182192847878ffe14432d56459db4ea..f788e4cab162072d60a3859f8d560223dd258e4a 100644 (file)
@@ -3,6 +3,7 @@
 
 // RUN: %clang_cl --target=i686-pc-win32 /fallback /Dfoo=bar /Ubaz /Ifoo /O0 /Ox /GR /GR- /Gy /Gy- \
 // RUN:   /Gw /Gw- /LD /LDd /EHs /EHs- /Zl /MD /MDd /MTd /MT /FImyheader.h /Zi \
+// RUN:   -garbage -moregarbage \
 // RUN:   -### -- %s 2>&1 \
 // RUN:   | FileCheck %s
 // CHECK: "-fdiagnostics-format" "msvc-fallback"
@@ -31,6 +32,8 @@
 // CHECK: "/EHs-"
 // CHECK: "/Zl"
 // CHECK: "/MT"
+// CHECK: "-garbage"
+// CHECK: "-moregarbage"
 // CHECK: "/Tc" "{{.*cl-fallback.c}}"
 // CHECK: "/Fo{{.*cl-fallback.*.obj}}"
 
index f834a0e8db92a200fc9b2e22fb3f4fc3c4ed5b7b..09889bf1a879b3975717e015a88e4142bf344618 100644 (file)
@@ -1,5 +1,11 @@
 // RUN: not %clang %s -cake-is-lie -%0 -%d -HHHH -munknown-to-clang-option -print-stats -funknown-to-clang-option 2>&1 | \
 // RUN: FileCheck %s
+// RUN: %clang_cl -cake-is-lie -%0 -%d -HHHH -munknown-to-clang-option -print-stats -funknown-to-clang-option -c -- %s 2>&1 | \
+// RUN: FileCheck %s --check-prefix=CL
+// RUN: not %clang_cl -cake-is-lie -%0 -%d -HHHH -munknown-to-clang-option -print-stats -funknown-to-clang-option -c -Werror=unknown-argument -- %s 2>&1 | \
+// RUN: FileCheck %s --check-prefix=CL
+// RUN: %clang_cl -cake-is-lie -%0 -%d -HHHH -munknown-to-clang-option -print-stats -funknown-to-clang-option -c -Wno-unknown-argument -- %s 2>&1 | \
+// RUN: FileCheck %s --check-prefix=SILENT --allow-empty
 
 // CHECK: unknown argument: '-cake-is-lie'
 // CHECK: unknown argument: '-%0'
@@ -8,6 +14,15 @@
 // CHECK: unknown argument: '-munknown-to-clang-option'
 // CHECK: unknown argument: '-print-stats'
 // CHECK: unknown argument: '-funknown-to-clang-option'
+// CL: unknown argument ignored in clang-cl: '-cake-is-lie'
+// CL: unknown argument ignored in clang-cl: '-%0'
+// CL: unknown argument ignored in clang-cl: '-%d'
+// CL: unknown argument ignored in clang-cl: '-HHHH'
+// CL: unknown argument ignored in clang-cl: '-munknown-to-clang-option'
+// CL: unknown argument ignored in clang-cl: '-print-stats'
+// CL: unknown argument ignored in clang-cl: '-funknown-to-clang-option'
+// SILENT-NOT: error
+// SILENT-NOT: warning
 
 
 // RUN: %clang -S %s -o %t.s  -Wunknown-to-clang-option 2>&1 | FileCheck --check-prefix=IGNORED %s
index ad07d666c8c121b548aa303228babfa9ea0f914c..617ac8c6ef928e69224125828b98a7123d351372 100644 (file)
@@ -5,10 +5,10 @@
 // doesn't litter the user's system with preprocessed output.
 
 // RUN: rm -f %t
-// RUN: %clang -Wx-unknown-warning -Wall -fsyntax-only --serialize-diagnostics %t.diag %s
+// RUN: %clang -Wx-typoed-warning -Wall -fsyntax-only --serialize-diagnostics %t.diag %s
 // RUN: c-index-test -read-diagnostics %t.diag 2>&1 | FileCheck %s
 
-// CHECK: warning: unknown warning option '-Wx-unknown-warning' [-Wunknown-warning-option] []
+// CHECK: warning: unknown warning option '-Wx-typoed-warning' [-Wunknown-warning-option] []
 
 // CHECK: warning: variable 'voodoo' is uninitialized when used here [-Wuninitialized]
 // CHECK: note: initialize the variable 'voodoo' to silence this warning []