From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 46542 invoked by alias); 28 Dec 2018 19:45:31 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 46533 invoked by uid 89); 28 Dec 2018 19:45:31 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=dropping, losing, Drop X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 28 Dec 2018 19:45:29 +0000 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BDEFE8666B; Fri, 28 Dec 2018 19:45:27 +0000 (UTC) Received: from free.home (ovpn04.gateway.prod.ext.phx2.redhat.com [10.5.9.4]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B1D405D738; Fri, 28 Dec 2018 19:45:26 +0000 (UTC) Received: from libre (free-to-gw.home [172.31.160.161]) by free.home (8.15.2/8.15.2) with ESMTP id wBSJj7PK458822; Fri, 28 Dec 2018 17:45:10 -0200 From: Alexandre Oliva To: gcc-patches@gcc.gnu.org Cc: jason@redhat.com, nathan@acm.org Subject: [C++ PATCH] [PR86648] use auto identifier for class placeholder templates Date: Sat, 29 Dec 2018 00:07:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-SW-Source: 2018-12/txt/msg01743.txt.bz2 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) =20 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)))) + { + t =3D 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 f9b0b9987174..e2f039d1f09e 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -546,6 +546,14 @@ dump_type (cxx_pretty_printer *pp, tree t, int flags) pp_cxx_cv_qualifier_seq (pp, t); if (tree c =3D PLACEHOLDER_TYPE_CONSTRAINTS (t)) pp_cxx_constrained_type_spec (pp, c); + else if (template_placeholder_p (t) + && DECL_P (CLASS_PLACEHOLDER_TEMPLATE (t)) + && TYPE_IDENTIFIER (TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t)))) + { + t =3D 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 18b093e7d2d2..04bf4cd238e9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -26433,7 +26433,7 @@ make_auto (void) tree make_template_placeholder (tree tmpl) { - tree t =3D make_auto_1 (DECL_NAME (tmpl), true); + tree t =3D make_auto_1 (auto_identifier, true); CLASS_PLACEHOLDER_TEMPLATE (t) =3D tmpl; return t; } @@ -27364,8 +27364,7 @@ is_auto (const_tree type) { if (TREE_CODE (type) =3D=3D TEMPLATE_TYPE_PARM && (TYPE_IDENTIFIER (type) =3D=3D auto_identifier - || TYPE_IDENTIFIER (type) =3D=3D decltype_auto_identifier - || CLASS_PLACEHOLDER_TEMPLATE (type))) + || TYPE_IDENTIFIER (type) =3D=3D decltype_auto_identifier)) return true; else return false; diff --git a/gcc/testsuite/g++.dg/cpp1z/pr86648.C b/gcc/testsuite/g++.dg/cp= p1z/pr86648.C new file mode 100644 index 000000000000..20ee4c8c0d44 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/pr86648.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++17 } } + +template class A; +template struct B { static A a{T::a}; }; +void foo () { B a; } --=20 Alexandre Oliva, freedom fighter https://FSFLA.org/blogs/lxo Be the change, be Free! FSF Latin America board member GNU Toolchain Engineer Free Software Evangelist Hay que enGNUrecerse, pero sin perder la terGNUra jam=C3=A1s-GNUChe