aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-06-18 14:16:38 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-06-18 14:16:38 -0400
commit5d4d0be8132cb837ce075e28f14d7ef8dcc02767 (patch)
tree4e58c93e02746a688d3891890d055ab45f99b9d6 /gcc
parent8499a82c19c6e2d165bd1c5ff67b8f0e9294190e (diff)
downloadgcc-5d4d0be8132cb837ce075e28f14d7ef8dcc02767.zip
gcc-5d4d0be8132cb837ce075e28f14d7ef8dcc02767.tar.gz
gcc-5d4d0be8132cb837ce075e28f14d7ef8dcc02767.tar.bz2
PR c++/86171 - ICE with recursive alias instantiation.
* pt.c (tsubst_decl): Handle recursive alias instantiation. From-SVN: r261709
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alias-decl-65.C10
3 files changed, 24 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c3b5bc6..b1a449f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/86171 - ICE with recursive alias instantiation.
+ * pt.c (tsubst_decl): Handle recursive alias instantiation.
+
2018-06-18 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (duplicate_decls): Consistently use DECL_SOURCE_LOCATION
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 4ee84b2..6e590d4 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -13639,7 +13639,6 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
}
/* Create a new node for the specialization we need. */
- r = copy_decl (t);
if (type == NULL_TREE)
{
if (is_typedef_decl (t))
@@ -13664,7 +13663,16 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
sub_args = strip_innermost_template_args (args, extra);
}
type = tsubst (type, sub_args, complain, in_decl);
+ /* Substituting the type might have recursively instantiated this
+ same alias (c++/86171). */
+ if (gen_tmpl && DECL_ALIAS_TEMPLATE_P (gen_tmpl)
+ && (spec = retrieve_specialization (gen_tmpl, argvec, hash)))
+ {
+ r = spec;
+ break;
+ }
}
+ r = copy_decl (t);
if (VAR_P (r))
{
DECL_INITIALIZED_P (r) = 0;
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-65.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-65.C
new file mode 100644
index 0000000..e320f3e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-65.C
@@ -0,0 +1,10 @@
+// PR c++/86171
+// { dg-do compile { target c++11 } }
+
+template <class> struct A;
+template <class T> using B = typename A<T>::X;
+template <class T> struct A {
+ typedef int X;
+ typedef B<T> U;
+};
+B<short> b;