Fix reporting of command line options that need an argument, but which occur as the...
authorNick Clifton <nickc@redhat.com>
Thu, 29 Oct 2015 10:45:10 +0000 (10:45 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 29 Oct 2015 10:45:10 +0000 (10:45 +0000)
PR ld/19146
* lexsup.c (parse_args): Correct error message for an option that
is missing its argument if that option is the last one on the
command line.

ld/ChangeLog
ld/lexsup.c

index 69363e1af47dd2b395b7b4f5c51b3d171c64337b..da2227c5c79601ad952d0307d76dddf2f433780d 100644 (file)
@@ -1,3 +1,10 @@
+2015-10-29  Nick Clifton  <nickc@redhat.com>
+
+       PR ld/19146
+       * lexsup.c (parse_args): Correct error message for an option that
+       is missing its argument if that option is the last one on the
+       command line.
+
 2015-10-29  Alan Modra  <amodra@gmail.com>
 
        PR ld/19162
index 1dcbf4cfa72790a2bcbc1a5d8499ba4c3e382a2f..4cad2097a1fb232bb576e2dc5d46bbadc42e1a9d 100644 (file)
@@ -65,9 +65,9 @@ static void help (void);
 
 enum control_enum {
   /* Use one dash before long option name.  */
-  ONE_DASH,
+  ONE_DASH = 1,
   /* Use two dashes before long option name.  */
-  TWO_DASHES,
+  TWO_DASHES = 2,
   /* Only accept two dashes before the long option name.
      This is an overloading of the use of this enum, since originally it
      was only intended to tell the --help display function how to display
@@ -679,7 +679,28 @@ parse_args (unsigned argc, char **argv)
       switch (optc)
        {
        case '?':
-         einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
+         {
+           /* If the last word on the command line is an option that
+              requires an argument, getopt will refuse to recognise it.
+              Try to catch such options here and issue a more helpful
+              error message than just "unrecognized option".  */
+           int opt;
+
+           for (opt = ARRAY_SIZE (ld_options); opt--;)
+             if (ld_options[opt].opt.has_arg == required_argument
+                 /* FIXME: There are a few short options that do not
+                    have long equivalents, but which require arguments.
+                    We should handle them too.  */
+                 && ld_options[opt].opt.name != NULL
+                 && strcmp (argv[last_optind] + ld_options[opt].control, ld_options[opt].opt.name) == 0)
+               {
+                 einfo (_("%P: %s: missing argument\n"), argv[last_optind]);
+                 break;
+               }
+
+           if (opt == -1)
+             einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
+         }
          /* Fall through.  */
 
        default:
@@ -997,7 +1018,7 @@ parse_args (unsigned argc, char **argv)
          break;
        case OPTION_PLUGIN_OPT:
          if (plugin_opt_plugin_arg (optarg))
-           einfo(_("%P%F: bad -plugin-opt option\n"));
+           einfo (_("%P%F: bad -plugin-opt option\n"));
          break;
 #endif /* ENABLE_PLUGINS */
        case 'q':