diff options
author | Nathan Sidwell <nathan@acm.org> | 2018-01-23 14:08:11 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2018-01-23 14:08:11 +0000 |
commit | 66ce8ff7603b3b717fff93d706b1cf3548ba4671 (patch) | |
tree | 310b045403587d2a1e1ccee5d2ab0a632cf14517 | |
parent | 55a46cb54a7ebabd298e7f574993bb73f879758c (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/cp/ptree.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr83988.C | 16 |
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>(); +} |