[PR86648] use auto identifier for class placeholder templates

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...>.

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.

From-SVN: r268005
This commit is contained in:
Alexandre Oliva 2019-01-17 07:32:16 +00:00 committed by Alexandre Oliva
parent b25a375649
commit 33f746e558
6 changed files with 31 additions and 4 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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

View File

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

View File

@ -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

View File

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