[v3,19/19] Remove the vector return result from the completion API.

Message ID 20150806192149.32159.83473.stgit@valrhona.uglyboxes.com
State New, archived
Headers

Commit Message

Keith Seitz Aug. 6, 2015, 7:22 p.m. UTC
  Differences in this revision:

1. Updated new TUI completion functions.

---

This patch completes the redesign of the completion and completion-
limiting API.  Since the completer's internal data is now responsible
for tracking all completions and the result of the completion operation
no longer uses vectors (except for the final list given to readline),
we can remove the vectors from the API entirely.

gdb/ChangeLog

	* command.h (completer_ftype): Change return type from
	VEC (char_ptr) * to void.  Update all users of this definition.
	* completer.h (add_completion): Remove vector argument.
	All users updated.
	* symtab.c (free_completion_list): Remove.
	(do_free_completion_list): Remove.
	(return_val): Remove global.
---
 gdb/ada-lang.c            |   47 +++++--------
 gdb/break-catch-syscall.c |    8 +-
 gdb/breakpoint.c          |   15 ++--
 gdb/cli/cli-decode.c      |   28 +++-----
 gdb/command.h             |   18 +++--
 gdb/completer.c           |  161 ++++++++++++++++++---------------------------
 gdb/completer.h           |   51 +++++++-------
 gdb/corefile.c            |    4 +
 gdb/cp-abi.c              |    4 +
 gdb/f-lang.c              |    6 +-
 gdb/guile/scm-cmd.c       |   30 +++-----
 gdb/infrun.c              |   12 +--
 gdb/interps.c             |    7 +-
 gdb/language.h            |    2 -
 gdb/python/py-cmd.c       |   10 +--
 gdb/remote-sim.c          |   10 +--
 gdb/symtab.c              |   98 +++++++--------------------
 gdb/symtab.h              |   15 ++--
 gdb/tui/tui-layout.c      |    4 +
 gdb/tui/tui-regs.c        |    9 +--
 gdb/tui/tui-win.c         |   22 +++---
 gdb/value.c               |    7 +-
 gdb/value.h               |    4 +
 23 files changed, 220 insertions(+), 352 deletions(-)
  

Comments

Doug Evans Aug. 23, 2015, 6:01 p.m. UTC | #1
Keith Seitz <keiths@redhat.com> writes:
> Differences in this revision:
>
> 1. Updated new TUI completion functions.
>
> ---
>
> This patch completes the redesign of the completion and completion-
> limiting API.  Since the completer's internal data is now responsible
> for tracking all completions and the result of the completion operation
> no longer uses vectors (except for the final list given to readline),
> we can remove the vectors from the API entirely.
>
> gdb/ChangeLog
>
> 	* command.h (completer_ftype): Change return type from
> 	VEC (char_ptr) * to void.  Update all users of this definition.
> 	* completer.h (add_completion): Remove vector argument.
> 	All users updated.
> 	* symtab.c (free_completion_list): Remove.
> 	(do_free_completion_list): Remove.
> 	(return_val): Remove global.

Hi.
Just a couple of nits.

> diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
> index 5df08be..5effb48 100644
> --- a/gdb/ada-lang.c
> +++ b/gdb/ada-lang.c
> @@ -6199,8 +6199,7 @@ symbol_completion_match (const char *sym_name,
>     encoded).  */
>  
>  static enum add_completion_status
> -symbol_completion_add (VEC(char_ptr) **sv,
> -		       struct completer_data *cdata,
> +symbol_completion_add (struct completer_data *cdata,
>                         const char *sym_name,
>                         const char *text, int text_len,
>                         const char *orig_text, const char *word,
> @@ -6213,14 +6212,13 @@ symbol_completion_add (VEC(char_ptr) **sv,
>  
>    /* We found a match, so add the appropriate completion to the given
>       string vector.  */
> -  return add_completion (cdata, sv, match, orig_text, word);
> +  return add_completion (cdata, match, orig_text, word);
>  }
>  
>  /* An object of this type is passed as the user_data argument to the
>     expand_symtabs_matching method.  */
>  struct add_partial_datum
>  {
> -  VEC(char_ptr) **completions;
>    const char *text;
>    int text_len;
>    const char *text0;
> @@ -6243,7 +6241,7 @@ ada_complete_symbol_matcher (const char *name, void *user_data)
>  /* Return a list of possible symbol names completing TEXT0.  WORD is
>     the entire command on which completion is made.  */
>  
> -static VEC (char_ptr) *
> +static void
>  ada_make_symbol_completion_list (struct completer_data *cdata,
>  				 const char *text0, const char *word,
>  				 enum type_code code)
> @@ -6252,7 +6250,6 @@ ada_make_symbol_completion_list (struct completer_data *cdata,
>    int text_len;
>    int wild_match_p;
>    int encoded_p;
> -  VEC(char_ptr) *completions = VEC_alloc (char_ptr, 128);
>    struct symbol *sym;
>    struct compunit_symtab *s;
>    struct minimal_symbol *msymbol;
> @@ -6293,7 +6290,6 @@ ada_make_symbol_completion_list (struct completer_data *cdata,
>    {
>      struct add_partial_datum data;
>  
> -    data.completions = &completions;
>      data.text = text;
>      data.text_len = text_len;
>      data.text0 = text0;
> @@ -6312,14 +6308,13 @@ ada_make_symbol_completion_list (struct completer_data *cdata,
>    ALL_MSYMBOLS (objfile, msymbol)
>    {
>      QUIT;
> -    status = symbol_completion_add (&completions, cdata,
> -					 MSYMBOL_LINKAGE_NAME (msymbol),
> -					 text, text_len, text0, word,
> -					 wild_match_p, encoded_p);
> +    status = symbol_completion_add (cdata, MSYMBOL_LINKAGE_NAME (msymbol),
> +				    text, text_len, text0, word,
> +				    wild_match_p, encoded_p);
>      if (status == ADD_COMPLETION_MAX_REACHED)
>        {
>  	do_cleanups (old_chain);
> -	return completions;
> +	return;
>        }
>    }
>  
> @@ -6333,14 +6328,13 @@ ada_make_symbol_completion_list (struct completer_data *cdata,
>  
>        ALL_BLOCK_SYMBOLS (b, iter, sym)
>        {
> -        status = symbol_completion_add (&completions, cdata,
> -					     SYMBOL_LINKAGE_NAME (sym),
> -					     text, text_len, text0, word,
> -					     wild_match_p, encoded_p);
> +        status = symbol_completion_add (cdata, SYMBOL_LINKAGE_NAME (sym),
> +					text, text_len, text0, word,
> +					wild_match_p, encoded_p);
>  	if (status == ADD_COMPLETION_MAX_REACHED)
>  	  {
>  	    do_cleanups (old_chain);
> -	    return completions;
> +	    return;
>  	  }
>        }
>      }
> @@ -6354,14 +6348,13 @@ ada_make_symbol_completion_list (struct completer_data *cdata,
>      b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), GLOBAL_BLOCK);
>      ALL_BLOCK_SYMBOLS (b, iter, sym)
>      {
> -      status = symbol_completion_add (&completions, cdata,
> -					   SYMBOL_LINKAGE_NAME (sym),
> -					   text, text_len, text0, word,
> -					   wild_match_p, encoded_p);
> +      status = symbol_completion_add (cdata,SYMBOL_LINKAGE_NAME (sym),
> +				      text, text_len, text0, word,
> +				      wild_match_p, encoded_p);
>        if (status == ADD_COMPLETION_MAX_REACHED)
>  	{
>  	  do_cleanups (old_chain);
> -	  return completions;
> +	  return;
>  	}
>      }
>    }
> @@ -6375,20 +6368,18 @@ ada_make_symbol_completion_list (struct completer_data *cdata,
>        continue;
>      ALL_BLOCK_SYMBOLS (b, iter, sym)
>      {
> -      status = symbol_completion_add (&completions, cdata,
> -					   SYMBOL_LINKAGE_NAME (sym),
> -					   text, text_len, text0, word,
> -					   wild_match_p, encoded_p);
> +      status = symbol_completion_add (cdata, SYMBOL_LINKAGE_NAME (sym),
> +				      text, text_len, text0, word,
> +				      wild_match_p, encoded_p);
>        if (status == ADD_COMPLETION_MAX_REACHED)
>  	{
>  	  do_cleanups (old_chain);
> -	  return completions;
> +	  return;
>  	}
>      }
>    }
>  
>    do_cleanups (old_chain);
> -  return completions;
>  }
>  
>                                  /* Field Access */
> diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
> index 4677132..a542826 100644
> --- a/gdb/break-catch-syscall.c
> +++ b/gdb/break-catch-syscall.c
> @@ -591,17 +591,17 @@ catching_syscall_number (int syscall_number)
>  }
>  
>  /* Complete syscall names.  Used by "catch syscall".  */
> -static VEC (char_ptr) *
> +static void
>  catch_syscall_completer (struct completer_data *cdata,
>  			 struct cmd_list_element *cmd,
>                           const char *text, const char *word)
>  {
>    const char **list = get_syscall_names (get_current_arch ());
> -  VEC (char_ptr) *retlist
> -    = (list == NULL) ? NULL : complete_on_enum (cdata, list, word, word);
> +
> +  if (list != NULL)
> +    complete_on_enum (cdata, list, word, word);
>  
>    xfree (list);
> -  return retlist;
>  }
>  
>  static void
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index 24243c4..08901ae 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -1032,7 +1032,7 @@ set_breakpoint_condition (struct breakpoint *b, const char *exp,
>  
>  /* Completion for the "condition" command.  */
>  
> -static VEC (char_ptr) *
> +static void
>  condition_completer (struct completer_data *cdata,
>  		     struct cmd_list_element *cmd,
>  		     const char *text, const char *word)
> @@ -1045,14 +1045,13 @@ condition_completer (struct completer_data *cdata,
>      {
>        int len;
>        struct breakpoint *b;
> -      VEC (char_ptr) *result = NULL;
>  
>        if (text[0] == '$')
>  	{
>  	  /* We don't support completion of history indices.  */
> -	  if (isdigit (text[1]))
> -	    return NULL;
> -	  return complete_internalvar (cdata, &text[1]);
> +	  if (!isdigit (text[1]))
> +	    complete_internalvar (cdata, &text[1]);
> +	  return;
>  	}
>  
>        /* We're completing the breakpoint number.  */
> @@ -1066,18 +1065,18 @@ condition_completer (struct completer_data *cdata,
>  
>  	  if (strncmp (number, text, len) == 0)
>  	    {
> -	      if (add_completion (cdata, &result, number, NULL, NULL)
> +	      if (add_completion (cdata, number, NULL, NULL)
>  		  == ADD_COMPLETION_MAX_REACHED)
>  		break;
>  	    }
>  	}
>  
> -      return result;
> +      return;
>      }
>  
>    /* We're completing the expression part.  */
>    text = skip_spaces_const (space);
> -  return expression_completer (cdata, cmd, text, word);
> +  expression_completer (cdata, cmd, text, word);
>  }
>  
>  /* condition N EXP -- set break condition of breakpoint N to EXP.  */
> diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
> index 9691fd1..9e7bf80 100644
> --- a/gdb/cli/cli-decode.c
> +++ b/gdb/cli/cli-decode.c
> @@ -647,7 +647,7 @@ add_setshow_optional_filename_cmd (const char *name, enum command_class theclass
>  /* Completes on literal "unlimited".  Used by integer commands that
>     support a special "unlimited" value.  */
>  
> -static VEC (char_ptr) *
> +static void
>  integer_unlimited_completer (struct completer_data *cdata,
>  			     struct cmd_list_element *ignore,
>  			     const char *text, const char *word)
> @@ -658,7 +658,7 @@ integer_unlimited_completer (struct completer_data *cdata,
>        NULL,
>      };
>  
> -  return complete_on_enum (cdata, keywords, text, word);
> +  complete_on_enum (cdata, keywords, text, word);
>  }
>  
>  /* Add element named NAME to both the set and show command LISTs (the
> @@ -1757,22 +1757,21 @@ lookup_cmd_composition (const char *text,
>  
>  /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
>  
> -/* Return a vector of char pointers which point to the different
> -   possible completions in LIST of TEXT.
> +/* Add completions to CDATA for the different possible completions
> +   in LIST of TEXT.
>  
>     WORD points in the same buffer as TEXT, and completions should be
>     returned relative to this position.  For example, suppose TEXT is
>     "foo" and we want to complete to "foobar".  If WORD is "oo", return
>     "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
>  
> -VEC (char_ptr) *
> +void
>  complete_on_cmdlist (struct completer_data *cdata,
>  		     struct cmd_list_element *list,
>  		     const char *text, const char *word,
>  		     int ignore_help_classes)
>  {
>    struct cmd_list_element *ptr;
> -  VEC (char_ptr) *matchlist = NULL;
>    int textlen = strlen (text);
>    int pass;
>    int saw_deprecated_match = 0;
> @@ -1798,35 +1797,32 @@ complete_on_cmdlist (struct completer_data *cdata,
>  		  }
>  	      }
>  
> -	    if (add_completion (cdata, &matchlist, ptr->name, text, word)
> +	    if (add_completion (cdata, ptr->name, text, word)
>  		== ADD_COMPLETION_MAX_REACHED)
> -	      return matchlist;
> +	      return;
>  	  }
>        /* If we saw no matching deprecated commands in the first pass,
>  	 just bail out.  */
>        if (!saw_deprecated_match)
>  	break;
>      }
> -
> -  return matchlist;
>  }
>  
>  /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
>  
> -/* Return a vector of char pointers which point to the different
> -   possible completions in CMD of TEXT.
> +/* Add completions to CDATA for the different possible completions in
> +   CMD of TEXT.
>  
>     WORD points in the same buffer as TEXT, and completions should be
>     returned relative to this position.  For example, suppose TEXT is "foo"
>     and we want to complete to "foobar".  If WORD is "oo", return
>     "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
>  
> -VEC (char_ptr) *
> +void
>  complete_on_enum (struct completer_data *cdata,
>  		  const char *const *enumlist,
>  		  const char *text, const char *word)
>  {
> -  VEC (char_ptr) *matchlist = NULL;
>    int textlen = strlen (text);
>    int i;
>    const char *name;
> @@ -1834,12 +1830,10 @@ complete_on_enum (struct completer_data *cdata,
>    for (i = 0; (name = enumlist[i]) != NULL; i++)
>      if (strncmp (name, text, textlen) == 0)
>        {
> -	if (add_completion (cdata, &matchlist, name, text, word)
> +	if (add_completion (cdata, name, text, word)
>  	    == ADD_COMPLETION_MAX_REACHED)
>  	  break;
>        }
> -
> -  return matchlist;
>  }
>  
>  
> diff --git a/gdb/command.h b/gdb/command.h
> index b2aeb30..82872c0 100644
> --- a/gdb/command.h
> +++ b/gdb/command.h
> @@ -158,9 +158,9 @@ typedef void cmd_sfunc_ftype (char *args, int from_tty,
>  extern void set_cmd_sfunc (struct cmd_list_element *cmd,
>  			   cmd_sfunc_ftype *sfunc);
>  
> -typedef VEC (char_ptr) *completer_ftype (struct completer_data *,
> -					 struct cmd_list_element *,
> -					 const char *, const char *);
> +typedef void completer_ftype (struct completer_data *,
> +			      struct cmd_list_element *,
> +			      const char *, const char *);
>  
>  typedef void completer_ftype_void (struct cmd_list_element *,
>  				   const char *, const char *);
> @@ -228,13 +228,13 @@ extern struct cmd_list_element *add_info (const char *,
>  extern struct cmd_list_element *add_info_alias (const char *, const char *,
>  						int);
>  
> -extern VEC (char_ptr) *complete_on_cmdlist (struct completer_data *,
> -					    struct cmd_list_element *,
> -					    const char *, const char *, int);
> +extern void complete_on_cmdlist (struct completer_data *,
> +				 struct cmd_list_element *,
> +				 const char *, const char *, int);
>  
> -extern VEC (char_ptr) *complete_on_enum (struct completer_data *,
> -					 const char *const *enumlist,
> -					 const char *, const char *);
> +extern void complete_on_enum (struct completer_data *,
> +			      const char *const *enumlist,
> +			      const char *, const char *);
>  
>  /* Functions that implement commands about CLI commands.  */
>  
> diff --git a/gdb/completer.c b/gdb/completer.c
> index 6faed31..2ca7d2d 100644
> --- a/gdb/completer.c
> +++ b/gdb/completer.c
> @@ -144,22 +144,23 @@ readline_line_completion_function (const char *text, int matches)
>  
>  /* This can be used for functions which don't want to complete on
>     symbols but don't want to complete on anything else either.  */
> -VEC (char_ptr) *
> +
> +void
>  noop_completer (struct completer_data *cdata,
>  		struct cmd_list_element *ignore,
>  		const char *text, const char *prefix)
>  {
> -  return NULL;
> +  /* Nothing.  */
>  }
>  
>  /* Complete on filenames.  */
> -VEC (char_ptr) *
> +
> +void
>  filename_completer (struct completer_data *cdata,
>  		    struct cmd_list_element *ignore,
>  		    const char *text, const char *word)
>  {
>    int subsequent_name;
> -  VEC (char_ptr) *return_val = NULL;
>  
>    subsequent_name = 0;
>    while (1)
> @@ -182,7 +183,7 @@ filename_completer (struct completer_data *cdata,
>  	  continue;
>  	}
>  
> -      if (add_completion (cdata, &return_val, p, text, word)
> +      if (add_completion (cdata, p, text, word)
>  	  == ADD_COMPLETION_MAX_REACHED)
>  	break;
>      }
> @@ -194,7 +195,6 @@ filename_completer (struct completer_data *cdata,
>       with respect to inserting quotes.  */
>    rl_completer_word_break_characters = "";
>  #endif
> -  return return_val;
>  }
>  
>  /* A hashtable traversal function to remove leading file name
> @@ -220,14 +220,12 @@ remove_leading_fn_component (void **slot, void *calldata)
>     This is intended to be used in commands that set breakpoints
>     etc.  */
>  
> -VEC (char_ptr) *
> +void
>  location_completer (struct completer_data *cdata,
>  		    struct cmd_list_element *ignore,
>  		    const char *text, const char *word)
>  {
>    int n_syms, n_files, ix;
> -  VEC (char_ptr) *fn_list = NULL;
> -  VEC (char_ptr) *list = NULL;
>    const char *p;
>    int quote_found = 0;
>    int quoted = *text == '\'' || *text == '"';
> @@ -298,15 +296,15 @@ location_completer (struct completer_data *cdata,
>       symbols as well as on files.  */
>    if (colon)
>      {
> -      list = make_file_symbol_completion_list (cdata, symbol_start, word,
> -					       file_to_match);
> +      make_file_symbol_completion_list (cdata, symbol_start, word,
> +					file_to_match);
>        n_syms = get_completion_count (cdata);
>        n_files = 0;
>        xfree (file_to_match);
>      }
>    else
>      {
> -      list = make_symbol_completion_list (cdata, symbol_start, word);
> +      make_symbol_completion_list (cdata, symbol_start, word);
>        n_syms = get_completion_count (cdata);
>        n_files = 0;
>        /* If text includes characters which cannot appear in a file
> @@ -314,27 +312,11 @@ location_completer (struct completer_data *cdata,
>        if (strcspn (text, 
>  		   gdb_completer_file_name_break_characters) == text_len)
>  	{
> -	  fn_list = make_source_files_completion_list (cdata, text, text);
> +	  make_source_files_completion_list (cdata, text, text);
>  	  n_files = get_completion_count (cdata) - n_syms;
>  	}
>      }
>  
> -  /* Catenate fn_list[] onto the end of list[].  */
> -  if (!n_syms)
> -    {
> -      VEC_free (char_ptr, list); /* Paranoia.  */
> -      list = fn_list;
> -      fn_list = NULL;
> -    }
> -  else
> -    {
> -      char *fn;
> -
> -      for (ix = 0; VEC_iterate (char_ptr, fn_list, ix, fn); ++ix)
> -	VEC_safe_push (char_ptr, list, fn);
> -      VEC_free (char_ptr, fn_list);
> -    }
> -
>    if (n_syms && n_files)
>      {
>        /* Nothing.  */
> @@ -365,18 +347,15 @@ location_completer (struct completer_data *cdata,
>      {
>        /* No completions at all.  As the final resort, try completing
>  	 on the entire text as a symbol.  */
> -      list = make_symbol_completion_list (cdata, orig_text, word);
> +      make_symbol_completion_list (cdata, orig_text, word);
>      }
> -
> -  return list;
>  }
>  
>  /* Helper for expression_completer which recursively adds field and
>     method names from TYPE, a struct or union type, to the array
>     OUTPUT.  */

====
Function comment needs updating.

>  static void
> -add_struct_fields (struct completer_data *cdata,
> -		   struct type *type, VEC (char_ptr) **output,
> +add_struct_fields (struct completer_data *cdata, struct type *type,
>  		   char *fieldname, int namelen)
>  {
>    int i;
> @@ -388,7 +367,7 @@ add_struct_fields (struct completer_data *cdata,
>      {
>        if (i < TYPE_N_BASECLASSES (type))
>  	add_struct_fields (cdata, TYPE_BASECLASS (type, i),
> -			   output, fieldname, namelen);
> +			   fieldname, namelen);
>        else if (TYPE_FIELD_NAME (type, i))
>  	{
>  	  if (TYPE_FIELD_NAME (type, i)[0] != '\0')
> @@ -396,7 +375,7 @@ add_struct_fields (struct completer_data *cdata,
>  	      if (! strncmp (TYPE_FIELD_NAME (type, i), 
>  			     fieldname, namelen))
>  		{
> -		  if (add_completion (cdata, output, TYPE_FIELD_NAME (type, i),
> +		  if (add_completion (cdata, TYPE_FIELD_NAME (type, i),
>  				      NULL, NULL)
>  		      == ADD_COMPLETION_MAX_REACHED)
>  		    return;
> @@ -406,7 +385,7 @@ add_struct_fields (struct completer_data *cdata,
>  	    {
>  	      /* Recurse into anonymous unions.  */
>  	      add_struct_fields (cdata, TYPE_FIELD_TYPE (type, i),
> -				 output, fieldname, namelen);
> +				 fieldname, namelen);
>  	    }
>  	}
>      }
> @@ -425,7 +404,7 @@ add_struct_fields (struct completer_data *cdata,
>  	  /* Omit constructors from the completion list.  */
>  	  if (!type_name || strcmp (type_name, name))
>  	    {
> -	      if (add_completion (cdata, output, name, NULL, NULL)
> +	      if (add_completion (cdata, name, NULL, NULL)
>  		  == ADD_COMPLETION_MAX_REACHED)
>  		return;
>  	    }
> @@ -436,7 +415,8 @@ add_struct_fields (struct completer_data *cdata,
>  /* Complete on expressions.  Often this means completing on symbol
>     names, but some language parsers also have support for completing
>     field names.  */
> -VEC (char_ptr) *
> +
> +void
>  expression_completer (struct completer_data *cdata,
>  		      struct cmd_list_element *ignore,
>  		      const char *text, const char *word)
> @@ -455,7 +435,7 @@ expression_completer (struct completer_data *cdata,
>      }
>    CATCH (except, RETURN_MASK_ERROR)
>      {
> -      return NULL;
> +      return;
>      }
>    END_CATCH
>  
> @@ -474,22 +454,19 @@ expression_completer (struct completer_data *cdata,
>  	  || TYPE_CODE (type) == TYPE_CODE_STRUCT)
>  	{
>  	  int flen = strlen (fieldname);
> -	  VEC (char_ptr) *result = NULL;
>  
> -	  add_struct_fields (cdata, type, &result, fieldname, flen);
> +	  add_struct_fields (cdata, type, fieldname, flen);
>  	  xfree (fieldname);
> -	  return result;
> +	  return;
>  	}
>      }
>    else if (fieldname && code != TYPE_CODE_UNDEF)
>      {
> -      VEC (char_ptr) *result;
>        struct cleanup *cleanup = make_cleanup (xfree, fieldname);
>  
> -      result
> -	= make_symbol_completion_type (cdata, fieldname, fieldname, code);
> +      make_symbol_completion_type (cdata, fieldname, fieldname, code);
>        do_cleanups (cleanup);
> -      return result;
> +      return;
>      }
>    xfree (fieldname);
>  
> @@ -501,7 +478,7 @@ expression_completer (struct completer_data *cdata,
>      ;
>  
>    /* Not ideal but it is what we used to do before...  */
> -  return location_completer (cdata, ignore, p, word);
> +  location_completer (cdata, ignore, p, word);
>  }
>  
>  /* See definition in completer.h.  */
> @@ -578,12 +555,11 @@ complete_line_internal_reason;
>     once sub-command completions are exhausted, we simply return NULL.
>   */
>  
> -static VEC (char_ptr) *
> +static void
>  complete_line_internal (struct completer_data *cdata,
>  			const char *text, const char *line_buffer, int point,
>  			complete_line_internal_reason reason)
>  {
> -  VEC (char_ptr) *list = NULL;
>    char *tmp_command;
>    const char *p;
>    int ignore_help_classes;
> @@ -638,7 +614,7 @@ complete_line_internal (struct completer_data *cdata,
>      {
>        /* It is an unrecognized command.  So there are no
>  	 possible completions.  */
> -      list = NULL;
> +      return;
>      }
>    else if (c == CMD_LIST_AMBIGUOUS)
>      {
> @@ -656,7 +632,7 @@ complete_line_internal (struct completer_data *cdata,
>  	     example, "info t " or "info t foo" does not complete
>  	     to anything, because "info t" can be "info target" or
>  	     "info terminal".  */
> -	  list = NULL;
> +	  return;
>  	}
>        else
>  	{
> @@ -665,14 +641,14 @@ complete_line_internal (struct completer_data *cdata,
>  	  if (result_list)
>  	    {
>  	      if (reason != handle_brkchars)
> -		list = complete_on_cmdlist (cdata, *result_list->prefixlist,
> -					    p, word, ignore_help_classes);
> +		complete_on_cmdlist (cdata, *result_list->prefixlist,
> +				     p, word, ignore_help_classes);
>  	    }
>  	  else
>  	    {
>  	      if (reason != handle_brkchars)
> -		list = complete_on_cmdlist (cdata, cmdlist, p, word,
> -					    ignore_help_classes);
> +		complete_on_cmdlist (cdata, cmdlist, p, word,
> +				     ignore_help_classes);
>  	    }
>  	  /* Ensure that readline does the right thing with respect to
>  	     inserting quotes.  */
> @@ -698,8 +674,8 @@ complete_line_internal (struct completer_data *cdata,
>  		  /* It is a prefix command; what comes after it is
>  		     a subcommand (e.g. "info ").  */
>  		  if (reason != handle_brkchars)
> -		    list = complete_on_cmdlist (cdata, *c->prefixlist, p,
> -						word, ignore_help_classes);
> +		    complete_on_cmdlist (cdata, *c->prefixlist, p,
> +					 word, ignore_help_classes);
>  
>  		  /* Ensure that readline does the right thing
>  		     with respect to inserting quotes.  */
> @@ -707,11 +683,11 @@ complete_line_internal (struct completer_data *cdata,
>  		    gdb_completer_command_word_break_characters;
>  		}
>  	      else if (reason == handle_help)
> -		list = NULL;
> +		return;
>  	      else if (c->enums)
>  		{
>  		  if (reason != handle_brkchars)
> -		    list = complete_on_enum (cdata, c->enums, p, word);
> +		    complete_on_enum (cdata, c->enums, p, word);
>  		  rl_completer_word_break_characters =
>  		    gdb_completer_command_word_break_characters;
>  		}
> @@ -751,7 +727,7 @@ complete_line_internal (struct completer_data *cdata,
>  		      && c->completer_handle_brkchars != NULL)
>  		    (*c->completer_handle_brkchars) (c, p, word);
>  		  if (reason != handle_brkchars && c->completer != NULL)
> -		    list = (*c->completer) (cdata, c, p, word);
> +		    (*c->completer) (cdata, c, p, word);
>  		}
>  	    }
>  	  else
> @@ -773,8 +749,8 @@ complete_line_internal (struct completer_data *cdata,
>  		}
>  
>  	      if (reason != handle_brkchars)
> -		list = complete_on_cmdlist (cdata, result_list, q, word,
> -					    ignore_help_classes);
> +		complete_on_cmdlist (cdata, result_list, q, word,
> +				     ignore_help_classes);
>  
>  	      /* Ensure that readline does the right thing
>  		 with respect to inserting quotes.  */
> @@ -783,7 +759,7 @@ complete_line_internal (struct completer_data *cdata,
>  	    }
>  	}
>        else if (reason == handle_help)
> -	list = NULL;
> +	return;
>        else
>  	{
>  	  /* There is non-whitespace beyond the command.  */
> @@ -792,12 +768,12 @@ complete_line_internal (struct completer_data *cdata,
>  	    {
>  	      /* It is an unrecognized subcommand of a prefix command,
>  		 e.g. "info adsfkdj".  */
> -	      list = NULL;
> +	      return;
>  	    }
>  	  else if (c->enums)
>  	    {
>  	      if (reason != handle_brkchars)
> -		list = complete_on_enum (cdata, c->enums, p, word);
> +		complete_on_enum (cdata, c->enums, p, word);
>  	    }
>  	  else
>  	    {
> @@ -827,12 +803,10 @@ complete_line_internal (struct completer_data *cdata,
>  		  && c->completer_handle_brkchars != NULL)
>  		(*c->completer_handle_brkchars) (c, p, word);
>  	      if (reason != handle_brkchars && c->completer != NULL)
> -		list = (*c->completer) (cdata, c, p, word);
> +		(*c->completer) (cdata, c, p, word);
>  	    }
>  	}
>      }
> -
> -  return list;
>  }
>  
>  /* Allocate a new completer data structure.  */
> @@ -986,8 +960,8 @@ get_maximum_completions (void)
>  /* See completer.h.  */
>  
>  enum add_completion_status
> -add_completion (struct completer_data *cdata, VEC (char_ptr) **result,
> -		const char *match, const char *text, const char *word)
> +add_completion (struct completer_data *cdata, const char *match,
> +		const char *text, const char *word)
>  {
>    enum maybe_add_completion_enum add_status;
>    char *alloc = completer_strdup (match, text, word);
> @@ -996,10 +970,8 @@ add_completion (struct completer_data *cdata, VEC (char_ptr) **result,
>    switch (add_status)
>      {
>      case MAYBE_ADD_COMPLETION_OK:
> -      VEC_safe_push (char_ptr, *result, alloc);
>        break;
>      case MAYBE_ADD_COMPLETION_OK_MAX_REACHED:
> -      VEC_safe_push (char_ptr, *result, alloc);
>        return ADD_COMPLETION_MAX_REACHED;
>      case MAYBE_ADD_COMPLETION_MAX_REACHED:
>        xfree (alloc);
> @@ -1054,23 +1026,23 @@ complete_line (const char *text, const char *line_buffer, int point)
>  }
>  
>  /* Complete on command names.  Used by "help".  */
> -VEC (char_ptr) *
> +
> +void
>  command_completer (struct completer_data *cdata,
>  		   struct cmd_list_element *ignore,
>  		   const char *text, const char *word)
>  {
> -  return complete_line_internal (cdata, word, text,
> -				 strlen (text), handle_help);
> +  complete_line_internal (cdata, word, text,
> +			  strlen (text), handle_help);
>  }
>  
>  /* Complete on signals.  */
>  
> -VEC (char_ptr) *
> +void
>  signal_completer (struct completer_data *cdata,
>  		  struct cmd_list_element *ignore,
>  		  const char *text, const char *word)
>  {
> -  VEC (char_ptr) *return_val = NULL;
>    size_t len = strlen (word);
>    int signum;
>    const char *signame;
> @@ -1089,13 +1061,11 @@ signal_completer (struct completer_data *cdata,
>  
>        if (strncasecmp (signame, word, len) == 0)
>  	{
> -	  if (add_completion (cdata, &return_val, signame, NULL, NULL)
> +	  if (add_completion (cdata, signame, NULL, NULL)
>  	      == ADD_COMPLETION_MAX_REACHED)
>  	    break;
>  	}
>      }
> -
> -  return return_val;
>  }
>  
>  /* Bit-flags for selecting what the register and/or register-group
> @@ -1110,13 +1080,12 @@ enum reg_completer_targets
>  /* Complete register names and/or reggroup names based on the value passed
>     in TARGETS.  At least one bit in TARGETS must be set.  */
>  
> -static VEC (char_ptr) *
> +static void
>  reg_or_group_completer_1 (struct completer_data *cdata,
>  			  struct cmd_list_element *ignore,
>  			  const char *text, const char *word,
>  			  enum reg_completer_targets targets)
>  {
> -  VEC (char_ptr) *result = NULL;
>    size_t len = strlen (word);
>    struct gdbarch *gdbarch;
>    const char *name;
> @@ -1124,6 +1093,8 @@ reg_or_group_completer_1 (struct completer_data *cdata,
>    gdb_assert ((targets & (complete_register_names
>  			  | complete_reggroup_names)) != 0);
>    gdbarch = get_current_arch ();
> +  if (!target_has_registers)
> +    return;

====
This change probably belongs in a separate patchset.
I could be missing something though.

>  
>    if ((targets & complete_register_names) != 0)
>      {
> @@ -1135,9 +1106,9 @@ reg_or_group_completer_1 (struct completer_data *cdata,
>  	{
>  	  if (*name != '\0' && strncmp (word, name, len) == 0)
>  	    {
> -	      if (add_completion (cdata, &result, name, NULL, NULL)
> +	      if (add_completion (cdata, name, NULL, NULL)
>  		  == ADD_COMPLETION_MAX_REACHED)
> -		return result;
> +		return;
>  	    }
>  	}
>      }
> @@ -1153,37 +1124,35 @@ reg_or_group_completer_1 (struct completer_data *cdata,
>  	  name = reggroup_name (group);
>  	  if (strncmp (word, name, len) == 0)
>  	    {
> -	      if (add_completion (cdata, &result, name, NULL, NULL)
> +	      if (add_completion (cdata, name, NULL, NULL)
>  		  == ADD_COMPLETION_MAX_REACHED)
> -		return result;
> +		return;
>  	    }
>  	}
>      }
> -
> -  return result;
>  }
>  
>  /* Perform completion on register and reggroup names.  */
>  
> -VEC (char_ptr) *
> +void
>  reg_or_group_completer (struct completer_data *cdata,
>  			struct cmd_list_element *ignore,
>  			const char *text, const char *word)
>  {
> -  return reg_or_group_completer_1 (cdata, ignore, text, word,
> -				   (complete_register_names
> -				    | complete_reggroup_names));
> +  reg_or_group_completer_1 (cdata, ignore, text, word,
> +			    (complete_register_names
> +			     | complete_reggroup_names));
>  }
>  
>  /* Perform completion on reggroup names.  */
>  
> -VEC (char_ptr) *
> +void
>  reggroup_completer (struct completer_data *cdata,
>  		    struct cmd_list_element *ignore,
>  		    const char *text, const char *word)
>  {
> -  return reg_or_group_completer_1 (cdata, ignore, text, word,
> -				   complete_reggroup_names);
> +  reg_or_group_completer_1 (cdata, ignore, text, word,
> +			    complete_reggroup_names);
>  }
>  
>  /* Get the list of chars that are considered as word breaks
> diff --git a/gdb/completer.h b/gdb/completer.h
> index 07c7d93..cfdca71 100644
> --- a/gdb/completer.h
> +++ b/gdb/completer.h
> @@ -76,37 +76,37 @@ extern VEC (char_ptr) *complete_line (const char *text,
>  extern char *readline_line_completion_function (const char *text,
>  						int matches);
>  
> -extern VEC (char_ptr) *noop_completer (struct completer_data *,
> -				       struct cmd_list_element *,
> -				       const char *, const char *);
> +extern void noop_completer (struct completer_data *,
> +			    struct cmd_list_element *,
> +			    const char *, const char *);
>  
> -extern VEC (char_ptr) *filename_completer (struct completer_data *,
> -					   struct cmd_list_element *,
> -					   const char *, const char *);
> +extern void filename_completer (struct completer_data *,
> +				struct cmd_list_element *,
> +				const char *, const char *);
>  
> -extern VEC (char_ptr) *expression_completer (struct completer_data *,
> -					     struct cmd_list_element *,
> -					     const char *, const char *);
> +extern void expression_completer (struct completer_data *,
> +				  struct cmd_list_element *,
> +				  const char *, const char *);
>  
> -extern VEC (char_ptr) *location_completer (struct completer_data *,
> -					   struct cmd_list_element *,
> -					   const char *, const char *);
> +extern void location_completer (struct completer_data *,
> +				struct cmd_list_element *,
> +				const char *, const char *);
>  
> -extern VEC (char_ptr) *command_completer (struct completer_data *,
> -					  struct cmd_list_element *,
> -					  const char *, const char *);
> +extern void command_completer (struct completer_data *,
> +			       struct cmd_list_element *,
> +			       const char *, const char *);
>  
> -extern VEC (char_ptr) *signal_completer (struct completer_data *,
> -					 struct cmd_list_element *,
> -					 const char *, const char *);
> +extern void signal_completer (struct completer_data *,
> +			      struct cmd_list_element *,
> +			      const char *, const char *);
>  
> -extern VEC (char_ptr) *reg_or_group_completer (struct completer_data *,
> -					       struct cmd_list_element *,
> -					       const char *, const char *);
> +extern void reg_or_group_completer (struct completer_data *,
> +				    struct cmd_list_element *,
> +				    const char *, const char *);
>  
> -extern VEC (char_ptr) *reggroup_completer (struct completer_data *cdata,
> -					   struct cmd_list_element *,
> -					   const char *, const char *);
> +extern void reggroup_completer (struct completer_data *cdata,
> +				struct cmd_list_element *,
> +				const char *, const char *);
>  
>  extern char *get_gdb_completer_quote_characters (void);
>  
> @@ -163,8 +163,7 @@ enum add_completion_status
>     saved into the completion list.  See completer_strdup for more.  */
>  
>  extern enum add_completion_status
> -  add_completion (struct completer_data *cdata,
> -		  VEC (char_ptr) **result, const char *match,
> +  add_completion (struct completer_data *cdata, const char *match,
>  		  const char *text, const char *word);
>  
>  /* Wrapper to throw MAX_COMPLETIONS_REACHED_ERROR.  */ 
> diff --git a/gdb/corefile.c b/gdb/corefile.c
> index 41b7cb0..4e5e96a 100644
> --- a/gdb/corefile.c
> +++ b/gdb/corefile.c
> @@ -467,7 +467,7 @@ set_gnutarget_command (char *ignore, int from_tty,
>  
>  /* A completion function for "set gnutarget".  */
>  
> -static VEC (char_ptr) *
> +static void
>  complete_set_gnutarget (struct completer_data *cdata,
>  			struct cmd_list_element *cmd,
>  			const char *text, const char *word)
> @@ -487,7 +487,7 @@ complete_set_gnutarget (struct completer_data *cdata,
>        bfd_targets[last + 1] = NULL;
>      }
>  
> -  return complete_on_enum (cdata, bfd_targets, text, word);
> +  complete_on_enum (cdata, bfd_targets, text, word);
>  }
>  
>  /* Set the gnutarget.  */
> diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c
> index 504bb20..cddc382 100644
> --- a/gdb/cp-abi.c
> +++ b/gdb/cp-abi.c
> @@ -358,7 +358,7 @@ set_cp_abi_cmd (char *args, int from_tty)
>  
>  /* A completion function for "set cp-abi".  */
>  
> -static VEC (char_ptr) *
> +static void
>  cp_abi_completer (struct completer_data *cdata,
>  		  struct cmd_list_element *ignore,
>  		  const char *text, const char *word)
> @@ -375,7 +375,7 @@ cp_abi_completer (struct completer_data *cdata,
>        cp_abi_names[i] = NULL;
>      }
>  
> -  return complete_on_enum (cdata, cp_abi_names, text, word);
> +  complete_on_enum (cdata, cp_abi_names, text, word);
>  }
>  
>  /* Show the currently selected C++ ABI.  */
> diff --git a/gdb/f-lang.c b/gdb/f-lang.c
> index 15c51d9..b5886a6 100644
> --- a/gdb/f-lang.c
> +++ b/gdb/f-lang.c
> @@ -228,13 +228,13 @@ f_word_break_characters (void)
>  /* Consider the modules separator :: as a valid symbol name character
>     class.  */
>  
> -static VEC (char_ptr) *
> +static void
>  f_make_symbol_completion_list (struct completer_data *cdata,
>  			       const char *text, const char *word,
>  			       enum type_code code)
>  {
> -  return default_make_symbol_completion_list_break_on (cdata, text, word,
> -						       ":", code);
> +  default_make_symbol_completion_list_break_on (cdata, text, word,
> +						":", code);
>  }
>  
>  const struct language_defn f_language_defn =
> diff --git a/gdb/guile/scm-cmd.c b/gdb/guile/scm-cmd.c
> index 1544c2b..8816346 100644
> --- a/gdb/guile/scm-cmd.c
> +++ b/gdb/guile/scm-cmd.c
> @@ -348,8 +348,7 @@ cmdscm_bad_completion_result (const char *msg, SCM completion)
>     The result is a boolean indicating success.  */
>  
>  static int
> -cmdscm_add_completion (SCM completion, struct completer_data *cdata,
> -		       VEC (char_ptr) **result)
> +cmdscm_add_completion (SCM completion, struct completer_data *cdata)
>  {
>    char *item;
>    SCM except_scm;
> @@ -371,14 +370,14 @@ cmdscm_add_completion (SCM completion, struct completer_data *cdata,
>        return 0;
>      }
>  
> -  (void) add_completion (cdata, result, item, NULL, NULL);
> +  (void) add_completion (cdata, item, NULL, NULL);
>    xfree (item);
>    return 1;
>  }
>  
>  /* Called by gdb for command completion.  */
>  
> -static VEC (char_ptr) *
> +static void
>  cmdscm_completer (struct completer_data *cdata,
>  		  struct cmd_list_element *command,
>  		  const char *text, const char *word)
> @@ -386,7 +385,6 @@ cmdscm_completer (struct completer_data *cdata,
>    command_smob *c_smob/*obj*/ = (command_smob *) get_cmd_context (command);
>    SCM completer_result_scm;
>    SCM text_scm, word_scm, result_scm;
> -  VEC (char_ptr) *result = NULL;
>  
>    gdb_assert (c_smob != NULL);
>    gdb_assert (gdbscm_is_procedure (c_smob->complete));
> @@ -408,7 +406,7 @@ cmdscm_completer (struct completer_data *cdata,
>      {
>        /* Inform the user, but otherwise ignore.  */
>        gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
> -      goto done;
> +      return;
>      }
>  
>    if (gdbscm_is_true (scm_list_p (completer_result_scm)))
> @@ -419,11 +417,8 @@ cmdscm_completer (struct completer_data *cdata,
>  	{
>  	  SCM next = scm_car (list);
>  
> -	  if (!cmdscm_add_completion (next, cdata, &result))
> -	    {
> -	      VEC_free (char_ptr, result);
> -	      goto done;
> -	    }
> +	  if (!cmdscm_add_completion (next, cdata))
> +	    return;
>  
>  	  list = scm_cdr (list);
>  	}
> @@ -439,15 +434,11 @@ cmdscm_completer (struct completer_data *cdata,
>  	    {
>  	      /* Inform the user, but otherwise ignore the entire result.  */
>  	      gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
> -	      VEC_free (char_ptr, result);
> -	      goto done;
> +	      return;
>  	    }
>  
> -	  if (!cmdscm_add_completion (next, cdata, &result))
> -	    {
> -	      VEC_free (char_ptr, result);
> -	      goto done;
> -	    }
> +	  if (!cmdscm_add_completion (next, cdata))
> +	    return;
>  
>  	  next = itscm_safe_call_next_x (iter, NULL);
>  	}
> @@ -458,9 +449,6 @@ cmdscm_completer (struct completer_data *cdata,
>        cmdscm_bad_completion_result (_("Bad completer result: "),
>  				    completer_result_scm);
>      }
> -
> - done:
> -  return result;
>  }
>  
>  /* Helper for gdbscm_make_command which locates the command list to use and
> diff --git a/gdb/infrun.c b/gdb/infrun.c
> index d858b28..343f9da 100644
> --- a/gdb/infrun.c
> +++ b/gdb/infrun.c
> @@ -7065,12 +7065,11 @@ Are you sure you want to change it? "),
>  
>  /* Complete the "handle" command.  */
>  
> -static VEC (char_ptr) *
> +static void
>  handle_completer (struct completer_data *cdata,
>  		  struct cmd_list_element *ignore,
>  		  const char *text, const char *word)
>  {
> -  VEC (char_ptr) *vec_signals, *vec_keywords, *return_val;
>    static const char * const keywords[] =
>      {
>        "all",
> @@ -7085,13 +7084,8 @@ handle_completer (struct completer_data *cdata,
>        NULL,
>      };
>  
> -  vec_signals = signal_completer (cdata, ignore, text, word);
> -  vec_keywords = complete_on_enum (cdata, keywords, word, word);
> -
> -  return_val = VEC_merge (char_ptr, vec_signals, vec_keywords);
> -  VEC_free (char_ptr, vec_signals);
> -  VEC_free (char_ptr, vec_keywords);
> -  return return_val;
> +  signal_completer (cdata, ignore, text, word);
> +  complete_on_enum (cdata, keywords, word, word);
>  }
>  
>  enum gdb_signal
> diff --git a/gdb/interps.c b/gdb/interps.c
> index 9e993c8..19cb716 100644
> --- a/gdb/interps.c
> +++ b/gdb/interps.c
> @@ -434,13 +434,12 @@ interpreter_exec_cmd (char *args, int from_tty)
>  }
>  
>  /* List the possible interpreters which could complete the given text.  */
> -static VEC (char_ptr) *
> +static void
>  interpreter_completer (struct completer_data *cdata,
>  		       struct cmd_list_element *ignore,
>  		       const char *text, const char *word)
>  {
>    int textlen;
> -  VEC (char_ptr) *matches = NULL;
>    struct interp *interp;
>  
>    textlen = strlen (text);
> @@ -448,13 +447,11 @@ interpreter_completer (struct completer_data *cdata,
>      {
>        if (strncmp (interp->name, text, textlen) == 0)
>  	{
> -	  if (add_completion (cdata, &matches, interp->name, text, word)
> +	  if (add_completion (cdata, interp->name, text, word)
>  	      == ADD_COMPLETION_MAX_REACHED)
>  	    break;
>  	}
>      }
> -
> -  return matches;
>  }
>  
>  struct interp *
> diff --git a/gdb/language.h b/gdb/language.h
> index 954b4a8..24fb1e8 100644
> --- a/gdb/language.h
> +++ b/gdb/language.h
> @@ -302,7 +302,7 @@ struct language_defn
>         completion is being made.  If CODE is TYPE_CODE_UNDEF, then all
>         symbols should be examined; otherwise, only STRUCT_DOMAIN
>         symbols whose type has a code of CODE should be matched.  */
> -    VEC (char_ptr) *
> +    void
>        (*la_make_symbol_completion_list) (struct completer_data *,
>  					 const char *text,
>  					 const char *word,
> diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c
> index cf76bd1..7a57349 100644
> --- a/gdb/python/py-cmd.c
> +++ b/gdb/python/py-cmd.c
> @@ -330,13 +330,12 @@ cmdpy_completer_handle_brkchars (struct cmd_list_element *command,
>  
>  /* Called by gdb for command completion.  */
>  
> -static VEC (char_ptr) *
> +static void
>  cmdpy_completer (struct completer_data *cdata,
>  		 struct cmd_list_element *command,
>  		 const char *text, const char *word)
>  {
>    PyObject *resultobj = NULL;
> -  VEC (char_ptr) *result = NULL;
>    struct cleanup *cleanup;
>  
>    cleanup = ensure_python_env (get_current_arch (), current_language);
> @@ -351,7 +350,6 @@ cmdpy_completer (struct completer_data *cdata,
>    if (resultobj == NULL)
>      goto done;
>  
> -  result = NULL;
>    if (PyInt_Check (resultobj))
>      {
>        /* User code may also return one of the completion constants,
> @@ -364,7 +362,7 @@ cmdpy_completer (struct completer_data *cdata,
>  	  PyErr_Clear ();
>  	}
>        else if (value >= 0 && value < (long) N_COMPLETERS)
> -	result = completers[value].completer (cdata, command, text, word);
> +	completers[value].completer (cdata, command, text, word);
>      }
>    else
>      {
> @@ -393,7 +391,7 @@ cmdpy_completer (struct completer_data *cdata,
>  	      continue;
>  	    }
>  
> -	  if (add_completion (cdata, &result, item, NULL, NULL)
> +	  if (add_completion (cdata, item, NULL, NULL)
>  	      == ADD_COMPLETION_MAX_REACHED)
>  	    {
>  	      xfree (item);
> @@ -414,8 +412,6 @@ cmdpy_completer (struct completer_data *cdata,
>  
>    Py_XDECREF (resultobj);
>    do_cleanups (cleanup);
> -
> -  return result;
>  }
>  
>  /* Helper for cmdpy_init which locates the command list to use and
> diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
> index c29d3c5..862683b 100644
> --- a/gdb/remote-sim.c
> +++ b/gdb/remote-sim.c
> @@ -1223,7 +1223,7 @@ simulator_command (char *args, int from_tty)
>    registers_changed ();
>  }
>  
> -static VEC (char_ptr) *
> +static void
>  sim_command_completer (struct completer_data *cdata,
>  		       struct cmd_list_element *ignore, const char *text,
>  		       const char *word)
> @@ -1235,22 +1235,20 @@ sim_command_completer (struct completer_data *cdata,
>  
>    sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
>    if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
> -    return NULL;
> +    return;
>  
>    tmp = sim_complete_command (sim_data->gdbsim_desc, text, word);
>    if (tmp == NULL)
> -    return NULL;
> +    return;
>  
>    /* Transform the array into a VEC, and then free the array.  */
>    for (i = 0; tmp[i] != NULL; i++)
>      {
> -      if (add_completion (cdata, &result, tmp[i], NULL, NULL)
> +      if (add_completion (cdata, tmp[i], NULL, NULL)
>  	  == ADD_COMPLETION_MAX_REACHED)
>  	break;
>      }
>    xfree (tmp);
> -
> -  return result;
>  }
>  
>  /* Check to see if a thread is still alive.  */
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index e24de89..18b7619 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -5011,31 +5011,8 @@ compare_symbol_name (const char *name, const char *sym_text, int sym_text_len)
>    return 1;
>  }
>  
> -/* Free any memory associated with a completion list.  */
> -
> -static void
> -free_completion_list (VEC (char_ptr) **list_ptr)
> -{
> -  int i;
> -  char *p;
> -
> -  for (i = 0; VEC_iterate (char_ptr, *list_ptr, i, p); ++i)
> -    xfree (p);
> -  VEC_free (char_ptr, *list_ptr);
> -}
> -
> -/* Callback for make_cleanup.  */
> -
> -static void
> -do_free_completion_list (void *list)
> -{
> -  free_completion_list (list);
> -}
> -
>  /* Helper routine for make_symbol_completion_list.  */
>  
> -static VEC (char_ptr) *return_val;
> -
>  #define COMPLETION_LIST_ADD_SYMBOL(cdata, symbol, sym_text, len,	\
>  				   text, word)				\
>    completion_list_add_name						\
> @@ -5063,7 +5040,7 @@ completion_list_add_name (struct completer_data *cdata,
>    /* We have a match for a completion, so add SYMNAME to the current list
>       of matches.  */
>  
> -    if (add_completion (cdata, &return_val, symname, sym_text, word)
> +    if (add_completion (cdata, symname, sym_text, word) 
>  	== ADD_COMPLETION_MAX_REACHED)
>        throw_max_completions_reached_error ();
>  }
> @@ -5499,18 +5476,13 @@ default_make_symbol_completion_list_break_on_1 (struct completer_data *cdata,
>      }
>  }
>  
> -VEC (char_ptr) *
> +void
>  default_make_symbol_completion_list_break_on (struct completer_data *cdata,
>  					      const char *text,
>  					      const char *word,
>  					      const char *break_on,
>  					      enum type_code code)
>  {
> -  struct cleanup *back_to;
> -
> -  return_val = NULL;
> -  back_to = make_cleanup (do_free_completion_list, &return_val);
> -
>    TRY
>      {
>        default_make_symbol_completion_list_break_on_1 (cdata, text, word,
> @@ -5522,61 +5494,56 @@ default_make_symbol_completion_list_break_on (struct completer_data *cdata,
>  	throw_exception (except);
>      }
>    END_CATCH
> -
> -  discard_cleanups (back_to);
> -  return return_val;
>  }
>  
> -VEC (char_ptr) *
> +void
>  default_make_symbol_completion_list (struct completer_data *cdata,
>  				     const char *text, const char *word,
>  				     enum type_code code)
>  {
> -  return default_make_symbol_completion_list_break_on (cdata, text, word, "",
> -						       code);
> +  default_make_symbol_completion_list_break_on (cdata, text, word, "", code);
>  }
>  
>  /* Return a vector of all symbols (regardless of class) which begin by
>     matching TEXT.  If the answer is no symbols, then the return value
>     is NULL.  */
>  
> -VEC (char_ptr) *
> +void
>  make_symbol_completion_list (struct completer_data *cdata,
>  			     const char *text, const char *word)
>  {
> -  return current_language->la_make_symbol_completion_list (cdata, text, word,
> -							   TYPE_CODE_UNDEF);
> +  current_language->la_make_symbol_completion_list (cdata, text, word,
> +						    TYPE_CODE_UNDEF);
>  }
>  
>  /* Like make_symbol_completion_list, but only return STRUCT_DOMAIN
>     symbols whose type code is CODE.  */
>  
> -VEC (char_ptr) *
> +void
>  make_symbol_completion_type (struct completer_data *cdata, const char *text,
>  			     const char *word, enum type_code code)
>  {
>    gdb_assert (code == TYPE_CODE_UNION
>  	      || code == TYPE_CODE_STRUCT
>  	      || code == TYPE_CODE_ENUM);
> -  return current_language->la_make_symbol_completion_list (cdata, text, word,
> -							   code);
> +  current_language->la_make_symbol_completion_list (cdata, text, word, code);
>  }
>  
>  /* Like make_symbol_completion_list, but suitable for use as a
>     completion function.  */
>  
> -VEC (char_ptr) *
> +void
>  make_symbol_completion_list_fn (struct completer_data *cdata,
>  				struct cmd_list_element *ignore,
>  				const char *text, const char *word)
>  {
> -  return make_symbol_completion_list (cdata, text, word);
> +  make_symbol_completion_list (cdata, text, word);
>  }
>  
>  /* Like make_symbol_completion_list, but returns a list of symbols
>     defined in a source file FILE.  */
>  
> -VEC (char_ptr) *
> +void
>  make_file_symbol_completion_list (struct completer_data *cdata,
>  				  const char *text, const char *word,
>  				  const char *srcfile)
> @@ -5624,7 +5591,7 @@ make_file_symbol_completion_list (struct completer_data *cdata,
>        /* A double-quoted string is never a symbol, nor does it make sense
>           to complete it any other way.  */
>        {
> -	return NULL;
> +	return;
>        }
>      else
>        {
> @@ -5635,8 +5602,6 @@ make_file_symbol_completion_list (struct completer_data *cdata,
>  
>    sym_text_len = strlen (sym_text);
>  
> -  return_val = NULL;
> -
>    /* Find the symtab for SRCFILE (this loads it if it was not yet read
>       in).  */
>    s = lookup_symtab (srcfile);
> @@ -5652,7 +5617,7 @@ make_file_symbol_completion_list (struct completer_data *cdata,
>  
>    /* If we have no symtab for that file, return an empty list.  */
>    if (s == NULL)
> -    return (return_val);
> +    return;
>  
>    /* Go through this symtab and check the externs and statics for
>       symbols which match.  */
> @@ -5670,8 +5635,6 @@ make_file_symbol_completion_list (struct completer_data *cdata,
>        COMPLETION_LIST_ADD_SYMBOL (cdata, sym, sym_text, sym_text_len,
>  				  text, word);
>      }
> -
> -  return (return_val);
>  }
>  
>  /* A helper function for make_source_files_completion_list.  It adds
> @@ -5680,10 +5643,9 @@ make_file_symbol_completion_list (struct completer_data *cdata,
>  
>  static void
>  add_filename_to_list (struct completer_data *cdata, const char *fname,
> -		      const char *text, const char *word,
> -		      VEC (char_ptr) **list)
> +		      const char *text, const char *word)
>  {
> -  (void) add_completion (cdata, list, fname, text, word);
> +  (void) add_completion (cdata, fname, text, word);
>  }
>  
>  static int
> @@ -5711,7 +5673,6 @@ struct add_partial_filename_data
>    const char *text;
>    const char *word;
>    int text_len;
> -  VEC (char_ptr) **list;
>  
>    /* Completion data used by the completer function.  */
>    struct completer_data *completer_data;
> @@ -5733,7 +5694,7 @@ maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
>        /* This file matches for a completion; add it to the
>  	 current list of matches.  */
>        add_filename_to_list (data->completer_data, filename, data->text,
> -			    data->word, data->list);
> +			    data->word);
>      }
>    else
>      {
> @@ -5744,17 +5705,15 @@ maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
>  	  && filename_ncmp (base_name, data->text, data->text_len) == 0)
>  	{
>  	  add_filename_to_list (data->completer_data, base_name, data->text,
> -				data->word, data->list);
> +				data->word);
>  	}
>      }
>  }
>  
> -/* Return a vector of all source files whose names begin with matching
> -   TEXT.  The file names are looked up in the symbol tables of this
> -   program.  If the answer is no matchess, then the return value is
> -   NULL.  */
> +/* Add all source files whose names begin with matching TEXT to CDATA.
> +   The file names are looked up in the symbol tables of this program.  */
>  
> -VEC (char_ptr) *
> +void
>  make_source_files_completion_list (struct completer_data *cdata,
>  				   const char *text, const char *word)
>  {
> @@ -5762,16 +5721,13 @@ make_source_files_completion_list (struct completer_data *cdata,
>    struct symtab *s;
>    struct objfile *objfile;
>    size_t text_len = strlen (text);
> -  VEC (char_ptr) *list = NULL;
>    const char *base_name;
>    struct add_partial_filename_data datum;
>    struct filename_seen_cache *filename_seen_cache;
> -  struct cleanup *back_to, *cache_cleanup;
> +  struct cleanup *cache_cleanup;
>  
>    if (!have_full_symbols () && !have_partial_symbols ())
> -    return list;
> -
> -  back_to = make_cleanup (do_free_completion_list, &list);
> +    return;
>  
>    filename_seen_cache = create_filename_seen_cache ();
>    cache_cleanup = make_cleanup (delete_filename_seen_cache,
> @@ -5786,7 +5742,7 @@ make_source_files_completion_list (struct completer_data *cdata,
>  	{
>  	  /* This file matches for a completion; add it to the current
>  	     list of matches.  */
> -	  add_filename_to_list (cdata, s->filename, text, word, &list);
> +	  add_filename_to_list (cdata, s->filename, text, word);
>  	}
>        else
>  	{
> @@ -5798,7 +5754,7 @@ make_source_files_completion_list (struct completer_data *cdata,
>  	  if (base_name != s->filename
>  	      && !filename_seen (filename_seen_cache, base_name, 1)
>  	      && filename_ncmp (base_name, text, text_len) == 0)
> -	    add_filename_to_list (cdata, base_name, text, word, &list);
> +	    add_filename_to_list (cdata, base_name, text, word);
>  	}
>      }
>  
> @@ -5806,15 +5762,11 @@ make_source_files_completion_list (struct completer_data *cdata,
>    datum.text = text;
>    datum.word = word;
>    datum.text_len = text_len;
> -  datum.list = &list;
>    datum.completer_data = cdata;
>    map_symbol_filenames (maybe_add_partial_symtab_filename, &datum,
>  			0 /*need_fullname*/);
>  
>    do_cleanups (cache_cleanup);
> -  discard_cleanups (back_to);
> -
> -  return list;
>  }
>  
>  /* Track MAIN */
> diff --git a/gdb/symtab.h b/gdb/symtab.h
> index 018852c..755e1d5 100644
> --- a/gdb/symtab.h
> +++ b/gdb/symtab.h
> @@ -1454,30 +1454,31 @@ extern void forget_cached_source_info (void);
>  
>  extern void select_source_symtab (struct symtab *);
>  
> -extern VEC (char_ptr) *default_make_symbol_completion_list_break_on
> +extern void default_make_symbol_completion_list_break_on
>   (struct completer_data *cdata, const char *text, const char *word,
>    const char *break_on, enum type_code code);
> -extern VEC (char_ptr) *
> +
> +extern void
>   default_make_symbol_completion_list (struct completer_data *,
>  				      const char *, const char *,
>  				      enum type_code);
> -extern VEC (char_ptr) *
> +extern void
>    make_symbol_completion_list (struct completer_data *, const char *,
>  			       const char *);
> -extern VEC (char_ptr) *
> +extern void
>    make_symbol_completion_type (struct completer_data *,
>  			       const char *, const char *,
>  			       enum type_code);
> -extern VEC (char_ptr) *
> +extern void
>    make_symbol_completion_list_fn (struct completer_data *,
>  				  struct cmd_list_element *,
>  				  const char *, const char *);
>  
> -extern VEC (char_ptr) *
> +extern void
>    make_file_symbol_completion_list (struct completer_data *,
>  				    const char *, const char *, const char *);
>  
> -extern VEC (char_ptr) *
> +extern void
>   make_source_files_completion_list (struct completer_data *, const char *,
>  				    const char *);
>  
> diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
> index 8d420894..c4c9cda 100644
> --- a/gdb/tui/tui-layout.c
> +++ b/gdb/tui/tui-layout.c
> @@ -353,7 +353,7 @@ tui_default_win_viewport_height (enum tui_win_type type,
>  /* Complete possible layout names.  TEXT is the complete text entered so
>     far, WORD is the word currently being completed.  */
>  
> -static VEC (char_ptr) *
> +static void
>  layout_completer (struct completer_data *cdata,
>  		  struct cmd_list_element *ignore,
>  		  const char *text, const char *word)
> @@ -361,7 +361,7 @@ layout_completer (struct completer_data *cdata,
>    static const char *layout_names [] =
>      { "src", "asm", "split", "regs", "next", "prev", NULL };
>  
> -  return complete_on_enum (cdata, layout_names, text, word);
> +  complete_on_enum (cdata, layout_names, text, word);
>  }
>  
>  /* Function to initialize gdb commands, for tui window layout
> diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
> index 17efd9f..bef01e5 100644
> --- a/gdb/tui/tui-regs.c
> +++ b/gdb/tui/tui-regs.c
> @@ -668,29 +668,26 @@ tui_reg_command (char *args, int from_tty)
>  /* Complete names of register groups, and add the special "prev" and "next"
>     names.  */
>  
> -static VEC (char_ptr) *
> +static void
>  tui_reggroup_completer (struct completer_data *cdata,
>  			struct cmd_list_element *ignore,
>  			const char *text, const char *word)
>  {
> -  VEC (char_ptr) *result = NULL;
>    static const char *extra[] = { "next", "prev", NULL };
>    size_t len = strlen (word);
>    const char **tmp;
>  
> -  result = reggroup_completer (cdata, ignore, text, word);
> +  reggroup_completer (cdata, ignore, text, word);
>  
>    for (tmp = extra; *tmp != NULL; ++tmp)
>      {
>        if (strncmp (word, *tmp, len) == 0)
>  	{
> -	  if (add_completion (cdata, &result, *tmp, NULL, NULL)
> +	  if (add_completion (cdata, *tmp, NULL, NULL)
>  	      == ADD_COMPLETION_MAX_REACHED)
>  	    break;
>  	}
>      }
> -
> -  return result;
>  }
>  
>  /* Provide a prototype to silence -Wmissing-prototypes.  */
> diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
> index 8e7fbd1..4690af1 100644
> --- a/gdb/tui/tui-win.c
> +++ b/gdb/tui/tui-win.c
> @@ -359,13 +359,12 @@ tui_set_var_cmd (char *null_args, int from_tty, struct cmd_list_element *c)
>     window names 'next' and 'prev' will also be considered as possible
>     completions of the window name.  */
>  
> -static VEC (char_ptr) *
> +static void
>  window_name_completer (int include_next_prev_p,
>  		       struct completer_data *cdata,
>  		       const char *text, const char *word)
>  {
>    VEC (const_char_ptr) *completion_name_vec = NULL;
> -  VEC (char_ptr) *matches_vec;
>    int win_type;
>  
>    for (win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++)
> @@ -399,32 +398,29 @@ window_name_completer (int include_next_prev_p,
>      }
>  
>    VEC_safe_push (const_char_ptr, completion_name_vec, NULL);
> -  matches_vec
> -    = complete_on_enum (cdata,
> -			VEC_address (const_char_ptr, completion_name_vec),
> -			text, word);
> +  complete_on_enum (cdata,
> +		    VEC_address (const_char_ptr, completion_name_vec),
> +		    text, word);
>  
>    VEC_free (const_char_ptr, completion_name_vec);
> -
> -  return matches_vec;
>  }
>  
>  /* Complete possible window names to focus on.  TEXT is the complete text
>     entered so far, WORD is the word currently being completed.  */
>  
> -static VEC (char_ptr) *
> +static void
>  focus_completer (struct completer_data *cdata,
>  		 struct cmd_list_element *ignore,
>  		  const char *text, const char *word)
>  {
> -  return window_name_completer (1, cdata, text, word);
> +  window_name_completer (1, cdata, text, word);
>  }
>  
>  /* Complete possible window names for winheight command.  TEXT is the
>     complete text entered so far, WORD is the word currently being
>     completed.  */
>  
> -static VEC (char_ptr) *
> +static void
>  winheight_completer (struct completer_data *cdata,
>  		     struct cmd_list_element *ignore,
>  		     const char *text, const char *word)
> @@ -432,9 +428,9 @@ winheight_completer (struct completer_data *cdata,
>    /* The first word is the window name.  That we can complete.  Subsequent
>       words can't be completed.  */
>    if (word != text)
> -    return NULL;
> +    return;
>  
> -  return window_name_completer (0, cdata, text, word);
> +  window_name_completer (0, cdata, text, word);
>  }
>  
>  /* Function to initialize gdb commands, for tui window
> diff --git a/gdb/value.c b/gdb/value.c
> index 22d392a..b3d4f04 100644
> --- a/gdb/value.c
> +++ b/gdb/value.c
> @@ -2062,10 +2062,9 @@ lookup_only_internalvar (const char *name)
>     Returns a vector of newly allocated strings, or NULL if no matches
>     were found.  */
>  
> -VEC (char_ptr) *
> +void
>  complete_internalvar (struct completer_data *cdata, const char *name)
>  {
> -  VEC (char_ptr) *result = NULL;
>    struct internalvar *var;
>    int len;
>  
> @@ -2074,12 +2073,10 @@ complete_internalvar (struct completer_data *cdata, const char *name)
>    for (var = internalvars; var; var = var->next)
>      if (strncmp (var->name, name, len) == 0)
>        {
> -	if (add_completion (cdata, &result, var->name, NULL, NULL)
> +	if (add_completion (cdata, var->name, NULL, NULL)
>  	    == ADD_COMPLETION_MAX_REACHED)
>  	  break;
>        }
> -
> -  return result;
>  }
>  
>  /* Create an internal variable with name NAME and with a void value.
> diff --git a/gdb/value.h b/gdb/value.h
> index 03df1b7..58c5c26 100644
> --- a/gdb/value.h
> +++ b/gdb/value.h
> @@ -876,8 +876,8 @@ extern struct internalvar *lookup_only_internalvar (const char *name);
>  
>  extern struct internalvar *create_internalvar (const char *name);
>  
> -extern VEC (char_ptr) *complete_internalvar (struct completer_data *cdata,
> -					     const char *name);
> +extern void complete_internalvar (struct completer_data *cdata,
> +				  const char *name);
>  
>  /* An internalvar can be dynamically computed by supplying a vector of
>     function pointers to perform various operations.  */
  

Patch

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 5df08be..5effb48 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -6199,8 +6199,7 @@  symbol_completion_match (const char *sym_name,
    encoded).  */
 
 static enum add_completion_status
-symbol_completion_add (VEC(char_ptr) **sv,
-		       struct completer_data *cdata,
+symbol_completion_add (struct completer_data *cdata,
                        const char *sym_name,
                        const char *text, int text_len,
                        const char *orig_text, const char *word,
@@ -6213,14 +6212,13 @@  symbol_completion_add (VEC(char_ptr) **sv,
 
   /* We found a match, so add the appropriate completion to the given
      string vector.  */
-  return add_completion (cdata, sv, match, orig_text, word);
+  return add_completion (cdata, match, orig_text, word);
 }
 
 /* An object of this type is passed as the user_data argument to the
    expand_symtabs_matching method.  */
 struct add_partial_datum
 {
-  VEC(char_ptr) **completions;
   const char *text;
   int text_len;
   const char *text0;
@@ -6243,7 +6241,7 @@  ada_complete_symbol_matcher (const char *name, void *user_data)
 /* Return a list of possible symbol names completing TEXT0.  WORD is
    the entire command on which completion is made.  */
 
-static VEC (char_ptr) *
+static void
 ada_make_symbol_completion_list (struct completer_data *cdata,
 				 const char *text0, const char *word,
 				 enum type_code code)
@@ -6252,7 +6250,6 @@  ada_make_symbol_completion_list (struct completer_data *cdata,
   int text_len;
   int wild_match_p;
   int encoded_p;
-  VEC(char_ptr) *completions = VEC_alloc (char_ptr, 128);
   struct symbol *sym;
   struct compunit_symtab *s;
   struct minimal_symbol *msymbol;
@@ -6293,7 +6290,6 @@  ada_make_symbol_completion_list (struct completer_data *cdata,
   {
     struct add_partial_datum data;
 
-    data.completions = &completions;
     data.text = text;
     data.text_len = text_len;
     data.text0 = text0;
@@ -6312,14 +6308,13 @@  ada_make_symbol_completion_list (struct completer_data *cdata,
   ALL_MSYMBOLS (objfile, msymbol)
   {
     QUIT;
-    status = symbol_completion_add (&completions, cdata,
-					 MSYMBOL_LINKAGE_NAME (msymbol),
-					 text, text_len, text0, word,
-					 wild_match_p, encoded_p);
+    status = symbol_completion_add (cdata, MSYMBOL_LINKAGE_NAME (msymbol),
+				    text, text_len, text0, word,
+				    wild_match_p, encoded_p);
     if (status == ADD_COMPLETION_MAX_REACHED)
       {
 	do_cleanups (old_chain);
-	return completions;
+	return;
       }
   }
 
@@ -6333,14 +6328,13 @@  ada_make_symbol_completion_list (struct completer_data *cdata,
 
       ALL_BLOCK_SYMBOLS (b, iter, sym)
       {
-        status = symbol_completion_add (&completions, cdata,
-					     SYMBOL_LINKAGE_NAME (sym),
-					     text, text_len, text0, word,
-					     wild_match_p, encoded_p);
+        status = symbol_completion_add (cdata, SYMBOL_LINKAGE_NAME (sym),
+					text, text_len, text0, word,
+					wild_match_p, encoded_p);
 	if (status == ADD_COMPLETION_MAX_REACHED)
 	  {
 	    do_cleanups (old_chain);
-	    return completions;
+	    return;
 	  }
       }
     }
@@ -6354,14 +6348,13 @@  ada_make_symbol_completion_list (struct completer_data *cdata,
     b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), GLOBAL_BLOCK);
     ALL_BLOCK_SYMBOLS (b, iter, sym)
     {
-      status = symbol_completion_add (&completions, cdata,
-					   SYMBOL_LINKAGE_NAME (sym),
-					   text, text_len, text0, word,
-					   wild_match_p, encoded_p);
+      status = symbol_completion_add (cdata,SYMBOL_LINKAGE_NAME (sym),
+				      text, text_len, text0, word,
+				      wild_match_p, encoded_p);
       if (status == ADD_COMPLETION_MAX_REACHED)
 	{
 	  do_cleanups (old_chain);
-	  return completions;
+	  return;
 	}
     }
   }
@@ -6375,20 +6368,18 @@  ada_make_symbol_completion_list (struct completer_data *cdata,
       continue;
     ALL_BLOCK_SYMBOLS (b, iter, sym)
     {
-      status = symbol_completion_add (&completions, cdata,
-					   SYMBOL_LINKAGE_NAME (sym),
-					   text, text_len, text0, word,
-					   wild_match_p, encoded_p);
+      status = symbol_completion_add (cdata, SYMBOL_LINKAGE_NAME (sym),
+				      text, text_len, text0, word,
+				      wild_match_p, encoded_p);
       if (status == ADD_COMPLETION_MAX_REACHED)
 	{
 	  do_cleanups (old_chain);
-	  return completions;
+	  return;
 	}
     }
   }
 
   do_cleanups (old_chain);
-  return completions;
 }
 
                                 /* Field Access */
diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
index 4677132..a542826 100644
--- a/gdb/break-catch-syscall.c
+++ b/gdb/break-catch-syscall.c
@@ -591,17 +591,17 @@  catching_syscall_number (int syscall_number)
 }
 
 /* Complete syscall names.  Used by "catch syscall".  */
-static VEC (char_ptr) *
+static void
 catch_syscall_completer (struct completer_data *cdata,
 			 struct cmd_list_element *cmd,
                          const char *text, const char *word)
 {
   const char **list = get_syscall_names (get_current_arch ());
-  VEC (char_ptr) *retlist
-    = (list == NULL) ? NULL : complete_on_enum (cdata, list, word, word);
+
+  if (list != NULL)
+    complete_on_enum (cdata, list, word, word);
 
   xfree (list);
-  return retlist;
 }
 
 static void
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 24243c4..08901ae 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1032,7 +1032,7 @@  set_breakpoint_condition (struct breakpoint *b, const char *exp,
 
 /* Completion for the "condition" command.  */
 
-static VEC (char_ptr) *
+static void
 condition_completer (struct completer_data *cdata,
 		     struct cmd_list_element *cmd,
 		     const char *text, const char *word)
@@ -1045,14 +1045,13 @@  condition_completer (struct completer_data *cdata,
     {
       int len;
       struct breakpoint *b;
-      VEC (char_ptr) *result = NULL;
 
       if (text[0] == '$')
 	{
 	  /* We don't support completion of history indices.  */
-	  if (isdigit (text[1]))
-	    return NULL;
-	  return complete_internalvar (cdata, &text[1]);
+	  if (!isdigit (text[1]))
+	    complete_internalvar (cdata, &text[1]);
+	  return;
 	}
 
       /* We're completing the breakpoint number.  */
@@ -1066,18 +1065,18 @@  condition_completer (struct completer_data *cdata,
 
 	  if (strncmp (number, text, len) == 0)
 	    {
-	      if (add_completion (cdata, &result, number, NULL, NULL)
+	      if (add_completion (cdata, number, NULL, NULL)
 		  == ADD_COMPLETION_MAX_REACHED)
 		break;
 	    }
 	}
 
-      return result;
+      return;
     }
 
   /* We're completing the expression part.  */
   text = skip_spaces_const (space);
-  return expression_completer (cdata, cmd, text, word);
+  expression_completer (cdata, cmd, text, word);
 }
 
 /* condition N EXP -- set break condition of breakpoint N to EXP.  */
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
index 9691fd1..9e7bf80 100644
--- a/gdb/cli/cli-decode.c
+++ b/gdb/cli/cli-decode.c
@@ -647,7 +647,7 @@  add_setshow_optional_filename_cmd (const char *name, enum command_class theclass
 /* Completes on literal "unlimited".  Used by integer commands that
    support a special "unlimited" value.  */
 
-static VEC (char_ptr) *
+static void
 integer_unlimited_completer (struct completer_data *cdata,
 			     struct cmd_list_element *ignore,
 			     const char *text, const char *word)
@@ -658,7 +658,7 @@  integer_unlimited_completer (struct completer_data *cdata,
       NULL,
     };
 
-  return complete_on_enum (cdata, keywords, text, word);
+  complete_on_enum (cdata, keywords, text, word);
 }
 
 /* Add element named NAME to both the set and show command LISTs (the
@@ -1757,22 +1757,21 @@  lookup_cmd_composition (const char *text,
 
 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
 
-/* Return a vector of char pointers which point to the different
-   possible completions in LIST of TEXT.
+/* Add completions to CDATA for the different possible completions
+   in LIST of TEXT.
 
    WORD points in the same buffer as TEXT, and completions should be
    returned relative to this position.  For example, suppose TEXT is
    "foo" and we want to complete to "foobar".  If WORD is "oo", return
    "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
 
-VEC (char_ptr) *
+void
 complete_on_cmdlist (struct completer_data *cdata,
 		     struct cmd_list_element *list,
 		     const char *text, const char *word,
 		     int ignore_help_classes)
 {
   struct cmd_list_element *ptr;
-  VEC (char_ptr) *matchlist = NULL;
   int textlen = strlen (text);
   int pass;
   int saw_deprecated_match = 0;
@@ -1798,35 +1797,32 @@  complete_on_cmdlist (struct completer_data *cdata,
 		  }
 	      }
 
-	    if (add_completion (cdata, &matchlist, ptr->name, text, word)
+	    if (add_completion (cdata, ptr->name, text, word)
 		== ADD_COMPLETION_MAX_REACHED)
-	      return matchlist;
+	      return;
 	  }
       /* If we saw no matching deprecated commands in the first pass,
 	 just bail out.  */
       if (!saw_deprecated_match)
 	break;
     }
-
-  return matchlist;
 }
 
 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
 
-/* Return a vector of char pointers which point to the different
-   possible completions in CMD of TEXT.
+/* Add completions to CDATA for the different possible completions in
+   CMD of TEXT.
 
    WORD points in the same buffer as TEXT, and completions should be
    returned relative to this position.  For example, suppose TEXT is "foo"
    and we want to complete to "foobar".  If WORD is "oo", return
    "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
 
-VEC (char_ptr) *
+void
 complete_on_enum (struct completer_data *cdata,
 		  const char *const *enumlist,
 		  const char *text, const char *word)
 {
-  VEC (char_ptr) *matchlist = NULL;
   int textlen = strlen (text);
   int i;
   const char *name;
@@ -1834,12 +1830,10 @@  complete_on_enum (struct completer_data *cdata,
   for (i = 0; (name = enumlist[i]) != NULL; i++)
     if (strncmp (name, text, textlen) == 0)
       {
-	if (add_completion (cdata, &matchlist, name, text, word)
+	if (add_completion (cdata, name, text, word)
 	    == ADD_COMPLETION_MAX_REACHED)
 	  break;
       }
-
-  return matchlist;
 }
 
 
diff --git a/gdb/command.h b/gdb/command.h
index b2aeb30..82872c0 100644
--- a/gdb/command.h
+++ b/gdb/command.h
@@ -158,9 +158,9 @@  typedef void cmd_sfunc_ftype (char *args, int from_tty,
 extern void set_cmd_sfunc (struct cmd_list_element *cmd,
 			   cmd_sfunc_ftype *sfunc);
 
-typedef VEC (char_ptr) *completer_ftype (struct completer_data *,
-					 struct cmd_list_element *,
-					 const char *, const char *);
+typedef void completer_ftype (struct completer_data *,
+			      struct cmd_list_element *,
+			      const char *, const char *);
 
 typedef void completer_ftype_void (struct cmd_list_element *,
 				   const char *, const char *);
@@ -228,13 +228,13 @@  extern struct cmd_list_element *add_info (const char *,
 extern struct cmd_list_element *add_info_alias (const char *, const char *,
 						int);
 
-extern VEC (char_ptr) *complete_on_cmdlist (struct completer_data *,
-					    struct cmd_list_element *,
-					    const char *, const char *, int);
+extern void complete_on_cmdlist (struct completer_data *,
+				 struct cmd_list_element *,
+				 const char *, const char *, int);
 
-extern VEC (char_ptr) *complete_on_enum (struct completer_data *,
-					 const char *const *enumlist,
-					 const char *, const char *);
+extern void complete_on_enum (struct completer_data *,
+			      const char *const *enumlist,
+			      const char *, const char *);
 
 /* Functions that implement commands about CLI commands.  */
 
diff --git a/gdb/completer.c b/gdb/completer.c
index 6faed31..2ca7d2d 100644
--- a/gdb/completer.c
+++ b/gdb/completer.c
@@ -144,22 +144,23 @@  readline_line_completion_function (const char *text, int matches)
 
 /* This can be used for functions which don't want to complete on
    symbols but don't want to complete on anything else either.  */
-VEC (char_ptr) *
+
+void
 noop_completer (struct completer_data *cdata,
 		struct cmd_list_element *ignore,
 		const char *text, const char *prefix)
 {
-  return NULL;
+  /* Nothing.  */
 }
 
 /* Complete on filenames.  */
-VEC (char_ptr) *
+
+void
 filename_completer (struct completer_data *cdata,
 		    struct cmd_list_element *ignore,
 		    const char *text, const char *word)
 {
   int subsequent_name;
-  VEC (char_ptr) *return_val = NULL;
 
   subsequent_name = 0;
   while (1)
@@ -182,7 +183,7 @@  filename_completer (struct completer_data *cdata,
 	  continue;
 	}
 
-      if (add_completion (cdata, &return_val, p, text, word)
+      if (add_completion (cdata, p, text, word)
 	  == ADD_COMPLETION_MAX_REACHED)
 	break;
     }
@@ -194,7 +195,6 @@  filename_completer (struct completer_data *cdata,
      with respect to inserting quotes.  */
   rl_completer_word_break_characters = "";
 #endif
-  return return_val;
 }
 
 /* A hashtable traversal function to remove leading file name
@@ -220,14 +220,12 @@  remove_leading_fn_component (void **slot, void *calldata)
    This is intended to be used in commands that set breakpoints
    etc.  */
 
-VEC (char_ptr) *
+void
 location_completer (struct completer_data *cdata,
 		    struct cmd_list_element *ignore,
 		    const char *text, const char *word)
 {
   int n_syms, n_files, ix;
-  VEC (char_ptr) *fn_list = NULL;
-  VEC (char_ptr) *list = NULL;
   const char *p;
   int quote_found = 0;
   int quoted = *text == '\'' || *text == '"';
@@ -298,15 +296,15 @@  location_completer (struct completer_data *cdata,
      symbols as well as on files.  */
   if (colon)
     {
-      list = make_file_symbol_completion_list (cdata, symbol_start, word,
-					       file_to_match);
+      make_file_symbol_completion_list (cdata, symbol_start, word,
+					file_to_match);
       n_syms = get_completion_count (cdata);
       n_files = 0;
       xfree (file_to_match);
     }
   else
     {
-      list = make_symbol_completion_list (cdata, symbol_start, word);
+      make_symbol_completion_list (cdata, symbol_start, word);
       n_syms = get_completion_count (cdata);
       n_files = 0;
       /* If text includes characters which cannot appear in a file
@@ -314,27 +312,11 @@  location_completer (struct completer_data *cdata,
       if (strcspn (text, 
 		   gdb_completer_file_name_break_characters) == text_len)
 	{
-	  fn_list = make_source_files_completion_list (cdata, text, text);
+	  make_source_files_completion_list (cdata, text, text);
 	  n_files = get_completion_count (cdata) - n_syms;
 	}
     }
 
-  /* Catenate fn_list[] onto the end of list[].  */
-  if (!n_syms)
-    {
-      VEC_free (char_ptr, list); /* Paranoia.  */
-      list = fn_list;
-      fn_list = NULL;
-    }
-  else
-    {
-      char *fn;
-
-      for (ix = 0; VEC_iterate (char_ptr, fn_list, ix, fn); ++ix)
-	VEC_safe_push (char_ptr, list, fn);
-      VEC_free (char_ptr, fn_list);
-    }
-
   if (n_syms && n_files)
     {
       /* Nothing.  */
@@ -365,18 +347,15 @@  location_completer (struct completer_data *cdata,
     {
       /* No completions at all.  As the final resort, try completing
 	 on the entire text as a symbol.  */
-      list = make_symbol_completion_list (cdata, orig_text, word);
+      make_symbol_completion_list (cdata, orig_text, word);
     }
-
-  return list;
 }
 
 /* Helper for expression_completer which recursively adds field and
    method names from TYPE, a struct or union type, to the array
    OUTPUT.  */
 static void
-add_struct_fields (struct completer_data *cdata,
-		   struct type *type, VEC (char_ptr) **output,
+add_struct_fields (struct completer_data *cdata, struct type *type,
 		   char *fieldname, int namelen)
 {
   int i;
@@ -388,7 +367,7 @@  add_struct_fields (struct completer_data *cdata,
     {
       if (i < TYPE_N_BASECLASSES (type))
 	add_struct_fields (cdata, TYPE_BASECLASS (type, i),
-			   output, fieldname, namelen);
+			   fieldname, namelen);
       else if (TYPE_FIELD_NAME (type, i))
 	{
 	  if (TYPE_FIELD_NAME (type, i)[0] != '\0')
@@ -396,7 +375,7 @@  add_struct_fields (struct completer_data *cdata,
 	      if (! strncmp (TYPE_FIELD_NAME (type, i), 
 			     fieldname, namelen))
 		{
-		  if (add_completion (cdata, output, TYPE_FIELD_NAME (type, i),
+		  if (add_completion (cdata, TYPE_FIELD_NAME (type, i),
 				      NULL, NULL)
 		      == ADD_COMPLETION_MAX_REACHED)
 		    return;
@@ -406,7 +385,7 @@  add_struct_fields (struct completer_data *cdata,
 	    {
 	      /* Recurse into anonymous unions.  */
 	      add_struct_fields (cdata, TYPE_FIELD_TYPE (type, i),
-				 output, fieldname, namelen);
+				 fieldname, namelen);
 	    }
 	}
     }
@@ -425,7 +404,7 @@  add_struct_fields (struct completer_data *cdata,
 	  /* Omit constructors from the completion list.  */
 	  if (!type_name || strcmp (type_name, name))
 	    {
-	      if (add_completion (cdata, output, name, NULL, NULL)
+	      if (add_completion (cdata, name, NULL, NULL)
 		  == ADD_COMPLETION_MAX_REACHED)
 		return;
 	    }
@@ -436,7 +415,8 @@  add_struct_fields (struct completer_data *cdata,
 /* Complete on expressions.  Often this means completing on symbol
    names, but some language parsers also have support for completing
    field names.  */
-VEC (char_ptr) *
+
+void
 expression_completer (struct completer_data *cdata,
 		      struct cmd_list_element *ignore,
 		      const char *text, const char *word)
@@ -455,7 +435,7 @@  expression_completer (struct completer_data *cdata,
     }
   CATCH (except, RETURN_MASK_ERROR)
     {
-      return NULL;
+      return;
     }
   END_CATCH
 
@@ -474,22 +454,19 @@  expression_completer (struct completer_data *cdata,
 	  || TYPE_CODE (type) == TYPE_CODE_STRUCT)
 	{
 	  int flen = strlen (fieldname);
-	  VEC (char_ptr) *result = NULL;
 
-	  add_struct_fields (cdata, type, &result, fieldname, flen);
+	  add_struct_fields (cdata, type, fieldname, flen);
 	  xfree (fieldname);
-	  return result;
+	  return;
 	}
     }
   else if (fieldname && code != TYPE_CODE_UNDEF)
     {
-      VEC (char_ptr) *result;
       struct cleanup *cleanup = make_cleanup (xfree, fieldname);
 
-      result
-	= make_symbol_completion_type (cdata, fieldname, fieldname, code);
+      make_symbol_completion_type (cdata, fieldname, fieldname, code);
       do_cleanups (cleanup);
-      return result;
+      return;
     }
   xfree (fieldname);
 
@@ -501,7 +478,7 @@  expression_completer (struct completer_data *cdata,
     ;
 
   /* Not ideal but it is what we used to do before...  */
-  return location_completer (cdata, ignore, p, word);
+  location_completer (cdata, ignore, p, word);
 }
 
 /* See definition in completer.h.  */
@@ -578,12 +555,11 @@  complete_line_internal_reason;
    once sub-command completions are exhausted, we simply return NULL.
  */
 
-static VEC (char_ptr) *
+static void
 complete_line_internal (struct completer_data *cdata,
 			const char *text, const char *line_buffer, int point,
 			complete_line_internal_reason reason)
 {
-  VEC (char_ptr) *list = NULL;
   char *tmp_command;
   const char *p;
   int ignore_help_classes;
@@ -638,7 +614,7 @@  complete_line_internal (struct completer_data *cdata,
     {
       /* It is an unrecognized command.  So there are no
 	 possible completions.  */
-      list = NULL;
+      return;
     }
   else if (c == CMD_LIST_AMBIGUOUS)
     {
@@ -656,7 +632,7 @@  complete_line_internal (struct completer_data *cdata,
 	     example, "info t " or "info t foo" does not complete
 	     to anything, because "info t" can be "info target" or
 	     "info terminal".  */
-	  list = NULL;
+	  return;
 	}
       else
 	{
@@ -665,14 +641,14 @@  complete_line_internal (struct completer_data *cdata,
 	  if (result_list)
 	    {
 	      if (reason != handle_brkchars)
-		list = complete_on_cmdlist (cdata, *result_list->prefixlist,
-					    p, word, ignore_help_classes);
+		complete_on_cmdlist (cdata, *result_list->prefixlist,
+				     p, word, ignore_help_classes);
 	    }
 	  else
 	    {
 	      if (reason != handle_brkchars)
-		list = complete_on_cmdlist (cdata, cmdlist, p, word,
-					    ignore_help_classes);
+		complete_on_cmdlist (cdata, cmdlist, p, word,
+				     ignore_help_classes);
 	    }
 	  /* Ensure that readline does the right thing with respect to
 	     inserting quotes.  */
@@ -698,8 +674,8 @@  complete_line_internal (struct completer_data *cdata,
 		  /* It is a prefix command; what comes after it is
 		     a subcommand (e.g. "info ").  */
 		  if (reason != handle_brkchars)
-		    list = complete_on_cmdlist (cdata, *c->prefixlist, p,
-						word, ignore_help_classes);
+		    complete_on_cmdlist (cdata, *c->prefixlist, p,
+					 word, ignore_help_classes);
 
 		  /* Ensure that readline does the right thing
 		     with respect to inserting quotes.  */
@@ -707,11 +683,11 @@  complete_line_internal (struct completer_data *cdata,
 		    gdb_completer_command_word_break_characters;
 		}
 	      else if (reason == handle_help)
-		list = NULL;
+		return;
 	      else if (c->enums)
 		{
 		  if (reason != handle_brkchars)
-		    list = complete_on_enum (cdata, c->enums, p, word);
+		    complete_on_enum (cdata, c->enums, p, word);
 		  rl_completer_word_break_characters =
 		    gdb_completer_command_word_break_characters;
 		}
@@ -751,7 +727,7 @@  complete_line_internal (struct completer_data *cdata,
 		      && c->completer_handle_brkchars != NULL)
 		    (*c->completer_handle_brkchars) (c, p, word);
 		  if (reason != handle_brkchars && c->completer != NULL)
-		    list = (*c->completer) (cdata, c, p, word);
+		    (*c->completer) (cdata, c, p, word);
 		}
 	    }
 	  else
@@ -773,8 +749,8 @@  complete_line_internal (struct completer_data *cdata,
 		}
 
 	      if (reason != handle_brkchars)
-		list = complete_on_cmdlist (cdata, result_list, q, word,
-					    ignore_help_classes);
+		complete_on_cmdlist (cdata, result_list, q, word,
+				     ignore_help_classes);
 
 	      /* Ensure that readline does the right thing
 		 with respect to inserting quotes.  */
@@ -783,7 +759,7 @@  complete_line_internal (struct completer_data *cdata,
 	    }
 	}
       else if (reason == handle_help)
-	list = NULL;
+	return;
       else
 	{
 	  /* There is non-whitespace beyond the command.  */
@@ -792,12 +768,12 @@  complete_line_internal (struct completer_data *cdata,
 	    {
 	      /* It is an unrecognized subcommand of a prefix command,
 		 e.g. "info adsfkdj".  */
-	      list = NULL;
+	      return;
 	    }
 	  else if (c->enums)
 	    {
 	      if (reason != handle_brkchars)
-		list = complete_on_enum (cdata, c->enums, p, word);
+		complete_on_enum (cdata, c->enums, p, word);
 	    }
 	  else
 	    {
@@ -827,12 +803,10 @@  complete_line_internal (struct completer_data *cdata,
 		  && c->completer_handle_brkchars != NULL)
 		(*c->completer_handle_brkchars) (c, p, word);
 	      if (reason != handle_brkchars && c->completer != NULL)
-		list = (*c->completer) (cdata, c, p, word);
+		(*c->completer) (cdata, c, p, word);
 	    }
 	}
     }
-
-  return list;
 }
 
 /* Allocate a new completer data structure.  */
@@ -986,8 +960,8 @@  get_maximum_completions (void)
 /* See completer.h.  */
 
 enum add_completion_status
-add_completion (struct completer_data *cdata, VEC (char_ptr) **result,
-		const char *match, const char *text, const char *word)
+add_completion (struct completer_data *cdata, const char *match,
+		const char *text, const char *word)
 {
   enum maybe_add_completion_enum add_status;
   char *alloc = completer_strdup (match, text, word);
@@ -996,10 +970,8 @@  add_completion (struct completer_data *cdata, VEC (char_ptr) **result,
   switch (add_status)
     {
     case MAYBE_ADD_COMPLETION_OK:
-      VEC_safe_push (char_ptr, *result, alloc);
       break;
     case MAYBE_ADD_COMPLETION_OK_MAX_REACHED:
-      VEC_safe_push (char_ptr, *result, alloc);
       return ADD_COMPLETION_MAX_REACHED;
     case MAYBE_ADD_COMPLETION_MAX_REACHED:
       xfree (alloc);
@@ -1054,23 +1026,23 @@  complete_line (const char *text, const char *line_buffer, int point)
 }
 
 /* Complete on command names.  Used by "help".  */
-VEC (char_ptr) *
+
+void
 command_completer (struct completer_data *cdata,
 		   struct cmd_list_element *ignore,
 		   const char *text, const char *word)
 {
-  return complete_line_internal (cdata, word, text,
-				 strlen (text), handle_help);
+  complete_line_internal (cdata, word, text,
+			  strlen (text), handle_help);
 }
 
 /* Complete on signals.  */
 
-VEC (char_ptr) *
+void
 signal_completer (struct completer_data *cdata,
 		  struct cmd_list_element *ignore,
 		  const char *text, const char *word)
 {
-  VEC (char_ptr) *return_val = NULL;
   size_t len = strlen (word);
   int signum;
   const char *signame;
@@ -1089,13 +1061,11 @@  signal_completer (struct completer_data *cdata,
 
       if (strncasecmp (signame, word, len) == 0)
 	{
-	  if (add_completion (cdata, &return_val, signame, NULL, NULL)
+	  if (add_completion (cdata, signame, NULL, NULL)
 	      == ADD_COMPLETION_MAX_REACHED)
 	    break;
 	}
     }
-
-  return return_val;
 }
 
 /* Bit-flags for selecting what the register and/or register-group
@@ -1110,13 +1080,12 @@  enum reg_completer_targets
 /* Complete register names and/or reggroup names based on the value passed
    in TARGETS.  At least one bit in TARGETS must be set.  */
 
-static VEC (char_ptr) *
+static void
 reg_or_group_completer_1 (struct completer_data *cdata,
 			  struct cmd_list_element *ignore,
 			  const char *text, const char *word,
 			  enum reg_completer_targets targets)
 {
-  VEC (char_ptr) *result = NULL;
   size_t len = strlen (word);
   struct gdbarch *gdbarch;
   const char *name;
@@ -1124,6 +1093,8 @@  reg_or_group_completer_1 (struct completer_data *cdata,
   gdb_assert ((targets & (complete_register_names
 			  | complete_reggroup_names)) != 0);
   gdbarch = get_current_arch ();
+  if (!target_has_registers)
+    return;
 
   if ((targets & complete_register_names) != 0)
     {
@@ -1135,9 +1106,9 @@  reg_or_group_completer_1 (struct completer_data *cdata,
 	{
 	  if (*name != '\0' && strncmp (word, name, len) == 0)
 	    {
-	      if (add_completion (cdata, &result, name, NULL, NULL)
+	      if (add_completion (cdata, name, NULL, NULL)
 		  == ADD_COMPLETION_MAX_REACHED)
-		return result;
+		return;
 	    }
 	}
     }
@@ -1153,37 +1124,35 @@  reg_or_group_completer_1 (struct completer_data *cdata,
 	  name = reggroup_name (group);
 	  if (strncmp (word, name, len) == 0)
 	    {
-	      if (add_completion (cdata, &result, name, NULL, NULL)
+	      if (add_completion (cdata, name, NULL, NULL)
 		  == ADD_COMPLETION_MAX_REACHED)
-		return result;
+		return;
 	    }
 	}
     }
-
-  return result;
 }
 
 /* Perform completion on register and reggroup names.  */
 
-VEC (char_ptr) *
+void
 reg_or_group_completer (struct completer_data *cdata,
 			struct cmd_list_element *ignore,
 			const char *text, const char *word)
 {
-  return reg_or_group_completer_1 (cdata, ignore, text, word,
-				   (complete_register_names
-				    | complete_reggroup_names));
+  reg_or_group_completer_1 (cdata, ignore, text, word,
+			    (complete_register_names
+			     | complete_reggroup_names));
 }
 
 /* Perform completion on reggroup names.  */
 
-VEC (char_ptr) *
+void
 reggroup_completer (struct completer_data *cdata,
 		    struct cmd_list_element *ignore,
 		    const char *text, const char *word)
 {
-  return reg_or_group_completer_1 (cdata, ignore, text, word,
-				   complete_reggroup_names);
+  reg_or_group_completer_1 (cdata, ignore, text, word,
+			    complete_reggroup_names);
 }
 
 /* Get the list of chars that are considered as word breaks
diff --git a/gdb/completer.h b/gdb/completer.h
index 07c7d93..cfdca71 100644
--- a/gdb/completer.h
+++ b/gdb/completer.h
@@ -76,37 +76,37 @@  extern VEC (char_ptr) *complete_line (const char *text,
 extern char *readline_line_completion_function (const char *text,
 						int matches);
 
-extern VEC (char_ptr) *noop_completer (struct completer_data *,
-				       struct cmd_list_element *,
-				       const char *, const char *);
+extern void noop_completer (struct completer_data *,
+			    struct cmd_list_element *,
+			    const char *, const char *);
 
-extern VEC (char_ptr) *filename_completer (struct completer_data *,
-					   struct cmd_list_element *,
-					   const char *, const char *);
+extern void filename_completer (struct completer_data *,
+				struct cmd_list_element *,
+				const char *, const char *);
 
-extern VEC (char_ptr) *expression_completer (struct completer_data *,
-					     struct cmd_list_element *,
-					     const char *, const char *);
+extern void expression_completer (struct completer_data *,
+				  struct cmd_list_element *,
+				  const char *, const char *);
 
-extern VEC (char_ptr) *location_completer (struct completer_data *,
-					   struct cmd_list_element *,
-					   const char *, const char *);
+extern void location_completer (struct completer_data *,
+				struct cmd_list_element *,
+				const char *, const char *);
 
-extern VEC (char_ptr) *command_completer (struct completer_data *,
-					  struct cmd_list_element *,
-					  const char *, const char *);
+extern void command_completer (struct completer_data *,
+			       struct cmd_list_element *,
+			       const char *, const char *);
 
-extern VEC (char_ptr) *signal_completer (struct completer_data *,
-					 struct cmd_list_element *,
-					 const char *, const char *);
+extern void signal_completer (struct completer_data *,
+			      struct cmd_list_element *,
+			      const char *, const char *);
 
-extern VEC (char_ptr) *reg_or_group_completer (struct completer_data *,
-					       struct cmd_list_element *,
-					       const char *, const char *);
+extern void reg_or_group_completer (struct completer_data *,
+				    struct cmd_list_element *,
+				    const char *, const char *);
 
-extern VEC (char_ptr) *reggroup_completer (struct completer_data *cdata,
-					   struct cmd_list_element *,
-					   const char *, const char *);
+extern void reggroup_completer (struct completer_data *cdata,
+				struct cmd_list_element *,
+				const char *, const char *);
 
 extern char *get_gdb_completer_quote_characters (void);
 
@@ -163,8 +163,7 @@  enum add_completion_status
    saved into the completion list.  See completer_strdup for more.  */
 
 extern enum add_completion_status
-  add_completion (struct completer_data *cdata,
-		  VEC (char_ptr) **result, const char *match,
+  add_completion (struct completer_data *cdata, const char *match,
 		  const char *text, const char *word);
 
 /* Wrapper to throw MAX_COMPLETIONS_REACHED_ERROR.  */ 
diff --git a/gdb/corefile.c b/gdb/corefile.c
index 41b7cb0..4e5e96a 100644
--- a/gdb/corefile.c
+++ b/gdb/corefile.c
@@ -467,7 +467,7 @@  set_gnutarget_command (char *ignore, int from_tty,
 
 /* A completion function for "set gnutarget".  */
 
-static VEC (char_ptr) *
+static void
 complete_set_gnutarget (struct completer_data *cdata,
 			struct cmd_list_element *cmd,
 			const char *text, const char *word)
@@ -487,7 +487,7 @@  complete_set_gnutarget (struct completer_data *cdata,
       bfd_targets[last + 1] = NULL;
     }
 
-  return complete_on_enum (cdata, bfd_targets, text, word);
+  complete_on_enum (cdata, bfd_targets, text, word);
 }
 
 /* Set the gnutarget.  */
diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c
index 504bb20..cddc382 100644
--- a/gdb/cp-abi.c
+++ b/gdb/cp-abi.c
@@ -358,7 +358,7 @@  set_cp_abi_cmd (char *args, int from_tty)
 
 /* A completion function for "set cp-abi".  */
 
-static VEC (char_ptr) *
+static void
 cp_abi_completer (struct completer_data *cdata,
 		  struct cmd_list_element *ignore,
 		  const char *text, const char *word)
@@ -375,7 +375,7 @@  cp_abi_completer (struct completer_data *cdata,
       cp_abi_names[i] = NULL;
     }
 
-  return complete_on_enum (cdata, cp_abi_names, text, word);
+  complete_on_enum (cdata, cp_abi_names, text, word);
 }
 
 /* Show the currently selected C++ ABI.  */
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index 15c51d9..b5886a6 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -228,13 +228,13 @@  f_word_break_characters (void)
 /* Consider the modules separator :: as a valid symbol name character
    class.  */
 
-static VEC (char_ptr) *
+static void
 f_make_symbol_completion_list (struct completer_data *cdata,
 			       const char *text, const char *word,
 			       enum type_code code)
 {
-  return default_make_symbol_completion_list_break_on (cdata, text, word,
-						       ":", code);
+  default_make_symbol_completion_list_break_on (cdata, text, word,
+						":", code);
 }
 
 const struct language_defn f_language_defn =
diff --git a/gdb/guile/scm-cmd.c b/gdb/guile/scm-cmd.c
index 1544c2b..8816346 100644
--- a/gdb/guile/scm-cmd.c
+++ b/gdb/guile/scm-cmd.c
@@ -348,8 +348,7 @@  cmdscm_bad_completion_result (const char *msg, SCM completion)
    The result is a boolean indicating success.  */
 
 static int
-cmdscm_add_completion (SCM completion, struct completer_data *cdata,
-		       VEC (char_ptr) **result)
+cmdscm_add_completion (SCM completion, struct completer_data *cdata)
 {
   char *item;
   SCM except_scm;
@@ -371,14 +370,14 @@  cmdscm_add_completion (SCM completion, struct completer_data *cdata,
       return 0;
     }
 
-  (void) add_completion (cdata, result, item, NULL, NULL);
+  (void) add_completion (cdata, item, NULL, NULL);
   xfree (item);
   return 1;
 }
 
 /* Called by gdb for command completion.  */
 
-static VEC (char_ptr) *
+static void
 cmdscm_completer (struct completer_data *cdata,
 		  struct cmd_list_element *command,
 		  const char *text, const char *word)
@@ -386,7 +385,6 @@  cmdscm_completer (struct completer_data *cdata,
   command_smob *c_smob/*obj*/ = (command_smob *) get_cmd_context (command);
   SCM completer_result_scm;
   SCM text_scm, word_scm, result_scm;
-  VEC (char_ptr) *result = NULL;
 
   gdb_assert (c_smob != NULL);
   gdb_assert (gdbscm_is_procedure (c_smob->complete));
@@ -408,7 +406,7 @@  cmdscm_completer (struct completer_data *cdata,
     {
       /* Inform the user, but otherwise ignore.  */
       gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
-      goto done;
+      return;
     }
 
   if (gdbscm_is_true (scm_list_p (completer_result_scm)))
@@ -419,11 +417,8 @@  cmdscm_completer (struct completer_data *cdata,
 	{
 	  SCM next = scm_car (list);
 
-	  if (!cmdscm_add_completion (next, cdata, &result))
-	    {
-	      VEC_free (char_ptr, result);
-	      goto done;
-	    }
+	  if (!cmdscm_add_completion (next, cdata))
+	    return;
 
 	  list = scm_cdr (list);
 	}
@@ -439,15 +434,11 @@  cmdscm_completer (struct completer_data *cdata,
 	    {
 	      /* Inform the user, but otherwise ignore the entire result.  */
 	      gdbscm_print_gdb_exception (SCM_BOOL_F, completer_result_scm);
-	      VEC_free (char_ptr, result);
-	      goto done;
+	      return;
 	    }
 
-	  if (!cmdscm_add_completion (next, cdata, &result))
-	    {
-	      VEC_free (char_ptr, result);
-	      goto done;
-	    }
+	  if (!cmdscm_add_completion (next, cdata))
+	    return;
 
 	  next = itscm_safe_call_next_x (iter, NULL);
 	}
@@ -458,9 +449,6 @@  cmdscm_completer (struct completer_data *cdata,
       cmdscm_bad_completion_result (_("Bad completer result: "),
 				    completer_result_scm);
     }
-
- done:
-  return result;
 }
 
 /* Helper for gdbscm_make_command which locates the command list to use and
diff --git a/gdb/infrun.c b/gdb/infrun.c
index d858b28..343f9da 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -7065,12 +7065,11 @@  Are you sure you want to change it? "),
 
 /* Complete the "handle" command.  */
 
-static VEC (char_ptr) *
+static void
 handle_completer (struct completer_data *cdata,
 		  struct cmd_list_element *ignore,
 		  const char *text, const char *word)
 {
-  VEC (char_ptr) *vec_signals, *vec_keywords, *return_val;
   static const char * const keywords[] =
     {
       "all",
@@ -7085,13 +7084,8 @@  handle_completer (struct completer_data *cdata,
       NULL,
     };
 
-  vec_signals = signal_completer (cdata, ignore, text, word);
-  vec_keywords = complete_on_enum (cdata, keywords, word, word);
-
-  return_val = VEC_merge (char_ptr, vec_signals, vec_keywords);
-  VEC_free (char_ptr, vec_signals);
-  VEC_free (char_ptr, vec_keywords);
-  return return_val;
+  signal_completer (cdata, ignore, text, word);
+  complete_on_enum (cdata, keywords, word, word);
 }
 
 enum gdb_signal
diff --git a/gdb/interps.c b/gdb/interps.c
index 9e993c8..19cb716 100644
--- a/gdb/interps.c
+++ b/gdb/interps.c
@@ -434,13 +434,12 @@  interpreter_exec_cmd (char *args, int from_tty)
 }
 
 /* List the possible interpreters which could complete the given text.  */
-static VEC (char_ptr) *
+static void
 interpreter_completer (struct completer_data *cdata,
 		       struct cmd_list_element *ignore,
 		       const char *text, const char *word)
 {
   int textlen;
-  VEC (char_ptr) *matches = NULL;
   struct interp *interp;
 
   textlen = strlen (text);
@@ -448,13 +447,11 @@  interpreter_completer (struct completer_data *cdata,
     {
       if (strncmp (interp->name, text, textlen) == 0)
 	{
-	  if (add_completion (cdata, &matches, interp->name, text, word)
+	  if (add_completion (cdata, interp->name, text, word)
 	      == ADD_COMPLETION_MAX_REACHED)
 	    break;
 	}
     }
-
-  return matches;
 }
 
 struct interp *
diff --git a/gdb/language.h b/gdb/language.h
index 954b4a8..24fb1e8 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -302,7 +302,7 @@  struct language_defn
        completion is being made.  If CODE is TYPE_CODE_UNDEF, then all
        symbols should be examined; otherwise, only STRUCT_DOMAIN
        symbols whose type has a code of CODE should be matched.  */
-    VEC (char_ptr) *
+    void
       (*la_make_symbol_completion_list) (struct completer_data *,
 					 const char *text,
 					 const char *word,
diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c
index cf76bd1..7a57349 100644
--- a/gdb/python/py-cmd.c
+++ b/gdb/python/py-cmd.c
@@ -330,13 +330,12 @@  cmdpy_completer_handle_brkchars (struct cmd_list_element *command,
 
 /* Called by gdb for command completion.  */
 
-static VEC (char_ptr) *
+static void
 cmdpy_completer (struct completer_data *cdata,
 		 struct cmd_list_element *command,
 		 const char *text, const char *word)
 {
   PyObject *resultobj = NULL;
-  VEC (char_ptr) *result = NULL;
   struct cleanup *cleanup;
 
   cleanup = ensure_python_env (get_current_arch (), current_language);
@@ -351,7 +350,6 @@  cmdpy_completer (struct completer_data *cdata,
   if (resultobj == NULL)
     goto done;
 
-  result = NULL;
   if (PyInt_Check (resultobj))
     {
       /* User code may also return one of the completion constants,
@@ -364,7 +362,7 @@  cmdpy_completer (struct completer_data *cdata,
 	  PyErr_Clear ();
 	}
       else if (value >= 0 && value < (long) N_COMPLETERS)
-	result = completers[value].completer (cdata, command, text, word);
+	completers[value].completer (cdata, command, text, word);
     }
   else
     {
@@ -393,7 +391,7 @@  cmdpy_completer (struct completer_data *cdata,
 	      continue;
 	    }
 
-	  if (add_completion (cdata, &result, item, NULL, NULL)
+	  if (add_completion (cdata, item, NULL, NULL)
 	      == ADD_COMPLETION_MAX_REACHED)
 	    {
 	      xfree (item);
@@ -414,8 +412,6 @@  cmdpy_completer (struct completer_data *cdata,
 
   Py_XDECREF (resultobj);
   do_cleanups (cleanup);
-
-  return result;
 }
 
 /* Helper for cmdpy_init which locates the command list to use and
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index c29d3c5..862683b 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -1223,7 +1223,7 @@  simulator_command (char *args, int from_tty)
   registers_changed ();
 }
 
-static VEC (char_ptr) *
+static void
 sim_command_completer (struct completer_data *cdata,
 		       struct cmd_list_element *ignore, const char *text,
 		       const char *word)
@@ -1235,22 +1235,20 @@  sim_command_completer (struct completer_data *cdata,
 
   sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
   if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
-    return NULL;
+    return;
 
   tmp = sim_complete_command (sim_data->gdbsim_desc, text, word);
   if (tmp == NULL)
-    return NULL;
+    return;
 
   /* Transform the array into a VEC, and then free the array.  */
   for (i = 0; tmp[i] != NULL; i++)
     {
-      if (add_completion (cdata, &result, tmp[i], NULL, NULL)
+      if (add_completion (cdata, tmp[i], NULL, NULL)
 	  == ADD_COMPLETION_MAX_REACHED)
 	break;
     }
   xfree (tmp);
-
-  return result;
 }
 
 /* Check to see if a thread is still alive.  */
diff --git a/gdb/symtab.c b/gdb/symtab.c
index e24de89..18b7619 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -5011,31 +5011,8 @@  compare_symbol_name (const char *name, const char *sym_text, int sym_text_len)
   return 1;
 }
 
-/* Free any memory associated with a completion list.  */
-
-static void
-free_completion_list (VEC (char_ptr) **list_ptr)
-{
-  int i;
-  char *p;
-
-  for (i = 0; VEC_iterate (char_ptr, *list_ptr, i, p); ++i)
-    xfree (p);
-  VEC_free (char_ptr, *list_ptr);
-}
-
-/* Callback for make_cleanup.  */
-
-static void
-do_free_completion_list (void *list)
-{
-  free_completion_list (list);
-}
-
 /* Helper routine for make_symbol_completion_list.  */
 
-static VEC (char_ptr) *return_val;
-
 #define COMPLETION_LIST_ADD_SYMBOL(cdata, symbol, sym_text, len,	\
 				   text, word)				\
   completion_list_add_name						\
@@ -5063,7 +5040,7 @@  completion_list_add_name (struct completer_data *cdata,
   /* We have a match for a completion, so add SYMNAME to the current list
      of matches.  */
 
-    if (add_completion (cdata, &return_val, symname, sym_text, word)
+    if (add_completion (cdata, symname, sym_text, word) 
 	== ADD_COMPLETION_MAX_REACHED)
       throw_max_completions_reached_error ();
 }
@@ -5499,18 +5476,13 @@  default_make_symbol_completion_list_break_on_1 (struct completer_data *cdata,
     }
 }
 
-VEC (char_ptr) *
+void
 default_make_symbol_completion_list_break_on (struct completer_data *cdata,
 					      const char *text,
 					      const char *word,
 					      const char *break_on,
 					      enum type_code code)
 {
-  struct cleanup *back_to;
-
-  return_val = NULL;
-  back_to = make_cleanup (do_free_completion_list, &return_val);
-
   TRY
     {
       default_make_symbol_completion_list_break_on_1 (cdata, text, word,
@@ -5522,61 +5494,56 @@  default_make_symbol_completion_list_break_on (struct completer_data *cdata,
 	throw_exception (except);
     }
   END_CATCH
-
-  discard_cleanups (back_to);
-  return return_val;
 }
 
-VEC (char_ptr) *
+void
 default_make_symbol_completion_list (struct completer_data *cdata,
 				     const char *text, const char *word,
 				     enum type_code code)
 {
-  return default_make_symbol_completion_list_break_on (cdata, text, word, "",
-						       code);
+  default_make_symbol_completion_list_break_on (cdata, text, word, "", code);
 }
 
 /* Return a vector of all symbols (regardless of class) which begin by
    matching TEXT.  If the answer is no symbols, then the return value
    is NULL.  */
 
-VEC (char_ptr) *
+void
 make_symbol_completion_list (struct completer_data *cdata,
 			     const char *text, const char *word)
 {
-  return current_language->la_make_symbol_completion_list (cdata, text, word,
-							   TYPE_CODE_UNDEF);
+  current_language->la_make_symbol_completion_list (cdata, text, word,
+						    TYPE_CODE_UNDEF);
 }
 
 /* Like make_symbol_completion_list, but only return STRUCT_DOMAIN
    symbols whose type code is CODE.  */
 
-VEC (char_ptr) *
+void
 make_symbol_completion_type (struct completer_data *cdata, const char *text,
 			     const char *word, enum type_code code)
 {
   gdb_assert (code == TYPE_CODE_UNION
 	      || code == TYPE_CODE_STRUCT
 	      || code == TYPE_CODE_ENUM);
-  return current_language->la_make_symbol_completion_list (cdata, text, word,
-							   code);
+  current_language->la_make_symbol_completion_list (cdata, text, word, code);
 }
 
 /* Like make_symbol_completion_list, but suitable for use as a
    completion function.  */
 
-VEC (char_ptr) *
+void
 make_symbol_completion_list_fn (struct completer_data *cdata,
 				struct cmd_list_element *ignore,
 				const char *text, const char *word)
 {
-  return make_symbol_completion_list (cdata, text, word);
+  make_symbol_completion_list (cdata, text, word);
 }
 
 /* Like make_symbol_completion_list, but returns a list of symbols
    defined in a source file FILE.  */
 
-VEC (char_ptr) *
+void
 make_file_symbol_completion_list (struct completer_data *cdata,
 				  const char *text, const char *word,
 				  const char *srcfile)
@@ -5624,7 +5591,7 @@  make_file_symbol_completion_list (struct completer_data *cdata,
       /* A double-quoted string is never a symbol, nor does it make sense
          to complete it any other way.  */
       {
-	return NULL;
+	return;
       }
     else
       {
@@ -5635,8 +5602,6 @@  make_file_symbol_completion_list (struct completer_data *cdata,
 
   sym_text_len = strlen (sym_text);
 
-  return_val = NULL;
-
   /* Find the symtab for SRCFILE (this loads it if it was not yet read
      in).  */
   s = lookup_symtab (srcfile);
@@ -5652,7 +5617,7 @@  make_file_symbol_completion_list (struct completer_data *cdata,
 
   /* If we have no symtab for that file, return an empty list.  */
   if (s == NULL)
-    return (return_val);
+    return;
 
   /* Go through this symtab and check the externs and statics for
      symbols which match.  */
@@ -5670,8 +5635,6 @@  make_file_symbol_completion_list (struct completer_data *cdata,
       COMPLETION_LIST_ADD_SYMBOL (cdata, sym, sym_text, sym_text_len,
 				  text, word);
     }
-
-  return (return_val);
 }
 
 /* A helper function for make_source_files_completion_list.  It adds
@@ -5680,10 +5643,9 @@  make_file_symbol_completion_list (struct completer_data *cdata,
 
 static void
 add_filename_to_list (struct completer_data *cdata, const char *fname,
-		      const char *text, const char *word,
-		      VEC (char_ptr) **list)
+		      const char *text, const char *word)
 {
-  (void) add_completion (cdata, list, fname, text, word);
+  (void) add_completion (cdata, fname, text, word);
 }
 
 static int
@@ -5711,7 +5673,6 @@  struct add_partial_filename_data
   const char *text;
   const char *word;
   int text_len;
-  VEC (char_ptr) **list;
 
   /* Completion data used by the completer function.  */
   struct completer_data *completer_data;
@@ -5733,7 +5694,7 @@  maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
       /* This file matches for a completion; add it to the
 	 current list of matches.  */
       add_filename_to_list (data->completer_data, filename, data->text,
-			    data->word, data->list);
+			    data->word);
     }
   else
     {
@@ -5744,17 +5705,15 @@  maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
 	  && filename_ncmp (base_name, data->text, data->text_len) == 0)
 	{
 	  add_filename_to_list (data->completer_data, base_name, data->text,
-				data->word, data->list);
+				data->word);
 	}
     }
 }
 
-/* Return a vector of all source files whose names begin with matching
-   TEXT.  The file names are looked up in the symbol tables of this
-   program.  If the answer is no matchess, then the return value is
-   NULL.  */
+/* Add all source files whose names begin with matching TEXT to CDATA.
+   The file names are looked up in the symbol tables of this program.  */
 
-VEC (char_ptr) *
+void
 make_source_files_completion_list (struct completer_data *cdata,
 				   const char *text, const char *word)
 {
@@ -5762,16 +5721,13 @@  make_source_files_completion_list (struct completer_data *cdata,
   struct symtab *s;
   struct objfile *objfile;
   size_t text_len = strlen (text);
-  VEC (char_ptr) *list = NULL;
   const char *base_name;
   struct add_partial_filename_data datum;
   struct filename_seen_cache *filename_seen_cache;
-  struct cleanup *back_to, *cache_cleanup;
+  struct cleanup *cache_cleanup;
 
   if (!have_full_symbols () && !have_partial_symbols ())
-    return list;
-
-  back_to = make_cleanup (do_free_completion_list, &list);
+    return;
 
   filename_seen_cache = create_filename_seen_cache ();
   cache_cleanup = make_cleanup (delete_filename_seen_cache,
@@ -5786,7 +5742,7 @@  make_source_files_completion_list (struct completer_data *cdata,
 	{
 	  /* This file matches for a completion; add it to the current
 	     list of matches.  */
-	  add_filename_to_list (cdata, s->filename, text, word, &list);
+	  add_filename_to_list (cdata, s->filename, text, word);
 	}
       else
 	{
@@ -5798,7 +5754,7 @@  make_source_files_completion_list (struct completer_data *cdata,
 	  if (base_name != s->filename
 	      && !filename_seen (filename_seen_cache, base_name, 1)
 	      && filename_ncmp (base_name, text, text_len) == 0)
-	    add_filename_to_list (cdata, base_name, text, word, &list);
+	    add_filename_to_list (cdata, base_name, text, word);
 	}
     }
 
@@ -5806,15 +5762,11 @@  make_source_files_completion_list (struct completer_data *cdata,
   datum.text = text;
   datum.word = word;
   datum.text_len = text_len;
-  datum.list = &list;
   datum.completer_data = cdata;
   map_symbol_filenames (maybe_add_partial_symtab_filename, &datum,
 			0 /*need_fullname*/);
 
   do_cleanups (cache_cleanup);
-  discard_cleanups (back_to);
-
-  return list;
 }
 
 /* Track MAIN */
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 018852c..755e1d5 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1454,30 +1454,31 @@  extern void forget_cached_source_info (void);
 
 extern void select_source_symtab (struct symtab *);
 
-extern VEC (char_ptr) *default_make_symbol_completion_list_break_on
+extern void default_make_symbol_completion_list_break_on
  (struct completer_data *cdata, const char *text, const char *word,
   const char *break_on, enum type_code code);
-extern VEC (char_ptr) *
+
+extern void
  default_make_symbol_completion_list (struct completer_data *,
 				      const char *, const char *,
 				      enum type_code);
-extern VEC (char_ptr) *
+extern void
   make_symbol_completion_list (struct completer_data *, const char *,
 			       const char *);
-extern VEC (char_ptr) *
+extern void
   make_symbol_completion_type (struct completer_data *,
 			       const char *, const char *,
 			       enum type_code);
-extern VEC (char_ptr) *
+extern void
   make_symbol_completion_list_fn (struct completer_data *,
 				  struct cmd_list_element *,
 				  const char *, const char *);
 
-extern VEC (char_ptr) *
+extern void
   make_file_symbol_completion_list (struct completer_data *,
 				    const char *, const char *, const char *);
 
-extern VEC (char_ptr) *
+extern void
  make_source_files_completion_list (struct completer_data *, const char *,
 				    const char *);
 
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index 8d420894..c4c9cda 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -353,7 +353,7 @@  tui_default_win_viewport_height (enum tui_win_type type,
 /* Complete possible layout names.  TEXT is the complete text entered so
    far, WORD is the word currently being completed.  */
 
-static VEC (char_ptr) *
+static void
 layout_completer (struct completer_data *cdata,
 		  struct cmd_list_element *ignore,
 		  const char *text, const char *word)
@@ -361,7 +361,7 @@  layout_completer (struct completer_data *cdata,
   static const char *layout_names [] =
     { "src", "asm", "split", "regs", "next", "prev", NULL };
 
-  return complete_on_enum (cdata, layout_names, text, word);
+  complete_on_enum (cdata, layout_names, text, word);
 }
 
 /* Function to initialize gdb commands, for tui window layout
diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
index 17efd9f..bef01e5 100644
--- a/gdb/tui/tui-regs.c
+++ b/gdb/tui/tui-regs.c
@@ -668,29 +668,26 @@  tui_reg_command (char *args, int from_tty)
 /* Complete names of register groups, and add the special "prev" and "next"
    names.  */
 
-static VEC (char_ptr) *
+static void
 tui_reggroup_completer (struct completer_data *cdata,
 			struct cmd_list_element *ignore,
 			const char *text, const char *word)
 {
-  VEC (char_ptr) *result = NULL;
   static const char *extra[] = { "next", "prev", NULL };
   size_t len = strlen (word);
   const char **tmp;
 
-  result = reggroup_completer (cdata, ignore, text, word);
+  reggroup_completer (cdata, ignore, text, word);
 
   for (tmp = extra; *tmp != NULL; ++tmp)
     {
       if (strncmp (word, *tmp, len) == 0)
 	{
-	  if (add_completion (cdata, &result, *tmp, NULL, NULL)
+	  if (add_completion (cdata, *tmp, NULL, NULL)
 	      == ADD_COMPLETION_MAX_REACHED)
 	    break;
 	}
     }
-
-  return result;
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 8e7fbd1..4690af1 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -359,13 +359,12 @@  tui_set_var_cmd (char *null_args, int from_tty, struct cmd_list_element *c)
    window names 'next' and 'prev' will also be considered as possible
    completions of the window name.  */
 
-static VEC (char_ptr) *
+static void
 window_name_completer (int include_next_prev_p,
 		       struct completer_data *cdata,
 		       const char *text, const char *word)
 {
   VEC (const_char_ptr) *completion_name_vec = NULL;
-  VEC (char_ptr) *matches_vec;
   int win_type;
 
   for (win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++)
@@ -399,32 +398,29 @@  window_name_completer (int include_next_prev_p,
     }
 
   VEC_safe_push (const_char_ptr, completion_name_vec, NULL);
-  matches_vec
-    = complete_on_enum (cdata,
-			VEC_address (const_char_ptr, completion_name_vec),
-			text, word);
+  complete_on_enum (cdata,
+		    VEC_address (const_char_ptr, completion_name_vec),
+		    text, word);
 
   VEC_free (const_char_ptr, completion_name_vec);
-
-  return matches_vec;
 }
 
 /* Complete possible window names to focus on.  TEXT is the complete text
    entered so far, WORD is the word currently being completed.  */
 
-static VEC (char_ptr) *
+static void
 focus_completer (struct completer_data *cdata,
 		 struct cmd_list_element *ignore,
 		  const char *text, const char *word)
 {
-  return window_name_completer (1, cdata, text, word);
+  window_name_completer (1, cdata, text, word);
 }
 
 /* Complete possible window names for winheight command.  TEXT is the
    complete text entered so far, WORD is the word currently being
    completed.  */
 
-static VEC (char_ptr) *
+static void
 winheight_completer (struct completer_data *cdata,
 		     struct cmd_list_element *ignore,
 		     const char *text, const char *word)
@@ -432,9 +428,9 @@  winheight_completer (struct completer_data *cdata,
   /* The first word is the window name.  That we can complete.  Subsequent
      words can't be completed.  */
   if (word != text)
-    return NULL;
+    return;
 
-  return window_name_completer (0, cdata, text, word);
+  window_name_completer (0, cdata, text, word);
 }
 
 /* Function to initialize gdb commands, for tui window
diff --git a/gdb/value.c b/gdb/value.c
index 22d392a..b3d4f04 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2062,10 +2062,9 @@  lookup_only_internalvar (const char *name)
    Returns a vector of newly allocated strings, or NULL if no matches
    were found.  */
 
-VEC (char_ptr) *
+void
 complete_internalvar (struct completer_data *cdata, const char *name)
 {
-  VEC (char_ptr) *result = NULL;
   struct internalvar *var;
   int len;
 
@@ -2074,12 +2073,10 @@  complete_internalvar (struct completer_data *cdata, const char *name)
   for (var = internalvars; var; var = var->next)
     if (strncmp (var->name, name, len) == 0)
       {
-	if (add_completion (cdata, &result, var->name, NULL, NULL)
+	if (add_completion (cdata, var->name, NULL, NULL)
 	    == ADD_COMPLETION_MAX_REACHED)
 	  break;
       }
-
-  return result;
 }
 
 /* Create an internal variable with name NAME and with a void value.
diff --git a/gdb/value.h b/gdb/value.h
index 03df1b7..58c5c26 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -876,8 +876,8 @@  extern struct internalvar *lookup_only_internalvar (const char *name);
 
 extern struct internalvar *create_internalvar (const char *name);
 
-extern VEC (char_ptr) *complete_internalvar (struct completer_data *cdata,
-					     const char *name);
+extern void complete_internalvar (struct completer_data *cdata,
+				  const char *name);
 
 /* An internalvar can be dynamically computed by supplying a vector of
    function pointers to perform various operations.  */