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; }