* linespec.c (collect_methods): Delete.
authorKeith Seitz <keiths@redhat.com>
Tue, 16 Jun 2009 18:39:41 +0000 (18:39 +0000)
committerKeith Seitz <keiths@redhat.com>
Tue, 16 Jun 2009 18:39:41 +0000 (18:39 +0000)
(add_matching_methods): Reove destructor special case.
(find_method): Call find_methods directly instead of
collect_methods.
* valops.c (value_struct_elt): Remove destructor
special cases.
(check_field): Likewise.
(value_struct_elt_for_reference): Likewise.
(destructor_name_p): Remove misleading comment about dtors
being "special cases".
* gdbtypes.h (get_destructor_fn_field): Remove. No longer needed.
* gdbtypes.c (get_destructor_fn_field): Likewise.

gdb/ChangeLog
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/linespec.c
gdb/valops.c

index 812b83e46415ab7aeaac2085e969d4c2cd1ba16b..1cc0cb287e8a8561f8c270d932f733e2a2daeeed 100644 (file)
@@ -1,3 +1,18 @@
+2009-06-16  Keith Seitz  <keiths@redhat.com>
+
+       * linespec.c (collect_methods): Delete.
+       (add_matching_methods): Reove destructor special case.
+       (find_method): Call find_methods directly instead of
+       collect_methods.
+       * valops.c (value_struct_elt): Remove destructor
+       special cases.
+       (check_field): Likewise.
+       (value_struct_elt_for_reference): Likewise.
+       (destructor_name_p): Remove misleading comment about dtors
+       being "special cases". 
+       * gdbtypes.h (get_destructor_fn_field): Remove. No longer needed.
+       * gdbtypes.c (get_destructor_fn_field): Likewise. 
+
 2009-06-16  Pedro Alves  <pedro@codesourcery.com>
 
        * mi/mi-main.c (mi_cmd_data_read_memory): Dispatch
index f415773dfcc42fee175c0a6e7c4877597eb9382b..63f2e357263db16b48585bf85033445391201dc9 100644 (file)
@@ -1334,34 +1334,6 @@ get_vptr_fieldno (struct type *type, struct type **basetypep)
     }
 }
 
-/* Find the method and field indices for the destructor in class type T.
-   Return 1 if the destructor was found, otherwise, return 0.  */
-
-int
-get_destructor_fn_field (struct type *t, 
-                        int *method_indexp, 
-                        int *field_indexp)
-{
-  int i;
-
-  for (i = 0; i < TYPE_NFN_FIELDS (t); i++)
-    {
-      int j;
-      struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);
-
-      for (j = 0; j < TYPE_FN_FIELDLIST_LENGTH (t, i); j++)
-       {
-         if (is_destructor_name (TYPE_FN_FIELD_PHYSNAME (f, j)) != 0)
-           {
-             *method_indexp = i;
-             *field_indexp = j;
-             return 1;
-           }
-       }
-    }
-  return 0;
-}
-
 static void
 stub_noname_complaint (void)
 {
index fc54acc4ccf7a56d4dbf37966f080e7250cdc173..522d26f77a2b6e60087120732c4b98b8d14247b0 100644 (file)
@@ -1202,8 +1202,6 @@ extern struct type *lookup_template_type (char *, struct type *,
 
 extern int get_vptr_fieldno (struct type *, struct type **);
 
-extern int get_destructor_fn_field (struct type *, int *, int *);
-
 extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *);
 
 extern int is_ancestor (struct type *, struct type *);
index 3d0ceed84c89e10be552d14460a7e497c8119e52..9c101560a101804eea72551bdad541332a1d264b 100644 (file)
@@ -76,10 +76,6 @@ static struct symtabs_and_lines find_method (int funfirstline,
                                             struct type *t,
                                             struct symbol *sym_class);
 
-static int collect_methods (char *copy, struct type *t,
-                           struct symbol *sym_class,
-                           struct symbol **sym_arr);
-
 static NORETURN void cplusplus_error (const char *name,
                                      const char *fmt, ...)
      ATTR_NORETURN ATTR_FORMAT (printf, 2, 3);
@@ -306,11 +302,6 @@ add_matching_methods (int method_counter, struct type *t,
       else
        phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
 
-      /* Destructor is handled by caller, don't add it to
-        the list.  */
-      if (is_destructor_name (phys_name) != 0)
-       continue;
-
       sym_arr[i1] = lookup_symbol_in_language (phys_name,
                                   NULL, VAR_DOMAIN,
                                   language,
@@ -849,6 +840,10 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
       p = skip_quoted (*argptr);
     }
 
+  /* Keep any template parameters */
+  if (*p == '<')
+    p = find_template_name_end (p);
+
   copy = (char *) alloca (p - *argptr + 1);
   memcpy (copy, *argptr, p - *argptr);
   copy[p - *argptr] = '\0';
@@ -1441,7 +1436,7 @@ find_method (int funfirstline, char ***canonical, char *saved_arg,
   /* Find all methods with a matching name, and put them in
      sym_arr.  */
 
-  i1 = collect_methods (copy, t, sym_class, sym_arr);
+  i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr);
 
   if (i1 == 1)
     {
@@ -1492,37 +1487,6 @@ find_method (int funfirstline, char ***canonical, char *saved_arg,
     }
 }
 
-/* Find all methods named COPY in the class whose type is T, and put
-   them in SYM_ARR.  Return the number of methods found.  */
-
-static int
-collect_methods (char *copy, struct type *t,
-                struct symbol *sym_class, struct symbol **sym_arr)
-{
-  int i1 = 0;  /*  Counter for the symbol array.  */
-
-  if (destructor_name_p (copy, t))
-    {
-      /* Destructors are a special case.  */
-      int m_index, f_index;
-
-      if (get_destructor_fn_field (t, &m_index, &f_index))
-       {
-         struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index);
-
-         sym_arr[i1] =
-           lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index),
-                          NULL, VAR_DOMAIN, (int *) NULL);
-         if (sym_arr[i1])
-           i1++;
-       }
-    }
-  else
-    i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr);
-
-  return i1;
-}
-
 \f
 
 /* Return the symtab associated to the filename given by the substring
index 5907d96116ca2bb2a6a85d6b0370190aa705a1e7..5530f553b9ff250a4e68b465ed0785dd7ab6422a 100644 (file)
@@ -1849,10 +1849,6 @@ value_struct_elt (struct value **argp, struct value **args,
 
       /* C++: If it was not found as a data field, then try to
          return it as a pointer to a method.  */
