* 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.
2010-09-08 Daniel Jacobowitz <dan@codesourcery.com>
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>
+
* gnu-v3-abi.c (gnuv3_print_method_ptr): Do not use
the domain type.
(gnuv3_make_method_ptr): Likewise.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Do not use
the domain type.
(gnuv3_make_method_ptr): Likewise.
}
/* 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
- structure or union.
+ (definition) to create a type for the structure or union. Fill in
+ 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
- DIE has an at_name attribute, since it might be an anonymous
+ NOTE: we need to call these functions regardless of whether or not the
+ 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
user defined types.
structure or union. This gets the type entered into our set of
user defined types.
struct type *type;
struct attribute *attr;
char *name;
struct type *type;
struct attribute *attr;
char *name;
- struct cleanup *back_to;
/* 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
/* 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
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);
INIT_CPLUS_SPECIFIC (type);
type = alloc_type (objfile);
INIT_CPLUS_SPECIFIC (type);
/* set_die_type should be already done. */
set_descriptive_type (type, die, cu);
/* set_die_type should be already done. */
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))
{
struct field_info fi;
struct die_info *child_die;
VEC (symbolp) *template_args = NULL;
if (die->child != NULL && ! die_is_declaration (die, cu))
{
struct field_info fi;
struct die_info *child_die;
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));
+
+ 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
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
/* 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
for a class that has, as a child, a die giving a definition for a
attribute, and a declaration attribute. */
if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
|| !die_is_declaration (die, cu))
attribute, and a declaration attribute. */
if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
|| !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
+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>
* gdb.threads/threxit-hop-specific.exp: Use "continue" instead
2010-09-08 Ulrich Weigand <uweigand@de.ibm.com>
* gdb.threads/threxit-hop-specific.exp: Use "continue" instead
+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;
-
-
-
-
-
-
-
-
-
-
-
-
-
"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 {} {
global subdir
global objdir
proc do_tests {} {
global subdir
global objdir
test_ptype_of_templates
test_template_breakpoints
test_template_typedef
test_ptype_of_templates
test_template_breakpoints
test_template_typedef
if [ runto_main] {
test_template_calls
if [ runto_main] {
test_template_calls