]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR other/31349 (gcc -v --help returns no options for C, C++)
authorNick Clifton <nickc@redhat.com>
Tue, 19 Feb 2008 10:33:41 +0000 (10:33 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Tue, 19 Feb 2008 10:33:41 +0000 (10:33 +0000)
        PR other/31349
        * opts.c (undocumented_msg): Leave blank unless checking is
        enabled.
        (handle_options): Fix indentation.
        (print_filtered_help): If no language-specific options were
        displayed tell the user how to list all the options supported by
        the language's front-end.
        (print_specific_help): Fix indentation and remove duplicate line.
        (common_handle_option): Handle the -v option.
        For --help enable the display of undocumented options if the -v
        switch has been included on the command line.
        For --help= check for overlaps in the arguments between the option
        classes and the language names and issue a warning when they
        cannot be disambiguated.
        * c.opt (v): Pass on to the common option handler.

From-SVN: r132427

gcc/ChangeLog
gcc/c.opt
gcc/opts.c

index ea1635cc3e716807ed911bfa5a75b5dacce5f4d5..1503d78ffa5d195a03b06966e84d425b2cca97c9 100644 (file)
@@ -1,3 +1,21 @@
+2008-02-19  Nick Clifton  <nickc@redhat.com>
+
+       PR other/31349
+       * opts.c (undocumented_msg): Leave blank unless checking is
+       enabled.
+       (handle_options): Fix indentation.
+       (print_filtered_help): If no language-specific options were
+       displayed tell the user how to list all the options supported by
+       the language's front-end.
+       (print_specific_help): Fix indentation and remove duplicate line.
+       (common_handle_option): Handle the -v option.
+       For --help enable the display of undocumented options if the -v
+       switch has been included on the command line.
+       For --help= check for overlaps in the arguments between the option
+       classes and the language names and issue a warning when they
+       cannot be disambiguated.
+       * c.opt (v): Pass on to the common option handler.
+
 2008-02-19  Revital Eres  <eres@il.ibm.com> 
 
        * modulo-sched.c (sms_schedule): Change dump message when
index 37045197bf18954496db1c3e76ef11db5311cc08..94f0398419d3095ca1d89ff6ae508e16d1e949a0 100644 (file)
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -978,7 +978,7 @@ C ObjC C++ ObjC++
 Do not predefine system-specific and GCC-specific macros
 
 v
-C ObjC C++ ObjC++
+Common C ObjC C++ ObjC++
 Enable verbose output
 
 w
index 16ca6bf81ab8c3bad3f1142de68875973b118c90..f2eea7dcf7edebcb7b0cb1bbd569900c7a2b6874 100644 (file)
@@ -337,7 +337,11 @@ bool no_unit_at_a_time_default;
 struct visibility_flags visibility_options;
 
 /* What to print when a switch has no documentation.  */
+#ifdef ENABLE_CHECKING
 static const char undocumented_msg[] = N_("This switch lacks documentation");
+#else
+static const char undocumented_msg[] = "";
+#endif
 
 /* Used for bookkeeping on whether user set these flags so
    -fprofile-use/-fprofile-generate does not use them.  */
@@ -703,7 +707,7 @@ handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
        {
          if (main_input_filename == NULL)
            {
-           main_input_filename = opt;
+             main_input_filename = opt;
              main_input_baselength
                = base_of_path (main_input_filename, &main_input_basename);
            }
@@ -1169,7 +1173,24 @@ print_filtered_help (unsigned int include_flags,
     }
 
   if (! found)
-    printf (_(" No options with the desired characteristics were found\n"));
+    {
+      unsigned int langs = include_flags & CL_LANG_ALL;
+
+      if (langs == 0)
+       printf (_(" No options with the desired characteristics were found\n"));
+      else
+       {
+         unsigned int i;
+
+         /* PR 31349: Tell the user how to see all of the
+            options supported by a specific front end.  */
+         for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
+           if ((1U << i) & langs)
+             printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
+                     lang_names[i], lang_names[i]);
+       }
+       
+    }
   else if (! displayed)
     printf (_(" All options with the desired characteristics have already been displayed\n"));
 
@@ -1243,13 +1264,10 @@ print_specific_help (unsigned int include_flags,
          if (i >= cl_lang_count)
            break;
          if ((exclude_flags & ((1U << cl_lang_count) - 1)) != 0)
-           {
-             description = _("The following options are specific to the language ");
-             descrip_extra = lang_names [i];
-           }
+           description = _("The following options are specific to the just the language ");
          else
            description = _("The following options are supported by the language ");
-           descrip_extra = lang_names [i];
+         descrip_extra = lang_names [i];
          break;
        }
     }
