diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 732aa53..73f1b76 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
 2019-01-17  Alexandre Oliva <aoliva@redhat.com>
 
+	PR c++/86648
+	* pt.c (make_template_placeholder): Use auto_identifier.
+	(is_auto): Drop CLASS_PLACEHOLDER_TEMPLATE test.
+	* error.c (dump_type): Handle template placeholders.
+	* cxx-pretty-print.c (pp_cx_unqualified_id): Likewise.
+
 	PR c++/88146
 	* cvt.c (convert_to_void): Handle all cdtor calls as if
 	returning void.
diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
index 47eebd1..a114d66 100644
--- a/gcc/cp/cxx-pretty-print.c
+++ b/gcc/cp/cxx-pretty-print.c
@@ -187,7 +187,13 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
 
     case TEMPLATE_TYPE_PARM:
     case TEMPLATE_TEMPLATE_PARM:
-      if (TYPE_IDENTIFIER (t))
+      if (template_placeholder_p (t))
+	{
+	  t = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
+	  pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
+	  pp_string (pp, "<...auto...>");
+	}
+      else if (TYPE_IDENTIFIER (t))
 	pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
       else
 	pp_cxx_canonical_template_parameter (pp, t);
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 3677213..f585d5f 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -546,6 +546,12 @@ dump_type (cxx_pretty_printer *pp, tree t, int flags)
       pp_cxx_cv_qualifier_seq (pp, t);
       if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
 	pp_cxx_constrained_type_spec (pp, c);
+      else if (template_placeholder_p (t))
+	{
+	  t = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
+	  pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
+	  pp_string (pp, "<...auto...>");
+	}
       else if (TYPE_IDENTIFIER (t))
 	pp_cxx_tree_identifier (pp, TYPE_IDENTIFIER (t));
       else
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 83bceb2..e4f7647 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -26458,7 +26458,7 @@ make_auto (void)
 tree
 make_template_placeholder (tree tmpl)
 {
-  tree t = make_auto_1 (DECL_NAME (tmpl), true);
+  tree t = make_auto_1 (auto_identifier, true);
   CLASS_PLACEHOLDER_TEMPLATE (t) = tmpl;
   return t;
 }
@@ -27391,8 +27391,7 @@ is_auto (const_tree type)
 {
   if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
       && (TYPE_IDENTIFIER (type) == auto_identifier
-	  || TYPE_IDENTIFIER (type) == decltype_auto_identifier
-	  || CLASS_PLACEHOLDER_TEMPLATE (type)))
+	  || TYPE_IDENTIFIER (type) == decltype_auto_identifier))
     return true;
   else
     return false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cd20207..3ce3da7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-01-17  Alexandre Oliva <aoliva@redhat.com>
+
+	PR c++/86648
+	* gcc.dg/cpp1z/pr86648.C: New.
+
 2019-01-17  Kewen Lin  <linkw@gcc.gnu.org>
 
 	PR target/87306
diff --git a/gcc/testsuite/g++.dg/cpp1z/pr86648.C b/gcc/testsuite/g++.dg/cpp1z/pr86648.C
new file mode 100644
index 0000000..20ee4c8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/pr86648.C
@@ -0,0 +1,5 @@
+// { dg-do compile { target c++17 } }
+
+template <typename> class A;
+template <class T> struct B { static A a{T::a}; };
+void foo () { B<int> a; }