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 @@ -6099,6 +6099,10 @@ HelpText<"Deprecated (set output file name); use /Fe or /Fe">, MetaVarName<"">; def _SLASH_P : CLFlag<"P">, HelpText<"Preprocess to file">; +def _SLASH_permissive : CLFlag<"permissive">, + HelpText<"Enable some non conforming code to compile">; +def _SLASH_permissive_ : CLFlag<"permissive-">, + HelpText<"Disable non conforming code from compiling (default)">; def _SLASH_Tc : CLCompileJoinedOrSeparate<"Tc">, HelpText<"Treat as C source file">, MetaVarName<"">; def _SLASH_TC : CLCompileFlag<"TC">, HelpText<"Treat all source files as C">; @@ -6180,7 +6184,6 @@ def _SLASH_JMC : CLIgnoredFlag<"JMC">; def _SLASH_kernel_ : CLIgnoredFlag<"kernel-">; def _SLASH_nologo : CLIgnoredFlag<"nologo">; -def _SLASH_permissive_ : CLIgnoredFlag<"permissive-">; def _SLASH_RTC : CLIgnoredJoined<"RTC">; def _SLASH_sdl : CLIgnoredFlag<"sdl">; def _SLASH_sdl_ : CLIgnoredFlag<"sdl-">; diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -1523,6 +1523,20 @@ DAL.AddJoinedArg(A, Opts.getOption(options::OPT_D), NewVal); } +static void TranslatePermissive(Arg *A, llvm::opt::DerivedArgList &DAL, + const OptTable &Opts) { + DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_twoPhase_)); + DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_operator_names)); + // There is currently no /Zc:strictStrings- in clang-cl +} + +static void TranslatePermissiveMinus(Arg *A, llvm::opt::DerivedArgList &DAL, + const OptTable &Opts) { + DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_twoPhase)); + DAL.AddFlagArg(A, Opts.getOption(options::OPT_foperator_names)); + DAL.AddFlagArg(A, Opts.getOption(options::OPT__SLASH_Zc_strictStrings)); +} + llvm::opt::DerivedArgList * MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, @@ -1565,6 +1579,12 @@ } else if (A->getOption().matches(options::OPT_D)) { // Translate -Dfoo#bar into -Dfoo=bar. TranslateDArg(A, *DAL, Opts); + } else if (A->getOption().matches(options::OPT__SLASH_permissive)) { + // Expand /permissive + TranslatePermissive(A, *DAL, Opts); + } else if (A->getOption().matches(options::OPT__SLASH_permissive_)) { + // Expand /permissive- + TranslatePermissiveMinus(A, *DAL, Opts); } else if (OFK != Action::OFK_HIP) { // HIP Toolchain translates input args by itself. DAL->append(A); diff --git a/clang/test/Driver/cl-permissive.c b/clang/test/Driver/cl-permissive.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/cl-permissive.c @@ -0,0 +1,17 @@ +// 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 /permissive -### -- %s 2>&1 | FileCheck -check-prefix=PERMISSIVE %s +// PERMISSIVE: "-fno-operator-names" +// PERMISSIVE: "-fdelayed-template-parsing" +// RUN: %clang_cl /permissive- -### -- %s 2>&1 | FileCheck -check-prefix=PERMISSIVE-MINUS %s +// PERMISSIVE-MINUS-NOT: "-fno-operator-names" +// PERMISSIVE-MINUS-NOT: "-fdelayed-template-parsing" + +// The switches set by permissive may then still be manually enabled or disabled +// RUN: %clang_cl /permissive /Zc:twoPhase -### -- %s 2>&1 | FileCheck -check-prefix=PERMISSIVE-OVERWRITE %s +// PERMISSIVE-OVERWRITE: "-fno-operator-names" +// PERMISSIVE-OVERWRITE-NOT: "-fdelayed-template-parsing" +// RUN: %clang_cl /permissive- /Zc:twoPhase- -### -- %s 2>&1 | FileCheck -check-prefix=PERMISSIVE-MINUS-OVERWRITE %s +// PERMISSIVE-MINUS-OVERWRITE-NOT: "-fno-operator-names" +// PERMISSIVE-MINUS-OVERWRITE: "-fdelayed-template-parsing"