aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-01-23 14:08:11 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-01-23 14:08:11 +0000
commit66ce8ff7603b3b717fff93d706b1cf3548ba4671 (patch)
tree310b045403587d2a1e1ccee5d2ab0a632cf14517
parent55a46cb54a7ebabd298e7f574993bb73f879758c (diff)
downloadgcc-66ce8ff7603b3b717fff93d706b1cf3548ba4671.zip
gcc-66ce8ff7603b3b717fff93d706b1cf3548ba4671.tar.gz
gcc-66ce8ff7603b3b717fff93d706b1cf3548ba4671.tar.bz2
[PR c++/839888] Baselink tsubst ICE
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/cp/ptree.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr83988.C16
5 files changed, 30 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5adf930..97c54ac 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 0296845..695870d 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c
index 8e7697a..40535c7 100644
--- a/gcc/cp/ptree.c
+++ b/gcc/cp/ptree.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5c1d57f..17399f9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..bd2762c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr83988.C
@@ -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>();
+}