diff options
author | Reid Kleckner <rnk@google.com> | 2017-10-03 00:14:03 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2017-10-03 00:14:03 +0000 |
commit | f6d65dff552386b81bbdd12a38f2712dcd6bdf95 (patch) | |
tree | 0bf9534a0401412053794fbdedcf153214fa34bd /clang | |
parent | 90c7593a752f5a2db1aad8278896384e7599d33f (diff) | |
download | bcm5719-llvm-f6d65dff552386b81bbdd12a38f2712dcd6bdf95.tar.gz bcm5719-llvm-f6d65dff552386b81bbdd12a38f2712dcd6bdf95.zip |
[clang-cl] Claim ignored /O[12xd] arguments
Fixes PR34809
llvm-svn: 314743
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Driver/ToolChains/MSVC.cpp | 40 | ||||
-rw-r--r-- | clang/test/Driver/cl-options.c | 3 |
2 files changed, 23 insertions, 20 deletions
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 7978a6941cb..334a13f0cc6 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -1317,24 +1317,26 @@ static void TranslateOptArg(Arg *A, llvm::opt::DerivedArgList &DAL, case '2': case 'x': case 'd': - if (&OptChar == ExpandChar) { - if (OptChar == 'd') { - DAL.AddFlagArg(A, Opts.getOption(options::OPT_O0)); - } else { - if (OptChar == '1') { - DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "s"); - } else if (OptChar == '2' || OptChar == 'x') { - DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin)); - DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "2"); - } - if (SupportsForcingFramePointer && - !DAL.hasArgNoClaim(options::OPT_fno_omit_frame_pointer)) - DAL.AddFlagArg(A, - Opts.getOption(options::OPT_fomit_frame_pointer)); - if (OptChar == '1' || OptChar == '2') - DAL.AddFlagArg(A, - Opts.getOption(options::OPT_ffunction_sections)); + // Ignore /O[12xd] flags that aren't the last one on the command line. + // Only the last one gets expanded. + if (&OptChar != ExpandChar) { + A->claim(); + break; + } + if (OptChar == 'd') { + DAL.AddFlagArg(A, Opts.getOption(options::OPT_O0)); + } else { + if (OptChar == '1') { + DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "s"); + } else if (OptChar == '2' || OptChar == 'x') { + DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin)); + DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "2"); } + if (SupportsForcingFramePointer && + !DAL.hasArgNoClaim(options::OPT_fno_omit_frame_pointer)) + DAL.AddFlagArg(A, Opts.getOption(options::OPT_fomit_frame_pointer)); + if (OptChar == '1' || OptChar == '2') + DAL.AddFlagArg(A, Opts.getOption(options::OPT_ffunction_sections)); } break; case 'b': @@ -1430,9 +1432,7 @@ MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args, // First step is to search for the character we'd like to expand. const char *ExpandChar = nullptr; - for (Arg *A : Args) { - if (!A->getOption().matches(options::OPT__SLASH_O)) - continue; + for (Arg *A : Args.filtered(options::OPT__SLASH_O)) { StringRef OptStr = A->getValue(); for (size_t I = 0, E = OptStr.size(); I != E; ++I) { char OptChar = OptStr[I]; diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 870378a8299..5d866e5f17b 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -178,6 +178,9 @@ // Oy_2: -momit-leaf-frame-pointer // Oy_2: -O2 +// RUN: %clang_cl --target=i686-pc-win32 -Werror /O2 /O2 -### -- %s 2>&1 | FileCheck -check-prefix=O2O2 %s +// O2O2: "-O2" + // RUN: %clang_cl /Zs -Werror /Oy -- %s 2>&1 // RUN: %clang_cl --target=i686-pc-win32 -Werror /Oy- -### -- %s 2>&1 | FileCheck -check-prefix=Oy_ %s |