Message ID | 20221201165051.51853-1-jason@redhat.com |
---|---|
State | New |
Headers | show |
Series | [RFA] driver: fix validate_switches logic | expand |
On Dec 1, 2022, Jason Merrill <jason@redhat.com> wrote: > Once we see g*, starred is set. Then we see %:, and it sees that as a > zero-length switch, which because starred is still set, matches any and all > command-line options. So targets that use such a spec accept all options in > the driver, while ones that don't reject some, such as the recent > -nostdlib++. Woo, nice catch, thanks! I don't have authority to approve the patch, but it's ok as far as I'm concerned.
On Fri, Dec 2, 2022 at 7:37 AM Alexandre Oliva via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On Dec 1, 2022, Jason Merrill <jason@redhat.com> wrote: > > > Once we see g*, starred is set. Then we see %:, and it sees that as a > > zero-length switch, which because starred is still set, matches any and all > > command-line options. So targets that use such a spec accept all options in > > the driver, while ones that don't reject some, such as the recent > > -nostdlib++. > > Woo, nice catch, thanks! > > I don't have authority to approve the patch, > but it's ok as far as I'm concerned. OK. > -- > Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/ > Free Software Activist GNU Toolchain Engineer > Disinformation flourishes because many people care deeply about injustice > but very few check the facts. Ask me about <https://stallmansupport.org>
diff --git a/gcc/cp/g++spec.cc b/gcc/cp/g++spec.cc index e599ac906f6..3d3b042dd56 100644 --- a/gcc/cp/g++spec.cc +++ b/gcc/cp/g++spec.cc @@ -167,8 +167,10 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, need_experimental = true; break; - case OPT_nostdlib: case OPT_nostdlib__: + args[i] |= SKIPOPT; + /* FALLTHRU */ + case OPT_nostdlib: case OPT_nodefaultlibs: library = -1; break; diff --git a/gcc/gcc.cc b/gcc/gcc.cc index ca1c9e27a94..2278e2b6bb1 100644 --- a/gcc/gcc.cc +++ b/gcc/gcc.cc @@ -9299,12 +9299,15 @@ validate_switches (const char *start, bool user_spec, bool braced) const char *atom; size_t len; int i; - bool suffix = false; - bool starred = false; + bool suffix; + bool starred; #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0) next_member: + suffix = false; + starred = false; + SKIP_WHITE (); if (*p == '!')