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>
PR ld/19162

View 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':