@@ -1289,6 +1307,7 @@ static int
 common_handle_option (size_t scode, const char *arg, int value,
                      unsigned int lang_mask)
 {
+  static bool verbose = false;
   enum opt_code code = (enum opt_code) scode;
 
   switch (code)
@@ -1297,6 +1316,10 @@ common_handle_option (size_t scode, const char *arg, int value,
       handle_param (arg);
       break;
 
+    case OPT_v:
+      verbose = true;
+      break;
+
     case OPT_fhelp:
     case OPT__help:
       {
@@ -1304,7 +1327,7 @@ common_handle_option (size_t scode, const char *arg, int value,
        unsigned int undoc_mask;
        unsigned int i;
 
-       undoc_mask = extra_warnings ? 0 : CL_UNDOCUMENTED;
+       undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
        /* First display any single language specific options.  */
        for (i = 0; i < cl_lang_count; i++)
          print_specific_help
@@ -1366,6 +1389,7 @@ common_handle_option (size_t scode, const char *arg, int value,
            };
            unsigned int * pflags;
            char * comma;
+           unsigned int lang_flag, specific_flag;
            unsigned int len;
            unsigned int i;
 
@@ -1383,28 +1407,52 @@ common_handle_option (size_t scode, const char *arg, int value,
            else
              len = comma - a;
 
-           for (i = 0; specifics[i].string != NULL; i++)
+           /* Check to see if the string matches an option class name.  */
+           for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
              if (strncasecmp (a, specifics[i].string, len) == 0)
                {
-                 * pflags |= specifics[i].flag;
+                 specific_flag = specifics[i].flag;
+                 break;
+               }
+           
+           /* Check to see if the string matches a language name.
+              Note - we rely upon the alpha-sorted nature of the entries in
+              the lang_names array, specifically that shorter names appear
+              before their longer variants.  (ie C before C++).  That way
+              when we are attempting to match --help=c for example we will
+              match with C first and not C++.  */
+           for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
+             if (strncasecmp (a, lang_names[i], len) == 0)
+               {
+                 lang_flag = 1U << i;
                  break;
                }
 
-           if (specifics[i].string == NULL)
+           if (specific_flag != 0)
              {
-               /* Check to see if the string matches a language name.  */
-               for (i = 0; i < cl_lang_count; i++)
-                 if (strncasecmp (a, lang_names[i], len) == 0)
-                   {
-                     * pflags |= 1U << i;
-                     break;
-                   }
-
-               if (i == cl_lang_count)
-                 fnotice (stderr,
-                          "warning: unrecognized argument to --help= switch: %.*s\n",
-                          len, a);
+               if (lang_flag == 0)
+                 * pflags |= specific_flag;
+               else
+                 {
+                   /* The option's argument matches both the start of a
+                      language name and the start of an option class name.
+                      We have a special case for when the user has
+                      specified "--help=c", but otherwise we have to issue
+                      a warning.  */
+                   if (strncasecmp (a, "c", len) == 0)
+                     * pflags |= lang_flag;
+                   else
+                     fnotice (stderr,
+                              "warning: --help argument %.*s is ambiguous, please be more specific\n",
+                              len, a);
+                 }
              }
+           else if (lang_flag != 0)
+             * pflags |= lang_flag;
+           else
+             fnotice (stderr,
+                      "warning: unrecognized argument to --help= option: %.*s\n",
+                      len, a);
 
            if (comma == NULL)
              break;