-
-      if (destructor_name_p (name, t))
-       error (_("Cannot get value of destructor"));
-
       v = search_struct_method (name, argp, args, 0, 
                                static_memfuncp, t);
 
@@ -1868,32 +1864,6 @@ value_struct_elt (struct value **argp, struct value **args,
       return v;
     }
 
-  if (destructor_name_p (name, t))
-    {
-      if (!args[1])
-       {
-         /* Destructors are a special case.  */
-         int m_index, f_index;
-
-         v = NULL;
-         if (get_destructor_fn_field (t, &m_index, &f_index))
-           {
-             v = value_fn_field (NULL, 
-                                 TYPE_FN_FIELDLIST1 (t, m_index),
-                                 f_index, NULL, 0);
-           }
-         if (v == NULL)
-           error (_("could not find destructor function named %s."), 
-                  name);
-         else
-           return v;
-       }
-      else
-       {
-         error (_("destructor should not have any argument"));
-       }
-    }
-  else
     v = search_struct_method (name, argp, args, 0, 
                              static_memfuncp, t);
   
@@ -2499,8 +2469,6 @@ classify_oload_match (struct badness_vector *oload_champ_bv,
 int
 destructor_name_p (const char *name, const struct type *type)
 {
-  /* Destructors are a special case.  */
-
   if (name[0] == '~')
     {
       char *dname = type_name_no_tag (type);
@@ -2539,14 +2507,6 @@ check_field (struct type *type, const char *name)
   /* C++: If it was not found as a data field, then try to return it
      as a pointer to a method.  */
 
-  /* Destructors are a special case.  */
-  if (destructor_name_p (name, type))
-    {
-      int m_index, f_index;
-
-      return get_destructor_fn_field (type, &m_index, &f_index);
-    }
-
   for (i = TYPE_NFN_FIELDS (type) - 1; i >= 0; --i)
     {
       if (strcmp_iw (TYPE_FN_FIELDLIST_NAME (type, i), name) == 0)
@@ -2642,12 +2602,6 @@ value_struct_elt_for_reference (struct type *domain, int offset,
   /* C++: If it was not found as a data field, then try to return it
      as a pointer to a method.  */
 
-  /* Destructors are a special case.  */
-  if (destructor_name_p (name, t))
-    {
-      error (_("member pointers to destructors not implemented yet"));
-    }
-
   /* Perform all necessary dereferencing.  */
   while (intype && TYPE_CODE (intype) == TYPE_CODE_PTR)
     intype = TYPE_TARGET_TYPE (intype);