aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-11-07 16:28:46 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-11-07 16:28:46 +0000
commit72a7649aa53aa210bbe0d89f1ee083f7fcfc61d6 (patch)
tree6e9f9f904042185d9fb6a040f4afb19406cf0e66
parent38f54eec0becb68f4d7924327a9c368d9d27cd8f (diff)
downloadgcc-72a7649aa53aa210bbe0d89f1ee083f7fcfc61d6.zip
gcc-72a7649aa53aa210bbe0d89f1ee083f7fcfc61d6.tar.gz
gcc-72a7649aa53aa210bbe0d89f1ee083f7fcfc61d6.tar.bz2
[PR C++/87904] lookup ICE
https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00468.html PR c++/87904 * cp-tree.h (struct tree_overload): Fix comment. * tree.c (ovl_iterator::reveal_node): Propagate OVL_DEDUP_P. PR c++/87904 * g++.dg/lookup/pr87904.C: New. From-SVN: r265879
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/tree.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/pr87904.C21
5 files changed, 43 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b0dc668..79cc673 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-11-07 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/87904
+ * cp-tree.h (struct tree_overload): Fix comment.
+ * tree.c (ovl_iterator::reveal_node): Propagate OVL_DEDUP_P.
+
2018-11-04 Jason Merrill <jason@redhat.com>
Implement UDL changes from P0732R2.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a895d00..91f5755 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -723,8 +723,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
#define OVL_SINGLE_P(NODE) \
(TREE_CODE (NODE) != OVERLOAD || !OVL_CHAIN (NODE))
-/* OVL_HIDDEN_P nodes come first, then OVL_USING_P nodes, then regular
- fns. */
+/* OVL_HIDDEN_P nodes come before other nodes. */
struct GTY(()) tree_overload {
struct tree_common common;
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index e9db3ea..5e21fce 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2261,13 +2261,17 @@ ovl_iterator::reveal_node (tree overload, tree node)
OVL_HIDDEN_P (node) = false;
if (tree chain = OVL_CHAIN (node))
- if (TREE_CODE (chain) == OVERLOAD
- && (OVL_USING_P (chain) || OVL_HIDDEN_P (chain)))
+ if (TREE_CODE (chain) == OVERLOAD)
{
- /* The node needs moving, and the simplest way is to remove it
- and reinsert. */
- overload = remove_node (overload, node);
- overload = ovl_insert (OVL_FUNCTION (node), overload);
+ if (OVL_HIDDEN_P (chain))
+ {
+ /* The node needs moving, and the simplest way is to remove it
+ and reinsert. */
+ overload = remove_node (overload, node);
+ overload = ovl_insert (OVL_FUNCTION (node), overload);
+ }
+ else if (OVL_DEDUP_P (chain))
+ OVL_DEDUP_P (node) = true;
}
return overload;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1975956..9bb807e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-07 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/87904
+ * g++.dg/lookup/pr87904.C: New.
+
2018-11-07 Uros Bizjak <ubizjak@gmail.com>
* gcc.dg/pr87874.c: Compile only for int128 effective target.
diff --git a/gcc/testsuite/g++.dg/lookup/pr87904.C b/gcc/testsuite/g++.dg/lookup/pr87904.C
new file mode 100644
index 0000000..a40b32c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/pr87904.C
@@ -0,0 +1,21 @@
+// PR c++ 87904 ICE failing to initiate deduping
+
+namespace X {
+ void Foo (char);
+}
+
+struct B {
+ friend void Foo (int);
+};
+
+using X::Foo;
+
+void Foo (float);
+void Foo(int);
+
+void frob ()
+{
+ using namespace X;
+
+ Foo (1);
+}