Re: [PATCH] Fix double apropos output when both alias name and command name match the pattern

Philippe Waroquiers <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
Ping ^ 2 ?
Thanks
Philippe

On Tue, 2026-06-16 at 20:51 +0200, Philippe Waroquiers wrote:
> Ping ?
> Thanks
> Philippe
> 
> On Sun, 2026-05-31 at 18:37 +0200, Philippe Waroquiers wrote:
> > apropos_cmd first tries to match the command name with the pattern.
> > If that succeeds, it prints the command and all its aliases not having
> > a specific doc string.
> > In this case, it should not try to match the command aliases names as
> > the command has already been printed.
> > 
> > Without this patch, the behaviour is:
> > (gdb) alias ter-exec = interpreter-exec
> > (gdb) apropos er-exe
> > interpreter-exec, ter-exec -- Execute a command in an interpreter.
> > interpreter-exec, ter-exec -- Execute a command in an interpreter.
> > (gdb)
> > ---
> >  gdb/cli/cli-decode.c            | 18 ++++++++++--------
> >  gdb/testsuite/gdb.base/help.exp |  8 ++++++++
> >  2 files changed, 18 insertions(+), 8 deletions(-)
> > 
> > diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
> > index de40faeed59..36f911c2cd6 100644
> > --- a/gdb/cli/cli-decode.c
> > +++ b/gdb/cli/cli-decode.c
> > @@ -1784,16 +1784,18 @@ apropos_cmd (struct ui_file *stream,
> >  	  returnvalue = regex.search (c->name, name_len, 0, name_len, NULL);
> >  	  if (returnvalue >= 0)
> >  	    print_doc_of_command (*c, verbose, regex, stream);
> > -
> > -	  /* Try to match against the name of the aliases.  */
> > -	  for (const cmd_list_element &alias : c->aliases)
> > +	  else
> >  	    {
> > -	      name_len = strlen (alias.name);
> > -	      returnvalue = regex.search (alias.name, name_len, 0, name_len, NULL);
> > -	      if (returnvalue >= 0)
> > +	      /* Try to match against the name of the aliases.  */
> > +	      for (const cmd_list_element &alias : c->aliases)
> >  		{
> > -		  print_doc_of_command (*c, verbose, regex, stream);
> > -		  break;
> > +		  name_len = strlen (alias.name);
> > +		  returnvalue = regex.search (alias.name, name_len, 0, name_len, NULL);
> > +		  if (returnvalue >= 0)
> > +		    {
> > +		      print_doc_of_command (*c, verbose, regex, stream);
> > +		      break;
> > +		    }
> >  		}
> >  	    }
> >  	}
> > diff --git a/gdb/testsuite/gdb.base/help.exp b/gdb/testsuite/gdb.base/help.exp
> > index a8c55721ef2..6a88c8d4db2 100644
> > --- a/gdb/testsuite/gdb.base/help.exp
> > +++ b/gdb/testsuite/gdb.base/help.exp
> > @@ -135,6 +135,14 @@ gdb_test_no_output "alias mybt10 = backtrace 10" "define mybt10 alias"
> >  gdb_test "apropos Print backtrace of all stack frames, or innermost COUNT frames\." \
> >      "backtrace, mybt10, mybt, where, bt -- Print backtrace of all stack frames, or innermost COUNT frames\.\[\r\n\]+  alias mybt10 = backtrace 10"
> >  
> > +# Test apropos when both the alias name and the aliased command match the pattern.
> > +gdb_test_no_output "alias ter-exec = interpreter-exec" "define ter-exec alias"
> > +gdb_test_multiple "apropos er-exe" "check we have a single output line when alias and command name match" {
> > +    -re "^apropos er-exe\r\ninterpreter-exec, ter-exec -- Execute a command in an interpreter\.\r\n$gdb_prompt $" {
> > +	pass $gdb_test_name
> > +    }
> > +}
> > +
> >  # Test help for commands having aliases.
> >  gdb_test "help bt" "backtrace, mybt10, mybt, where, bt\[\r\n\]+  alias mybt10 = backtrace 10\[\r\n\]+Print backtrace of all stack frames, or innermost COUNT frames\..*"
> >
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.