aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-06-20 19:22:53 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-06-20 19:22:53 +0000
commitc1456656842bef093d73e1f324eb49b94db87203 (patch)
tree9a2a4b42351f389b6e96a0153aa538ec4ab09047
parentf2cb6e64c920bb2f4e8a1ce9cb300385b53349ed (diff)
downloadgcc-c1456656842bef093d73e1f324eb49b94db87203.zip
gcc-c1456656842bef093d73e1f324eb49b94db87203.tar.gz
gcc-c1456656842bef093d73e1f324eb49b94db87203.tar.bz2
[PR c++/85634] Fix tsubst ICE
https://gcc.gnu.org/ml/gcc-patches/2018-06/msg01274.html PR c++/85634 * friend.c (add_friend): Keep lookup sets of tempate sets. PR c++/85634 * g++.dg/lookup/pr85634-2.C: New. From-SVN: r261817
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/friend.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/pr85634-2.C16
4 files changed, 32 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b567d60..8dabe76 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-20 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/85634
+ * friend.c (add_friend): Keep lookup sets of tempate sets.
+
2018-06-20 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokfndecl): Add const cp_decl_specifier_seq* parameter;
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index b31d4cf..2c9c12f 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -173,6 +173,12 @@ add_friend (tree type, tree decl, bool complain)
if (decl == error_mark_node)
return;
+ if (TREE_CODE (decl) == FUNCTION_DECL
+ && DECL_TEMPLATE_INSTANTIATION (decl))
+ /* We'll have parsed this as a declaration, and therefore not
+ marked the lookup set for keeping. Do that now. */
+ lookup_keep (DECL_TI_TEMPLATE (decl));
+
typedecl = TYPE_MAIN_DECL (type);
list = DECL_FRIENDLIST (typedecl);
name = DECL_NAME (decl);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8009196..271ac3d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-20 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/85634
+ * g++.dg/lookup/pr85634-2.C: New.
+
2018-06-20 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/template/friend65.C: New.
diff --git a/gcc/testsuite/g++.dg/lookup/pr85634-2.C b/gcc/testsuite/g++.dg/lookup/pr85634-2.C
new file mode 100644
index 0000000..f095ffc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/pr85634-2.C
@@ -0,0 +1,16 @@
+// PR c++/85634
+
+namespace bsl {
+ template <class T> void frob (const T *);
+}
+
+using namespace bsl;
+
+template<class VALUE> void frob (const VALUE &);
+
+template <typename T>
+struct TPL {
+ friend void frob <T> (const T &);
+};
+
+TPL<int> x;