summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2013-09-11 16:38:41 +0000
committerHans Wennborg <hans@hanshq.net>2013-09-11 16:38:41 +0000
commitd9ad0681fad9a98f43d9baddb95d505b37153c48 (patch)
treeb3de738f838b472a1465343898d78cf7dd3fd260
parentc90d12d1df14b16aa83700e5dd4ec2009bfa2655 (diff)
downloadbcm5719-llvm-d9ad0681fad9a98f43d9baddb95d505b37153c48.tar.gz
bcm5719-llvm-d9ad0681fad9a98f43d9baddb95d505b37153c48.zip
clang-cl: Warn about overriding /MD with /MT etc.
This also bakes the /M options into a separate option group to make them easier to refer to from the code. llvm-svn: 190529
-rw-r--r--clang/include/clang/Basic/DiagnosticDriverKinds.td2
-rw-r--r--clang/include/clang/Driver/CLCompatOptions.td16
-rw-r--r--clang/lib/Driver/Driver.cpp4
-rw-r--r--clang/lib/Driver/Tools.cpp16
-rw-r--r--clang/test/Driver/cl-runtime-flags.c4
5 files changed, 29 insertions, 13 deletions
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index fe4a7ede06a..2f69e5de8eb 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -141,7 +141,7 @@ def warn_ignoring_ftabstop_value : Warning<
def warn_drv_overriding_joined_option : Warning<
"overriding '%0%1' option with '%2%3'">,
InGroup<DiagGroup<"overriding-fo-option">>;
-def warn_drv_overriding_t_option : Warning<
+def warn_drv_overriding_flag_option : Warning<
"overriding '%0' option with '%1'">,
InGroup<DiagGroup<"overriding-t-option">>;
def warn_drv_treating_input_as_cxx : Warning<
diff --git a/clang/include/clang/Driver/CLCompatOptions.td b/clang/include/clang/Driver/CLCompatOptions.td
index 44418d27753..77acfbcea2a 100644
--- a/clang/include/clang/Driver/CLCompatOptions.td
+++ b/clang/include/clang/Driver/CLCompatOptions.td
@@ -93,6 +93,8 @@ def _SLASH_Zs : CLFlag<"Zs">, HelpText<"Syntax-check only">,
// Non-aliases:
+def _SLASH_M_Group : OptionGroup<"</M group>">, Group<cl_Group>;
+
def _SLASH_Fe : CLJoined<"Fe">,
HelpText<"Set output executable file or directory (ends in / or \\)">,
MetaVarName<"<file or directory>">;
@@ -103,12 +105,14 @@ def _SLASH_LD : CLFlag<"LD">, HelpText<"Create DLL">;
def _SLASH_LDd : CLFlag<"LDd">, HelpText<"Create debug DLL">;
def _SLASH_link : CLRemainingArgs<"link">,
HelpText<"Forward options to the linker">, MetaVarName<"<options>">;
-def _SLASH_MD : CLFlag<"MD">,
- HelpText<"Use DLL run-time">;
-def _SLASH_MDd : CLFlag<"MDd">,
- HelpText<"Use DLL debug run-time">;
-def _SLASH_MT : CLFlag<"MT">, HelpText<"Use static run-time">;
-def _SLASH_MTd : CLFlag<"MTd">, HelpText<"Use static debug run-time">;
+def _SLASH_MD : Option<["/", "-"], "MD", KIND_FLAG>, Group<_SLASH_M_Group>,
+ Flags<[CLOption, DriverOption]>, HelpText<"Use DLL run-time">;
+def _SLASH_MDd : Option<["/", "-"], "MDd", KIND_FLAG>, Group<_SLASH_M_Group>,
+ Flags<[CLOption, DriverOption]>, HelpText<"Use DLL debug run-time">;
+def _SLASH_MT : Option<["/", "-"], "MT", KIND_FLAG>, Group<_SLASH_M_Group>,
+ Flags<[CLOption, DriverOption]>, HelpText<"Use static run-time">;
+def _SLASH_MTd : Option<["/", "-"], "MTd", KIND_FLAG>, Group<_SLASH_M_Group>,
+ Flags<[CLOption, DriverOption]>, HelpText<"Use static debug run-time">;
def _SLASH_Tc : CLJoinedOrSeparate<"Tc">, HelpText<"Specify a C source file">,
MetaVarName<"<filename>">;
def _SLASH_TC : CLFlag<"TC">, HelpText<"Treat all source files as C">;
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 9bbbaae33e2..7461e999634 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1011,8 +1011,8 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args,
Arg *Previous = *it++;
bool ShowNote = false;
while (it != ie) {
- Diag(clang::diag::warn_drv_overriding_t_option) << Previous->getSpelling()
- << (*it)->getSpelling();
+ Diag(clang::diag::warn_drv_overriding_flag_option)
+ << Previous->getSpelling() << (*it)->getSpelling();
Previous = *it++;
ShowNote = true;
}
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index d519a4c9b5c..eca94b66ef6 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -3722,11 +3722,19 @@ void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
// but defining _DEBUG is sticky.
RTOptionID = options::OPT__SLASH_MTd;
- if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD,
- options::OPT__SLASH_MDd,
- options::OPT__SLASH_MT,
- options::OPT__SLASH_MTd)) {
+ if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) {
RTOptionID = A->getOption().getID();
+
+ // Diagnose overrides.
+ arg_iterator it = Args.filtered_begin(options::OPT__SLASH_M_Group);
+ Arg *Previous = *it++;
+ const arg_iterator ie = Args.filtered_end();
+ while (it != ie) {
+ const Driver &D = getToolChain().getDriver();
+ D.Diag(clang::diag::warn_drv_overriding_flag_option)
+ << Previous->getSpelling() << (*it)->getSpelling();
+ Previous = *it++;
+ }
}
switch(RTOptionID) {
diff --git a/clang/test/Driver/cl-runtime-flags.c b/clang/test/Driver/cl-runtime-flags.c
index 907f99b0440..11a5e948767 100644
--- a/clang/test/Driver/cl-runtime-flags.c
+++ b/clang/test/Driver/cl-runtime-flags.c
@@ -84,3 +84,7 @@
// CHECK-LDMDd: "-D_MT"
// CHECK-LDMDd: "-D_DLL"
// CHECK-LDMDd: "--dependent-lib=msvcrtd"
+
+// RUN: %clang_cl /MD /MT -### -- %s 2>&1 | FileCheck -check-prefix=MTOVERRIDE %s
+// MTOVERRIDE: warning: overriding '/MD' option with '/MT'
+// MTOVERRIDE: "--dependent-lib=libcmt"
OpenPOWER on IntegriCloud