This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR c++/65186 (bound template template parm as valid nontype parm)
- From: Patrick Palka <patrick at parcs dot ath dot cx>
- To: gcc-patches at gcc dot gnu dot org
- Cc: jason at redhat dot com, Patrick Palka <patrick at parcs dot ath dot cx>
- Date: Sat, 11 Jul 2015 22:41:31 -0400
- Subject: [PATCH] Fix PR c++/65186 (bound template template parm as valid nontype parm)
- Authentication-results: sourceware.org; auth=none
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