re PR c++/65186 (internal compiler error: in tsubst, at cp/pt.c:11738)
authorPatrick Palka <ppalka@gcc.gnu.org>
Mon, 13 Jul 2015 20:35:53 +0000 (20:35 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Mon, 13 Jul 2015 20:35:53 +0000 (20:35 +0000)
Fix PR c++/65186

gcc/cp/ChangeLog:
PR c++/65186
* pt.c (invalid_nontype_parm_type_p): Accept a bound template
template parm type under C++11 and later.

gcc/testsuite/ChangeLog:

PR c++/65186
* g++.dg/template/pr65186.C: New test.

From-SVN: r225749

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr65186.C [new file with mode: 0644]

index a33b649..df2e0b2 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-13  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/65186
+       * pt.c (invalid_nontype_parm_type_p): Accept a bound template
+       template parm type under C++11 and later.
+
 2015-07-12  Aldy Hernandez  <aldyh@redhat.com>
 
        * call.c: Fix double word typos.
index 064cbfd..2097963 100644 (file)
@@ -20996,6 +20996,11 @@ invalid_nontype_parm_type_p (tree type, tsubst_flags_t complain)
     return 0;
   else if (TREE_CODE (type) == NULLPTR_TYPE)
     return 0;
+  /* A bound template template parm could later be instantiated to have a valid
+     nontype parm type via an alias template.  */
+  else if (cxx_dialect >= cxx11
+          && TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM)
+    return 0;
 
   if (complain & tf_error)
     {
index 071e7c4..2e32e14 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-13  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/65186
+       * g++.dg/template/pr65186.C: New test.
+
 2015-07-13  Mantas Mikaitis  <mantas.mikaitis@arm.com>
 
        * gcc.target/arm/macro_defs0.c: Add directive to skip
diff --git a/gcc/testsuite/g++.dg/template/pr65186.C b/gcc/testsuite/g++.dg/template/pr65186.C
new file mode 100644 (file)
index 0000000..f5e81e3
--- /dev/null
@@ -0,0 +1,26 @@
+// { dg-do compile { target c++11 } }
+// PR c++/65186
+
+template<typename A, A x, A y>
+using Id = int;
+
+template<
+  typename A,
+  A x,
+  A y,
+  Id<A, x, y> p,
+  template<A a, A b, Id<A, a, b>> class C,
+  C<x, x, x> // { dg-bogus "not a valid type" }
+> using J = C<x, y, p>;
+
+
+template<class A>
+using Z = A;
+
+template<
+  template <class> class A,
+  A<int> B // { dg-bogus "not a valid type" }
+>
+struct C { };
+
+C<Z, 5> a;