]> granicus.if.org Git - clang/commitdiff
clang-cl: Expand warning about /TC and /TP override, and expand test
authorHans Wennborg <hans@hanshq.net>
Mon, 12 Aug 2013 18:34:17 +0000 (18:34 +0000)
committerHans Wennborg <hans@hanshq.net>
Mon, 12 Aug 2013 18:34:17 +0000 (18:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188190 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticDriverKinds.td
lib/Driver/Driver.cpp
test/Driver/cl-inputs.c

index 866bb41dba18475ea72135ae558d6237a584007c..9222db8c33d89e692dc953c83081f678ddb1dbcd 100644 (file)
@@ -153,6 +153,8 @@ def warn_missing_sysroot : Warning<"no such sysroot directory: '%0'">,
 
 def note_drv_command_failed_diag_msg : Note<
   "diagnostic msg: %0">;
+def note_drv_t_option_is_global :
+  Note<"The last /TC or /TP option takes precedence over earlier instances">;
   
 def err_analyzer_config_no_value : Error<
   "analyzer-config option '%0' has a key but no value">;
index 3fddc8fe6e96257d60c184b63c1826f5ab52871b..d6013f19ea4faa30148bbae0f8aef9df24470c3f 100644 (file)
@@ -1011,24 +1011,26 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args,
   types::ID InputType = types::TY_Nothing;
   Arg *InputTypeArg = 0;
 
-  // The /TC and /TP options set the input type to C or C++ globally.
+  // The last /TC or /TP option sets the input type to C or C++ globally.
   if (Arg *TCTP = Args.getLastArg(options::OPT__SLASH_TC,
                                   options::OPT__SLASH_TP)) {
     InputTypeArg = TCTP;
-    unsigned opposite;
-
-    if (TCTP->getOption().matches(options::OPT__SLASH_TC)) {
-      InputType = types::TY_C;
-      opposite = options::OPT__SLASH_TP;
-    } else {
-      InputType = types::TY_CXX;
-      opposite = options::OPT__SLASH_TC;
-    }
-
-    if (Arg *OppositeArg = Args.getLastArg(opposite)) {
-      Diag(clang::diag::warn_drv_overriding_t_option)
-        << OppositeArg->getSpelling() << InputTypeArg->getSpelling();
+    InputType = TCTP->getOption().matches(options::OPT__SLASH_TC)
+        ? types::TY_C : types::TY_CXX;
+
+    arg_iterator it = Args.filtered_begin(options::OPT__SLASH_TC,
+                                          options::OPT__SLASH_TP);
+    const arg_iterator ie = Args.filtered_end();
+    Arg *Previous = *it++;
+    bool ShowNote = false;
+    while (it != ie) {
+      Diag(clang::diag::warn_drv_overriding_t_option) << Previous->getSpelling()
+          << (*it)->getSpelling();
+      Previous = *it++;
+      ShowNote = true;
     }
+    if (ShowNote)
+      Diag(clang::diag::note_drv_t_option_is_global);
 
     // No driver mode exposes -x and /TC or /TP; we don't support mixing them.
     assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed");
index 1918e4cba921e01492e1b47c54b0ee964735e162..79433edef7760168bba5e7e528ef91b8c22f7b0d 100644 (file)
@@ -6,17 +6,30 @@
 \r
 // RUN: %clang_cl /TC -### -- %s 2>&1 | FileCheck -check-prefix=TC %s\r
 // TC:  "-x" "c"\r
+// TC-NOT: warning\r
+// TC-NOT: note\r
 \r
 // RUN: %clang_cl /TP -### -- %s 2>&1 | FileCheck -check-prefix=TP %s\r
 // TP:  "-x" "c++"\r
+// TP-NOT: warning\r
+// TP-NOT: note\r
 \r
-// RUN: %clang_cl -### /Tc%s 2>&1 | FileCheck -check-prefix=Tc %s\r
-// RUN: %clang_cl -### /TP /Tc%s 2>&1 | FileCheck -check-prefix=Tc %s\r
+// RUN: %clang_cl -### /Tc%s /TP -- %s 2>&1 | FileCheck -check-prefix=Tc %s\r
+// RUN: %clang_cl -### /TP /Tc%s -- %s 2>&1 | FileCheck -check-prefix=Tc %s\r
 // Tc:  "-x" "c"\r
+// Tc:  "-x" "c++"\r
+// Tc-NOT: warning\r
+// Tc-NOT: note\r
 \r
-// RUN: %clang_cl -### /Tp%s 2>&1 | FileCheck -check-prefix=Tp %s\r
-// RUN: %clang_cl -### /TC /Tp%s 2>&1 | FileCheck -check-prefix=Tp %s\r
+// RUN: %clang_cl -### /Tp%s /TC -- %s 2>&1 | FileCheck -check-prefix=Tp %s\r
+// RUN: %clang_cl -### /TC /Tp%s -- %s 2>&1 | FileCheck -check-prefix=Tp %s\r
 // Tp:  "-x" "c++"\r
+// Tp:  "-x" "c"\r
+// Tp-NOT: warning\r
+// Tp-NOT: note\r
 \r
-// RUN: %clang_cl /TP /TC -### -- %s 2>&1 | FileCheck -check-prefix=WARN %s\r
-// WARN: overriding '/TP' option with '/TC'\r
+// RUN: %clang_cl /TP /TC /TP -### -- %s 2>&1 | FileCheck -check-prefix=WARN %s\r
+// WARN: warning: overriding '/TP' option with '/TC'\r
+// WARN: warning: overriding '/TC' option with '/TP'\r
+// WARN: note: The last /TC or /TP option takes precedence over earlier instances\r
+// WARN-NOT: note\r