diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 35 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/temargs.cc | 23 |
4 files changed, 62 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f4a50e1..1e2f0eb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2019-04-30 Tom Tromey <tromey@adacore.com> + + PR c++/24470: + * dwarf2read.c (process_structure_scope): Handle case where type + has template parameters but no symbol was created. + 2019-04-30 Andrew Burgess <andrew.burgess@embecosm.com> Chris January <chris.january@arm.com> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 571fe1e..751c59c3 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -16212,13 +16212,34 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) if (has_template_parameters) { - /* Make sure that the symtab is set on the new symbols. - Even though they don't appear in this symtab directly, - other parts of gdb assume that symbols do, and this is - reasonably true. */ - for (int i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (type); ++i) - symbol_set_symtab (TYPE_TEMPLATE_ARGUMENT (type, i), - symbol_symtab (sym)); + struct symtab *symtab; + if (sym != nullptr) + symtab = symbol_symtab (sym); + else if (cu->line_header != nullptr) + { + /* Any related symtab will do. */ + symtab + = cu->line_header->file_name_at (file_name_index (1))->symtab; + } + else + { + symtab = nullptr; + complaint (_("could not find suitable " + "symtab for template parameter" + " - DIE at %s [in module %s]"), + sect_offset_str (die->sect_off), + objfile_name (objfile)); + } + + if (symtab != nullptr) + { + /* Make sure that the symtab is set on the new symbols. + Even though they don't appear in this symtab directly, + other parts of gdb assume that symbols do, and this is + reasonably true. */ + for (int i = 0; i < TYPE_N_TEMPLATE_ARGUMENTS (type); ++i) + symbol_set_symtab (TYPE_TEMPLATE_ARGUMENT (type, i), symtab); + } } } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d3be74d..41aae07 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-30 Tom Tromey <tromey@adacore.com> + + PR c++/24470: + * gdb.cp/temargs.cc: Add test code from PR. + 2019-04-30 Andrew Burgess <andrew.burgess@embecosm.com> * gdb.fortran/vla-datatypes.exp: Update expected results. diff --git a/gdb/testsuite/gdb.cp/temargs.cc b/gdb/testsuite/gdb.cp/temargs.cc index dc06165..d2a85f9 100644 --- a/gdb/testsuite/gdb.cp/temargs.cc +++ b/gdb/testsuite/gdb.cp/temargs.cc @@ -80,6 +80,29 @@ struct K3 } }; +namespace pr24470 +{ +// From PR c++/24470 +// This caused a gdb crash during startup. + +template <int a> struct b {}; +template <typename, typename> struct c { + template <long d> using e = b<d>; + void k(e<0>); +}; +template <typename, template <typename, typename> class, unsigned long...> +struct m; +template <typename g, template <typename, typename> class h, unsigned long i> +struct m<g, h, i> { + using j = b<i>; +}; +struct n { + template <typename g> using f = typename m<g, c, 0>::j; +}; + +n::f<int> l; +} + int main () { Base<double, 23, &a_global, &S::f> base; |