[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