Commit 774ae645 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/83825 (ICE on invalid C++ code with shadowed identifiers: in operator[], at vec.h:826)

	PR c++/83825
	* name-lookup.c (member_vec_dedup): Return early if len is 0.
	(resort_type_member_vec, set_class_bindings,
	insert_late_enum_def_bindings): Use vec qsort method instead of
	calling qsort directly.

	* g++.dg/template/pr83825.C: New test.

From-SVN: r256725
parent 206c8300
2018-01-16 Jakub Jelinek <jakub@redhat.com>
PR c++/83825
* name-lookup.c (member_vec_dedup): Return early if len is 0.
(resort_type_member_vec, set_class_bindings,
insert_late_enum_def_bindings): Use vec qsort method instead of
calling qsort directly.
2018-01-15 Martin Sebor <msebor@redhat.com> 2018-01-15 Martin Sebor <msebor@redhat.com>
PR c++/83588 PR c++/83588
......
...@@ -1520,8 +1520,7 @@ resort_type_member_vec (void *obj, void */*orig_obj*/, ...@@ -1520,8 +1520,7 @@ resort_type_member_vec (void *obj, void */*orig_obj*/,
{ {
resort_data.new_value = new_value; resort_data.new_value = new_value;
resort_data.cookie = cookie; resort_data.cookie = cookie;
qsort (member_vec->address (), member_vec->length (), member_vec->qsort (resort_member_name_cmp);
sizeof (tree), resort_member_name_cmp);
} }
} }
...@@ -1597,6 +1596,9 @@ member_vec_dedup (vec<tree, va_gc> *member_vec) ...@@ -1597,6 +1596,9 @@ member_vec_dedup (vec<tree, va_gc> *member_vec)
unsigned len = member_vec->length (); unsigned len = member_vec->length ();
unsigned store = 0; unsigned store = 0;
if (!len)
return;
tree current = (*member_vec)[0], name = OVL_NAME (current); tree current = (*member_vec)[0], name = OVL_NAME (current);
tree next = NULL_TREE, next_name = NULL_TREE; tree next = NULL_TREE, next_name = NULL_TREE;
for (unsigned jx, ix = 0; ix < len; for (unsigned jx, ix = 0; ix < len;
...@@ -1712,8 +1714,7 @@ set_class_bindings (tree klass, unsigned extra) ...@@ -1712,8 +1714,7 @@ set_class_bindings (tree klass, unsigned extra)
if (member_vec) if (member_vec)
{ {
CLASSTYPE_MEMBER_VEC (klass) = member_vec; CLASSTYPE_MEMBER_VEC (klass) = member_vec;
qsort (member_vec->address (), member_vec->length (), member_vec->qsort (member_name_cmp);
sizeof (tree), member_name_cmp);
member_vec_dedup (member_vec); member_vec_dedup (member_vec);
} }
} }
...@@ -1741,8 +1742,7 @@ insert_late_enum_def_bindings (tree klass, tree enumtype) ...@@ -1741,8 +1742,7 @@ insert_late_enum_def_bindings (tree klass, tree enumtype)
else else
member_vec_append_class_fields (member_vec, klass); member_vec_append_class_fields (member_vec, klass);
CLASSTYPE_MEMBER_VEC (klass) = member_vec; CLASSTYPE_MEMBER_VEC (klass) = member_vec;
qsort (member_vec->address (), member_vec->length (), member_vec->qsort (member_name_cmp);
sizeof (tree), member_name_cmp);
member_vec_dedup (member_vec); member_vec_dedup (member_vec);
} }
} }
......
2018-01-16 Jakub Jelinek <jakub@redhat.com>
PR c++/83825
* g++.dg/template/pr83825.C: New test.
2018-01-16 Richard Biener <rguenther@suse.de> 2018-01-16 Richard Biener <rguenther@suse.de>
* gcc.dg/graphite/pr83435.c: Restrict to target pthread. * gcc.dg/graphite/pr83435.c: Restrict to target pthread.
......
// PR c++/83825
// { dg-do compile }
template <int A>
class A {}; // { dg-error "shadows template parameter" }
template <int I>
class B
{
void foo () { A <I> a; }
};
template void B <0>::foo ();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment