diff options
author | Tom Stellard <tstellar@redhat.com> | 2018-05-17 18:55:19 +0000 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2018-05-17 18:55:19 +0000 |
commit | ac7072575e07f73cc283455f3de4541d60abd219 (patch) | |
tree | aebe3beb0ba7d0b60f14590c1e6ed23cefff3f95 | |
parent | eb4d3d308893c2fd863cec9d1b4ec2223a3567a2 (diff) | |
download | llvm-ac7072575e07f73cc283455f3de4541d60abd219.zip llvm-ac7072575e07f73cc283455f3de4541d60abd219.tar.gz llvm-ac7072575e07f73cc283455f3de4541d60abd219.tar.bz2 |
Merging r330926:
------------------------------------------------------------------------
r330926 | sepavloff | 2018-04-25 23:28:47 -0700 (Wed, 25 Apr 2018) | 9 lines
[ConfigFiles] Update argument strings when merging argrument lists
Implementation of `InputArgList` assumes its field `ArgStrings` contains
strings for each argument exactly in the same order. This condition was
broken when arguments from config file and from invocation were merged.
This change fixes https://bugs.llvm.org/show_bug.cgi?id=37196 (Clang
config files can crash argument handling).
------------------------------------------------------------------------
llvm-svn: 332649
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 5 | ||||
-rw-r--r-- | clang/test/Driver/Inputs/empty.cfg | 0 | ||||
-rw-r--r-- | clang/test/Driver/config-file4.c | 2 |
3 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 325b233..c890f77 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -858,11 +858,14 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { : std::move(*CLOptions)); if (HasConfigFile) for (auto *Opt : *CLOptions) { + if (Opt->getOption().matches(options::OPT_config)) + continue; + unsigned Index = Args.MakeIndex(Opt->getSpelling()); const Arg *BaseArg = &Opt->getBaseArg(); if (BaseArg == Opt) BaseArg = nullptr; Arg *Copy = new llvm::opt::Arg(Opt->getOption(), Opt->getSpelling(), - Args.size(), BaseArg); + Index, BaseArg); Copy->getValues() = Opt->getValues(); if (Opt->isClaimed()) Copy->claim(); diff --git a/clang/test/Driver/Inputs/empty.cfg b/clang/test/Driver/Inputs/empty.cfg new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/clang/test/Driver/Inputs/empty.cfg diff --git a/clang/test/Driver/config-file4.c b/clang/test/Driver/config-file4.c new file mode 100644 index 0000000..f61e317 --- /dev/null +++ b/clang/test/Driver/config-file4.c @@ -0,0 +1,2 @@ +// RUN: %clang --config %S/Inputs/empty.cfg -Wall -Wextra -Wformat -Wstrict-aliasing -Wshadow -Wpacked -Winline -Wimplicit-function-declaration -c %s -O2 -o /dev/null -v 2>&1 | FileCheck %s -check-prefix PR37196 +// PR37196: Configuration file: {{.*}}/empty.cfg |