* dwarf2read.c (read_structure_type): Move processing of
	fields and member functions from here...
	(process_structure_scope): ... to here.

	gdb/testsuite/
	* gdb.cp/templates.cc (Empty, FunctionArg): New classes.
	(FunctionArg::method): New function.
	(empty, arg): New variables.
	(main): Call arg.method.
	* gdb.cp/templates.exp (test_template_args): New function.
	(do_tests): Call it.
This commit is contained in:
Daniel Jacobowitz 2010-09-08 19:09:43 +00:00
parent 561d38252c
commit c767944bf2
5 changed files with 71 additions and 35 deletions

View File

@ -1,3 +1,9 @@
2010-09-08 Daniel Jacobowitz <dan@codesourcery.com>
* dwarf2read.c (read_structure_type): Move processing of
fields and member functions from here...
(process_structure_scope): ... to here.
2010-09-08 Daniel Jacobowitz <dan@codesourcery.com> 2010-09-08 Daniel Jacobowitz <dan@codesourcery.com>
* gnu-v3-abi.c (gnuv3_print_method_ptr): Do not use * gnu-v3-abi.c (gnuv3_print_method_ptr): Do not use

View File

@ -6643,11 +6643,12 @@ quirk_gcc_member_function_pointer (struct type *type, struct objfile *objfile)
} }
/* Called when we find the DIE that starts a structure or union scope /* Called when we find the DIE that starts a structure or union scope
(definition) to process all dies that define the members of the (definition) to create a type for the structure or union. Fill in
structure or union. the type's name and general properties; the members will not be
processed until process_structure_type.
NOTE: we need to call struct_type regardless of whether or not the NOTE: we need to call these functions regardless of whether or not the
DIE has an at_name attribute, since it might be an anonymous DIE has a DW_AT_name attribute, since it might be an anonymous
structure or union. This gets the type entered into our set of structure or union. This gets the type entered into our set of
user defined types. user defined types.
@ -6665,7 +6666,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
struct type *type; struct type *type;
struct attribute *attr; struct attribute *attr;
char *name; char *name;
struct cleanup *back_to;
/* If the definition of this type lives in .debug_types, read that type. /* If the definition of this type lives in .debug_types, read that type.
Don't follow DW_AT_specification though, that will take us back up Don't follow DW_AT_specification though, that will take us back up
@ -6687,8 +6687,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
return set_die_type (die, type, cu); return set_die_type (die, type, cu);
} }
back_to = make_cleanup (null_cleanup, 0);
type = alloc_type (objfile); type = alloc_type (objfile);
INIT_CPLUS_SPECIFIC (type); INIT_CPLUS_SPECIFIC (type);
@ -6763,11 +6761,29 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
/* set_die_type should be already done. */ /* set_die_type should be already done. */
set_descriptive_type (type, die, cu); set_descriptive_type (type, die, cu);
return type;
}
/* Finish creating a structure or union type, including filling in
its members and creating a symbol for it. */
static void
process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
{
struct objfile *objfile = cu->objfile;
struct die_info *child_die = die->child;
struct type *type;
type = get_die_type (die, cu);
if (type == NULL)
type = read_structure_type (die, cu);
if (die->child != NULL && ! die_is_declaration (die, cu)) if (die->child != NULL && ! die_is_declaration (die, cu))
{ {
struct field_info fi; struct field_info fi;
struct die_info *child_die; struct die_info *child_die;
VEC (symbolp) *template_args = NULL; VEC (symbolp) *template_args = NULL;
struct cleanup *back_to = make_cleanup (null_cleanup, 0);
memset (&fi, 0, sizeof (struct field_info)); memset (&fi, 0, sizeof (struct field_info));
@ -6918,24 +6934,12 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
*dest = *src; *dest = *src;
} }
} }
do_cleanups (back_to);
} }
quirk_gcc_member_function_pointer (type, cu->objfile); quirk_gcc_member_function_pointer (type, cu->objfile);
do_cleanups (back_to);
return type;
}
static void
process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
{
struct die_info *child_die = die->child;
struct type *this_type;
this_type = get_die_type (die, cu);
if (this_type == NULL)
this_type = read_structure_type (die, cu);
/* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its /* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its
snapshots) has been known to create a die giving a declaration snapshots) has been known to create a die giving a declaration
for a class that has, as a child, a die giving a definition for a for a class that has, as a child, a die giving a definition for a
@ -6964,7 +6968,7 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
attribute, and a declaration attribute. */ attribute, and a declaration attribute. */
if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
|| !die_is_declaration (die, cu)) || !die_is_declaration (die, cu))
new_symbol (die, this_type, cu); new_symbol (die, type, cu);
} }
/* Given a DW_AT_enumeration_type die, set its type. We do not /* Given a DW_AT_enumeration_type die, set its type. We do not

View File

@ -1,3 +1,12 @@
2010-09-08 Daniel Jacobowitz <dan@codesourcery.com>
* gdb.cp/templates.cc (Empty, FunctionArg): New classes.
(FunctionArg::method): New function.
(empty, arg): New variables.
(main): Call arg.method.
* gdb.cp/templates.exp (test_template_args): New function.
(do_tests): Call it.
2010-09-08 Ulrich Weigand <uweigand@de.ibm.com> 2010-09-08 Ulrich Weigand <uweigand@de.ibm.com>
* gdb.threads/threxit-hop-specific.exp: Use "continue" instead * gdb.threads/threxit-hop-specific.exp: Use "continue" instead

View File

@ -712,6 +712,23 @@ template<class T> T Garply<T>::garply (int i, T tt)
} }
} }
template<class C> class Empty
{
};
template<class C> class FunctionArg
{
public:
int method(Empty<void (FunctionArg<C>)> &);
};
template<class C> int FunctionArg<C>::method(Empty<void (FunctionArg<C>)> &arg)
{
return 75;
}
Empty<void(FunctionArg<int>)> empty;
FunctionArg<int> arg;
int main() int main()
{ {
@ -785,18 +802,7 @@ int main()
t5i.value(); t5i.value();
arg.method(empty);
return 0; return 0;
} }

View File

@ -196,6 +196,16 @@ proc test_template_typedef {} {
"print destructor of template typedef" "print destructor of template typedef"
} }
proc test_template_args {} {
set empty_re "Empty *<void *\\(FunctionArg *<int>\\)>"
gdb_test "ptype empty" \
"type = class $empty_re {.*<no data fields>.*}"
gdb_test "ptype arg" \
"type = class FunctionArg<int> {.*int method\\($empty_re \\&\\);.*}"
}
proc do_tests {} { proc do_tests {} {
global subdir global subdir
global objdir global objdir
@ -220,6 +230,7 @@ proc do_tests {} {
test_ptype_of_templates test_ptype_of_templates
test_template_breakpoints test_template_breakpoints
test_template_typedef test_template_typedef
test_template_args
if [ runto_main] { if [ runto_main] {
test_template_calls test_template_calls