From: Nathan Sidwell Date: Thu, 1 Mar 2018 22:08:02 +0000 (+0000) Subject: [PR c++/84434] ICE with deduction guide X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=303f4850651051e7c7ae04851d993246f6110fb6;p=gcc.git [PR c++/84434] ICE with deduction guide https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00063.html PR c++/84434 * name-lookup.c (member_vec_dedup): Remove manually peeled iteration. Ignore dependent ctor inheritance. PR c++/84434 * g++.dg/template/pr84434.C: New. From-SVN: r258114 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index df5f48c845b..4cb531038b2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-01 Nathan Sidwell + + PR c++/84434 + * name-lookup.c (member_vec_dedup): Remove manually peeled + iteration. Ignore dependent ctor inheritance. + 2018-03-01 Jason Merrill PR c++/71569 - decltype of template. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 20db0f427da..2773cf4d878 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -1591,68 +1591,58 @@ member_vec_dedup (vec *member_vec) if (!len) return; - tree current = (*member_vec)[0], name = OVL_NAME (current); - tree next = NULL_TREE, next_name = NULL_TREE; - for (unsigned jx, ix = 0; ix < len; - ix = jx, current = next, name = next_name) + tree name = OVL_NAME ((*member_vec)[0]); + for (unsigned jx, ix = 0; ix < len; ix = jx) { + tree current = NULL_TREE; tree to_type = NULL_TREE; tree to_using = NULL_TREE; tree marker = NULL_TREE; - if (IDENTIFIER_CONV_OP_P (name)) - { - marker = current; - current = OVL_CHAIN (current); - name = DECL_NAME (OVL_FUNCTION (marker)); - gcc_checking_assert (name == conv_op_identifier); - } - if (TREE_CODE (current) == USING_DECL) + for (jx = ix; jx < len; jx++) { - current = strip_using_decl (current); - if (is_overloaded_fn (current)) - current = NULL_TREE; - else if (TREE_CODE (current) == USING_DECL) + tree next = (*member_vec)[jx]; + if (jx != ix) { - to_using = current; - current = NULL_TREE; + tree next_name = OVL_NAME (next); + if (next_name != name) + { + name = next_name; + break; + } } - } - if (current && DECL_DECLARES_TYPE_P (current)) - { - to_type = current; - current = NULL_TREE; - } - - for (jx = ix + 1; jx < len; jx++) - { - next = (*member_vec)[jx]; - next_name = OVL_NAME (next); - if (next_name != name) - break; - - if (marker) + if (IDENTIFIER_CONV_OP_P (name)) { - gcc_checking_assert (OVL_FUNCTION (marker) - == OVL_FUNCTION (next)); + marker = next; next = OVL_CHAIN (next); } if (TREE_CODE (next) == USING_DECL) { + if (IDENTIFIER_CTOR_P (name)) + /* Dependent inherited ctor. */ + continue; + next = strip_using_decl (next); - if (is_overloaded_fn (next)) - next = NULL_TREE; - else if (TREE_CODE (next) == USING_DECL) + if (TREE_CODE (next) == USING_DECL) { to_using = next; - next = NULL_TREE; + continue; } + + if (is_overloaded_fn (next)) + continue; } - if (next && DECL_DECLARES_TYPE_P (next)) - to_type = next; + if (DECL_DECLARES_TYPE_P (next)) + { + to_type = next; + continue; + } + + if (!current) + current = next; } if (to_using) @@ -1671,13 +1661,15 @@ member_vec_dedup (vec *member_vec) current = stat_hack (current, to_type); } - gcc_assert (current); - if (marker) + if (current) { - OVL_CHAIN (marker) = current; - current = marker; + if (marker) + { + OVL_CHAIN (marker) = current; + current = marker; + } + (*member_vec)[store++] = current; } - (*member_vec)[store++] = current; } while (store++ < len) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 38bd3aeb5e2..90b53ae2584 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-01 Nathan Sidwell + + PR c++/84434 + * g++.dg/template/pr84434.C: New. + 2018-03-01 Thomas Preud'homme class B { +public: + template B (U) {} +}; + +template +struct scope_guard : B { + using base_type = B; + + using base_type::base_type; + + ~scope_guard() = default; +}; + +template +scope_guard (T) -> scope_guard; + +void Frob () { + scope_guard (1); +}