aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-01-16 09:43:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-16 09:43:31 +0100
commit774ae645c0c30c19a751b5c3713beef3aa5d8f28 (patch)
tree4daef7e4540d724bef6cdfb15bc985594c875b28
parent206c8300cae62693da0d138a897bbf4e62089813 (diff)
downloadgcc-774ae645c0c30c19a751b5c3713beef3aa5d8f28.zip
gcc-774ae645c0c30c19a751b5c3713beef3aa5d8f28.tar.gz
gcc-774ae645c0c30c19a751b5c3713beef3aa5d8f28.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/name-lookup.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr83825.C13
4 files changed, 32 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7e437f8..2371a54 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+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>
PR c++/83588
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index cddafab..8d34293 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -1520,8 +1520,7 @@ resort_type_member_vec (void *obj, void */*orig_obj*/,
{
resort_data.new_value = new_value;
resort_data.cookie = cookie;
- qsort (member_vec->address (), member_vec->length (),
- sizeof (tree), resort_member_name_cmp);
+ member_vec->qsort (resort_member_name_cmp);
}
}
@@ -1597,6 +1596,9 @@ member_vec_dedup (vec<tree, va_gc> *member_vec)
unsigned len = member_vec->length ();
unsigned store = 0;
+ 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;
@@ -1712,8 +1714,7 @@ set_class_bindings (tree klass, unsigned extra)
if (member_vec)
{
CLASSTYPE_MEMBER_VEC (klass) = member_vec;
- qsort (member_vec->address (), member_vec->length (),
- sizeof (tree), member_name_cmp);
+ member_vec->qsort (member_name_cmp);
member_vec_dedup (member_vec);
}
}
@@ -1741,8 +1742,7 @@ insert_late_enum_def_bindings (tree klass, tree enumtype)
else
member_vec_append_class_fields (member_vec, klass);
CLASSTYPE_MEMBER_VEC (klass) = member_vec;
- qsort (member_vec->address (), member_vec->length (),
- sizeof (tree), member_name_cmp);
+ member_vec->qsort (member_name_cmp);
member_vec_dedup (member_vec);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6b84140..2a44bb1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
* gcc.dg/graphite/pr83435.c: Restrict to target pthread.
diff --git a/gcc/testsuite/g++.dg/template/pr83825.C b/gcc/testsuite/g++.dg/template/pr83825.C
new file mode 100644
index 0000000..ba3ff4d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr83825.C
@@ -0,0 +1,13 @@
+// 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 ();