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.
This commit is contained in:
Nick Clifton 2015-10-29 10:45:10 +00:00
parent 936384714f
commit f82aa1657b
2 changed files with 32 additions and 4 deletions

View 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> 2015-10-29 Alan Modra <amodra@gmail.com>
PR ld/19162 PR ld/19162

View File

@ -65,9 +65,9 @@ static void help (void);
enum control_enum { enum control_enum {
/* Use one dash before long option name. */ /* Use one dash before long option name. */
ONE_DASH, ONE_DASH = 1,
/* Use two dashes before long option name. */ /* Use two dashes before long option name. */
TWO_DASHES, TWO_DASHES = 2,
/* Only accept two dashes before the long option name. /* Only accept two dashes before the long option name.
This is an overloading of the use of this enum, since originally it 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 was only intended to tell the --help display function how to display
@ -679,7 +679,28 @@ parse_args (unsigned argc, char **argv)
switch (optc) switch (optc)
{ {
case '?': 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. */ /* Fall through. */
default: default:
@ -997,7 +1018,7 @@ parse_args (unsigned argc, char **argv)
break; break;
case OPTION_PLUGIN_OPT: case OPTION_PLUGIN_OPT:
if (plugin_opt_plugin_arg (optarg)) if (plugin_opt_plugin_arg (optarg))
einfo(_("%P%F: bad -plugin-opt option\n")); einfo (_("%P%F: bad -plugin-opt option\n"));
break; break;
#endif /* ENABLE_PLUGINS */ #endif /* ENABLE_PLUGINS */
case 'q': case 'q':