This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR c++/65186 (bound template template parm as valid nontype parm)


In C++11 or later a bound template template parm should be considered a
valid nontype parm type because it could later be instantiated with an
alias template to have a non-aggregate type such as int.

OK to commit after bootstrap + regtest?

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.
---
 gcc/cp/pt.c                             |  5 +++++
 gcc/testsuite/g++.dg/template/pr65186.C | 26 ++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/template/pr65186.C

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 064cbfd..2097963 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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)
     {
diff --git a/gcc/testsuite/g++.dg/template/pr65186.C b/gcc/testsuite/g++.dg/template/pr65186.C
new file mode 100644
index 0000000..f5e81e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr65186.C
@@ -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;
-- 
2.5.0.rc1.40.ge088f2b.dirty


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]