From 19ef5c713c0116f2e15fea28168614d7894b613a Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Tue, 16 Jun 2009 18:39:41 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/gdbtypes.c | 28 ---------------------------- gdb/gdbtypes.h | 2 -- gdb/linespec.c | 46 +++++----------------------------------------- gdb/valops.c | 46 ---------------------------------------------- 5 files changed, 20 insertions(+), 117 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 812b83e4641..1cc0cb287e8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2009-06-16 Keith Seitz + + * 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 * mi/mi-main.c (mi_cmd_data_read_memory): Dispatch diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index f415773dfcc..63f2e357263 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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) { diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index fc54acc4ccf..522d26f77a2 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -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 *); diff --git a/gdb/linespec.c b/gdb/linespec.c index 3d0ceed84c8..9c101560a10 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -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; -} - /* Return the symtab associated to the filename given by the substring diff --git a/gdb/valops.c b/gdb/valops.c index 5907d96116c..5530f553b9f 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -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); -- 2.30.2