On Wed, May 11, 2016 at 10:50:55PM +0200, Jakub Jelinek wrote:
> On Wed, May 11, 2016 at 10:40:36PM +0200, Marek Polacek wrote:
> > We crashed when given --help=^ and Kyrill explained why in the PR
> > (<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71063#c2>).  The following
> > seems as good a fix as any, I think.
> > 
> > Bootstrapped/regtested on x86_64-linux, ok for trunk?
> > 
> > 2016-05-11  Marek Polacek  <pola...@redhat.com>
> > 
> >     PR driver/71063
> >     * opts.c (common_handle_option): Detect missing argument for --help^.
> > 
> >     * gcc.dg/opts-7.c: New test.
> 
> Ok.  But while touching this, can you fix the formatting around too?
> space between * and a, or ++ a, or & exclude_flags?

Happy to.  I've fixed the whole OPT__help_ case:

Bootstrapped/regtested on x86_64-linux, applying to trunk.

2016-05-12  Marek Polacek  <pola...@redhat.com>

        PR driver/71063
        * opts.c (common_handle_option): Detect missing argument for --help^.

        * gcc.dg/opts-7.c: New test.

diff --git gcc/opts.c gcc/opts.c
index 0f9431a..63d41ca 100644
--- gcc/opts.c
+++ 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|<language>}  */
-       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 gcc/testsuite/gcc.dg/opts-7.c gcc/testsuite/gcc.dg/opts-7.c
index e69de29..c54d0b8 100644
--- gcc/testsuite/gcc.dg/opts-7.c
+++ 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 } */

        Marek

Reply via email to