diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6701,6 +6701,7 @@ def _SLASH_Wv_ : CLIgnoredJoined<"Wv">; def _SLASH_Zc___cplusplus : CLIgnoredFlag<"Zc:__cplusplus">; def _SLASH_Zc_auto : CLIgnoredFlag<"Zc:auto">; +def _SLASH_Zc_implicitNoexcept : CLIgnoredFlag<"Zc:implicitNoexcept">; def _SLASH_Zc_forScope : CLIgnoredFlag<"Zc:forScope">; def _SLASH_Zc_inline : CLIgnoredFlag<"Zc:inline">; def _SLASH_Zc_rvalueCast : CLIgnoredFlag<"Zc:rvalueCast">; diff --git a/clang/test/Driver/cl-zc.cpp b/clang/test/Driver/cl-zc.cpp --- a/clang/test/Driver/cl-zc.cpp +++ b/clang/test/Driver/cl-zc.cpp @@ -1,6 +1,9 @@ // Note: %s must be preceded by --, otherwise it may be interpreted as a // command-line option, e.g. on Mac where %s is commonly under /Users. +// RUN: %clang_cl /c -### -- %s 2>&1 | FileCheck -check-prefix=DEFAULT %s +// DEFAULT: "-fsized-deallocation" + // RUN: %clang_cl /c -### -- %s 2>&1 | FileCheck -check-prefix=TRIGRAPHS-DEFAULT %s // cc1 will disable trigraphs for -fms-compatibility as long as -ftrigraphs // isn't explicitly passed. diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -234,6 +234,25 @@ } } +static void insertDefaultClangCLZcConformanceArgs( + SmallVectorImpl &ArgVector) { + // Put the /Zc arguments at the start of argument list so that arguments + // specified on + // the command line could override them. Avoid putting them at index 0, as an + // option + // like '-cc1' must remain the first. + int InsertionPoint = 0; + if (ArgVector.size() > 0) + ++InsertionPoint; + + const char *arr[] = { + "/Zc:auto", "/Zc:forScope", "/Zc:implicitNoexcept", + "/Zc:sizedDealloc", "/Zc:threadSafeInit", "/Zc:wchar_t"}; + + ArgVector.insert(ArgVector.begin() + InsertionPoint, std::begin(arr), + std::end(arr)); +} + static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver, SmallVectorImpl &Opts) { llvm::cl::TokenizeWindowsCommandLine(EnvValue, Saver, Opts); @@ -473,6 +492,9 @@ insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings); + if (ClangCLMode) + insertDefaultClangCLZcConformanceArgs(Args); + SetBackdoorDriverOutputsFromEnvVars(TheDriver); if (!UseNewCC1Process) {