From f82aa1657b7254ab634bfcce7354770478c31686 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 29 Oct 2015 10:45:10 +0000 Subject: [PATCH] Fix reporting of command line options that need an argument, but which occur as the last option on the command line. 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 | 7 +++++++ ld/lexsup.c | 29 +++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 69363e1..da2227c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2015-10-29 Nick Clifton + + 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 PR ld/19162 diff --git a/ld/lexsup.c b/ld/lexsup.c index 1dcbf4c..4cad209 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -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': -- 2.7.4