This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix reporting of command line options that need an argument, but which occur as the last option on t


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f82aa1657b7254ab634bfcce7354770478c31686

commit f82aa1657b7254ab634bfcce7354770478c31686
Author: Nick Clifton <nickc@redhat.com>
Date:   Thu Oct 29 10:45:10 2015 +0000

    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.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]