[C++ PATCH] [PR86648] use auto identifier for class placeholder templates
Jason Merrill
jason@redhat.com
Tue Jan 8 20:56:00 GMT 2019
On 12/28/18 2:45 PM, Alexandre Oliva wrote:
>
> dwarf2out recognizes unspecified auto types by the identifier. C++
> template class placeholders are unspecified auto types that take the
> identifier of the class rather than those used by preexisting auto
> types, so dwarf2out ICEs when it finds one of those. Alas, they may
> be visible to dwarf2out, since the types of e.g. static data members
> of templates are only deduced at member instantiation, i.e., if the
> data member is actually referenced, but the data member is added as a
> field, still with unspecified auto placeholder type, when the
> enclosing class is instantiated.
>
> I've changed placeholder creator to use an auto identifier instead,
> which allowed dropping the placeholder test in C++'s is_auto (alas, it
> can't be used in dwarf2out, think LTO). To avoid losing information
> in error messages and dumps and whatnot, I've added code to recognize
> placeholders for template classes say A and print them out as
> A<...auto...>.
>
> Regstrapped on x86_64- and i686-linux-gnu. Ok to install?
>
>
> for gcc/cp/ChangeLog
>
> 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.
>
> for gcc/testsuite/ChangeLog
>
> PR c++/86648
> * gcc.dg/cpp1z/pr86648.C: New.
>
> ---
> gcc/cp/cxx-pretty-print.c | 10 +++++++++-
> gcc/cp/error.c | 8 ++++++++
> gcc/cp/pt.c | 5 ++---
> gcc/testsuite/g++.dg/cpp1z/pr86648.C | 5 +++++
> 4 files changed, 24 insertions(+), 4 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/cpp1z/pr86648.C
>
> diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
> index b79ff5137aa1..c173760f0425 100644
> --- a/gcc/cp/cxx-pretty-print.c
> +++ b/gcc/cp/cxx-pretty-print.c
> @@ -187,7 +187,15 @@ 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)
> + && DECL_P (CLASS_PLACEHOLDER_TEMPLATE (t))
> + && TYPE_IDENTIFIER (TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t))))
Are these extra checks needed? I would expect them to be true whenever
template_placeholder_p is.
Jason
More information about the Gcc-patches
mailing list