diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23a486928f4..711d8d59092 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-05-12 Marek Polacek + + PR driver/71063 + * opts.c (common_handle_option): Detect missing argument for --help^. + 2016-05-12 Kyrylo Tkachov PR target/70830 diff --git a/gcc/opts.c b/gcc/opts.c index 0f9431a0b32..63d41ca9deb 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1595,7 +1595,7 @@ common_handle_option (struct gcc_options *opts, case OPT__help_: { - const char * a = arg; + const char *a = arg; unsigned int include_flags = 0; /* Note - by default we include undocumented options when listing specific classes. If you only want to see documented options @@ -1612,11 +1612,11 @@ common_handle_option (struct gcc_options *opts, arg = [^]{word}[,{arg}] word = {optimizers|target|warnings|undocumented| params|common|} */ - while (* a != 0) + while (*a != 0) { static const struct { - const char * string; + const char *string; unsigned int flag; } specifics[] = @@ -1631,19 +1631,24 @@ common_handle_option (struct gcc_options *opts, { "common", CL_COMMON }, { NULL, 0 } }; - unsigned int * pflags; - const char * comma; + unsigned int *pflags; + const char *comma; unsigned int lang_flag, specific_flag; unsigned int len; unsigned int i; - if (* a == '^') + if (*a == '^') { - ++ a; - pflags = & exclude_flags; + ++a; + if (*a == '\0') + { + error_at (loc, "missing argument to %qs", "--help=^"); + break; + } + pflags = &exclude_flags; } else - pflags = & include_flags; + pflags = &include_flags; comma = strchr (a, ','); if (comma == NULL) @@ -1680,7 +1685,7 @@ common_handle_option (struct gcc_options *opts, if (specific_flag != 0) { if (lang_flag == 0) - * pflags |= specific_flag; + *pflags |= specific_flag; else { /* The option's argument matches both the start of a @@ -1689,7 +1694,7 @@ common_handle_option (struct gcc_options *opts, specified "--help=c", but otherwise we have to issue a warning. */ if (strncasecmp (a, "c", len) == 0) - * pflags |= lang_flag; + *pflags |= lang_flag; else warning_at (loc, 0, "--help argument %q.*s is ambiguous, " @@ -1698,7 +1703,7 @@ common_handle_option (struct gcc_options *opts, } } else if (lang_flag != 0) - * pflags |= lang_flag; + *pflags |= lang_flag; else warning_at (loc, 0, "unrecognized argument to --help= option: %q.*s", diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41e5d51d8a9..c1b2323e07c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-12 Marek Polacek + + PR driver/71063 + * gcc.dg/opts-7.c: New test. + 2016-05-12 Kyrylo Tkachov PR target/70830 diff --git a/gcc/testsuite/gcc.dg/opts-7.c b/gcc/testsuite/gcc.dg/opts-7.c new file mode 100644 index 00000000000..c54d0b8215a --- /dev/null +++ b/gcc/testsuite/gcc.dg/opts-7.c @@ -0,0 +1,6 @@ +/* PR driver/71063 */ +/* Test we don't ICE. */ +/* { dg-do compile } */ +/* { dg-options "--help=^" } */ + +/* { dg-error "missing argument to" "" { target *-*-* } 0 } */