diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 302a0f493a4..c3656d2ca3c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2018-07-20  Tom Tromey  <tom@tromey.com>
+
+	PR symtab/16842.
+	* dwarf2read.c (read_func_scope): Set symtab on template parameter
+	symbols.
+	(process_structure_scope): Likewise.
+
 2018-07-19  Pedro Alves  <palves@redhat.com>
 
 	* guile/guile-internal.h (gdbscm_scm_to_c_string): Now returns a
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index b7933de49cf..8f5fb597161 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -13714,6 +13714,13 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
       memcpy (templ_func->template_arguments,
 	      template_args.data (),
 	      (templ_func->n_template_arguments * sizeof (struct symbol *)));
+
+      /* 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 (struct symbol *sym : template_args)
+	symbol_set_symtab (sym, symbol_symtab (templ_func));
     }
 
   /* In C++, we can have functions nested inside functions (e.g., when
@@ -15832,6 +15839,7 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
      discriminant_info.  */
   bool is_variant_part = TYPE_FLAG_DISCRIMINATED_UNION (type);
   sect_offset discr_offset;
+  bool has_template_parameters = false;
 
   if (is_variant_part)
     {
@@ -15879,6 +15887,7 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
       /* Attach template arguments to type.  */
       if (!template_args.empty ())
 	{
+	  has_template_parameters = true;
 	  ALLOCATE_CPLUS_STRUCT_TYPE (type);
 	  TYPE_N_TEMPLATE_ARGUMENTS (type) = template_args.size ();
 	  TYPE_TEMPLATE_ARGUMENTS (type)
@@ -16028,7 +16037,20 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
      attribute, and a declaration attribute.  */
   if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
       || !die_is_declaration (die, cu))
-    new_symbol (die, type, cu);
+    {
+      struct symbol *sym = new_symbol (die, type, 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));
+	}
+    }
 }
 
 /* Assuming DIE is an enumeration type, and TYPE is its associated type,
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 79ef76faf76..7039518ac3d 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-20  Tom Tromey  <tom@tromey.com>
+
+	PR symtab/16842.
+	* gdb.cp/temargs.exp: Test "info address" of a template
+	parameter.
+
 2018-07-19  Tom de Vries  <tdevries@suse.de>
 
 	* gdb.mi/list-thread-groups-available.exp (cores_re): Fix quoting in
diff --git a/gdb/testsuite/gdb.cp/temargs.exp b/gdb/testsuite/gdb.cp/temargs.exp
index 8c87872225e..5a109102d75 100644
--- a/gdb/testsuite/gdb.cp/temargs.exp
+++ b/gdb/testsuite/gdb.cp/temargs.exp
@@ -133,6 +133,10 @@ gdb_test "ptype T" "unsigned char" "test type of T in func"
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print I" " = 91" "test value of I in func"
 
+# PR symtab/16842 - gdb used to crash here.
+if $have_older_template_gcc { setup_xfail "*-*-*" }
+gdb_test "info addr I" "Symbol \"I\" is constant." "test address of I in templ_m"
+
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print P == &a_global" " = true" "test value of P in func"
 
@@ -151,6 +155,10 @@ gdb_test "ptype T" "double" "test type of T in templ_m"
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print I" " = 23" "test value of I in templ_m"
 
+# PR symtab/16842 - gdb used to crash here.
+if $have_older_template_gcc { setup_xfail "*-*-*" }
+gdb_test "info addr I" "Symbol \"I\" is constant." "test address of I in templ_m"
+
 if $have_older_template_gcc { setup_xfail "*-*-*" }
 gdb_test "print P == &a_global" " = true" "test value of P in templ_m"
 
