[PR c++/839888] Baselink tsubst ICE
authorNathan Sidwell <nathan@acm.org>
Tue, 23 Jan 2018 14:08:11 +0000 (14:08 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 23 Jan 2018 14:08:11 +0000 (14:08 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-01/msg01954.html
PR c++/83988
* pt.c (tsubst_baselink): Remove optype assert.
* ptree.c (cxx_print_xnode): <case BASELINK> Print BASELINK_OPTYPE.

PR c++/83988
* g++.dg/template/pr83988.C: New.

From-SVN: r256986

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/cp/ptree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr83988.C [new file with mode: 0644]

index 5adf93075d5221ac7a0a9dbfe16da5ff8d86aa51..97c54ac9a0036e641b168167f028433c9dd828ac 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-23  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/83988
+       * pt.c (tsubst_baselink): Remove optype assert.
+       * ptree.c (cxx_print_xnode): <case BASELINK> Print BASELINK_OPTYPE.
+
 2018-01-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/83958
index 0296845a31bf092e5c1534431a70558cde430674..695870da32cd0a55e189e45dc48edbf4e1f95fb2 100644 (file)
@@ -14447,11 +14447,8 @@ tsubst_baselink (tree baselink, tree object_type,
        fns = BASELINK_FUNCTIONS (baselink);
     }
   else
-    {
-      gcc_assert (optype == BASELINK_OPTYPE (baselink));
-      /* We're going to overwrite pieces below, make a duplicate.  */
-      baselink = copy_node (baselink);
-    }
+    /* We're going to overwrite pieces below, make a duplicate.  */
+    baselink = copy_node (baselink);
 
   /* If lookup found a single function, mark it as used at this point.
      (If lookup found multiple functions the one selected later by
index 8e7697a012d98db24e8c8d5637c69e56740536ae..40535c7c06abde09735a0f0044f2dbd5566a6367 100644 (file)
@@ -215,6 +215,7 @@ cxx_print_xnode (FILE *file, tree node, int indent)
       print_node (file, "binfo", BASELINK_BINFO (node), indent + 4);
       print_node (file, "access_binfo", BASELINK_ACCESS_BINFO (node),
                  indent + 4);
+      print_node (file, "optype", BASELINK_OPTYPE (node), indent + 4);
       break;
     case OVERLOAD:
       print_node (file, "function", OVL_FUNCTION (node), indent+4);
index 5c1d57f7ed246ce0d6348f93c363bdcb4acd64af..17399f97a8004720e763c460dae97bac814d188e 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-23  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/83988
+       * g++.dg/template/pr83988.C: New.
+
 2018-01-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/82882
diff --git a/gcc/testsuite/g++.dg/template/pr83988.C b/gcc/testsuite/g++.dg/template/pr83988.C
new file mode 100644 (file)
index 0000000..bd2762c
--- /dev/null
@@ -0,0 +1,16 @@
+// PR 83988 ICE
+
+template<class T> struct optional {};
+struct get_from_json {
+  template<typename GetWhat>
+  operator optional<GetWhat>() const {return optional<GetWhat> ();}
+  template<typename AsWhat>
+  optional<AsWhat> maybe() const
+  {
+    return this->operator optional<AsWhat>();
+  }
+};
+void test()
+{
+  get_from_json().maybe<int>();
+}