qiucf created this revision.
qiucf added reviewers: rsmith, hans, thakis, awarzynski, brad, phosek.
qiucf requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Things might be confusing for people not familiar with how this option works. 
Add this warning like GCC.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D116395

Files:
  clang/include/clang/Basic/DiagnosticDriverKinds.td
  clang/lib/Driver/Driver.cpp
  clang/test/Driver/redundant-args.c


Index: clang/test/Driver/redundant-args.c
===================================================================
--- clang/test/Driver/redundant-args.c
+++ clang/test/Driver/redundant-args.c
@@ -1,2 +1,4 @@
-// RUN: %clang -target x86_64-apple-darwin10 \
-// RUN:   -Werror -x c -x c -fsyntax-only %s
+// RUN: %clang -target x86_64-apple-darwin10 -Werror -x c -x c -fsyntax-only %s
+// RUN: %clang -target x86_64-apple-darwin10 %s -### -x c 2>&1 | FileCheck %s
+
+// CHECK: warning: '-x c' after last input file has no effect
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -2269,6 +2269,7 @@
     assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed");
   }
 
+  size_t InputsBeforeOptX = 0;
   for (Arg *A : Args) {
     if (A->getOption().getKind() == Option::InputClass) {
       const char *Value = A->getValue();
@@ -2387,6 +2388,7 @@
       InputTypeArg = A;
       InputType = types::lookupTypeForTypeSpecifier(A->getValue());
       A->claim();
+      InputsBeforeOptX = Inputs.size();
 
       // Follow gcc behavior and treat as linker input for invalid -x
       // options. Its not clear why we shouldn't just revert to unknown; but
@@ -2411,6 +2413,8 @@
     Arg *A = MakeInputArg(Args, Opts, "-");
     Inputs.push_back(std::make_pair(types::TY_C, A));
   }
+  if (Inputs.size() == InputsBeforeOptX && InputTypeArg != nullptr)
+    Diag(diag::warn_drv_ignored_option_x) << InputTypeArg->getValue(0);
 }
 
 namespace {
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -568,6 +568,9 @@
   "'%0' does not support '-%1'; flag ignored">,
   InGroup<OptionIgnored>;
 
+def warn_drv_ignored_option_x : Warning<
+  "'-x %0' after last input file has no effect">, InGroup<OptionIgnored>;
+
 def warn_drv_darwin_sdk_invalid_settings : Warning<
   "SDK settings were ignored as 'SDKSettings.json' could not be parsed">,
   InGroup<DiagGroup<"darwin-sdk-settings">>;


Index: clang/test/Driver/redundant-args.c
===================================================================
--- clang/test/Driver/redundant-args.c
+++ clang/test/Driver/redundant-args.c
@@ -1,2 +1,4 @@
-// RUN: %clang -target x86_64-apple-darwin10 \
-// RUN:   -Werror -x c -x c -fsyntax-only %s
+// RUN: %clang -target x86_64-apple-darwin10 -Werror -x c -x c -fsyntax-only %s
+// RUN: %clang -target x86_64-apple-darwin10 %s -### -x c 2>&1 | FileCheck %s
+
+// CHECK: warning: '-x c' after last input file has no effect
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -2269,6 +2269,7 @@
     assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed");
   }
 
+  size_t InputsBeforeOptX = 0;
   for (Arg *A : Args) {
     if (A->getOption().getKind() == Option::InputClass) {
       const char *Value = A->getValue();
@@ -2387,6 +2388,7 @@
       InputTypeArg = A;
       InputType = types::lookupTypeForTypeSpecifier(A->getValue());
       A->claim();
+      InputsBeforeOptX = Inputs.size();
 
       // Follow gcc behavior and treat as linker input for invalid -x
       // options. Its not clear why we shouldn't just revert to unknown; but
@@ -2411,6 +2413,8 @@
     Arg *A = MakeInputArg(Args, Opts, "-");
     Inputs.push_back(std::make_pair(types::TY_C, A));
   }
+  if (Inputs.size() == InputsBeforeOptX && InputTypeArg != nullptr)
+    Diag(diag::warn_drv_ignored_option_x) << InputTypeArg->getValue(0);
 }
 
 namespace {
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -568,6 +568,9 @@
   "'%0' does not support '-%1'; flag ignored">,
   InGroup<OptionIgnored>;
 
+def warn_drv_ignored_option_x : Warning<
+  "'-x %0' after last input file has no effect">, InGroup<OptionIgnored>;
+
 def warn_drv_darwin_sdk_invalid_settings : Warning<
   "SDK settings were ignored as 'SDKSettings.json' could not be parsed">,
   InGroup<DiagGroup<"darwin-sdk-settings">>;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to