[PR86648] use auto identifier for class placeholder templates
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 17 Jan 2019 07:32:16 +0000 (07:32 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 17 Jan 2019 07:32:16 +0000 (07:32 +0000)
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

gcc/cp/ChangeLog
gcc/cp/cxx-pretty-print.c
gcc/cp/error.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1z/pr86648.C [new file with mode: 0644]

index 732aa53d04855f95a30c6d1ea4f158d8d1645088..73f1b76e5ff4dfb1be2cf3ecaf7dd240b04a9830 100644 (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.
index 47eebd1729a3233c0dcd0cfb73e157acf3163e4e..a114d6654e9129971b6d6784c63ab7927747508b 100644 (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);
index 36772132883424de25351a99e442486ad8a14e91..f585d5fe58fe9ce03329f70aea8bc579da84c222 100644 (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
index 83bceb26474226e374cb544f6e51a867eac94d17..e4f76478f543c4987063512f6934cdddf35102d3 100644 (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;
index cd20207333ac06977a95180ba52f7b61a4cdc250..3ce3da7940db0c68952aca55d82344a9c33959c5 100644 (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
diff --git a/gcc/testsuite/g++.dg/cpp1z/pr86648.C b/gcc/testsuite/g++.dg/cpp1z/pr86648.C
new file mode 100644 (file)
index 0000000..20ee4c8
--- /dev/null
@@ -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; }