aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-01-03 17:10:25 -0500
committerJason Merrill <jason@gcc.gnu.org>2020-01-03 17:10:25 -0500
commit657fea973b000000350c99de9e67bff0438d1503 (patch)
tree2e0ab94b984cab933042bb324401bf2a61ed28a4
parentcfe9c753113f1fd5ca891d6b31d3411f903d1764 (diff)
downloadgcc-657fea973b000000350c99de9e67bff0438d1503.zip
gcc-657fea973b000000350c99de9e67bff0438d1503.tar.gz
gcc-657fea973b000000350c99de9e67bff0438d1503.tar.bz2
Reject class template placeholder as non-type template parm type in C++17.
* pt.c (invalid_nontype_parm_type_p): Reject class placeholder in C++17. From-SVN: r279870
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction64.C2
3 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 35b954ca..9b607b2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-02 Jason Merrill <jason@redhat.com>
+
+ * pt.c (invalid_nontype_parm_type_p): Reject class placeholder in
+ C++17.
+
2020-01-02 Jakub Jelinek <jakub@redhat.com>
PR c/90677
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5b12aa6..bc23e9e 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -25811,7 +25811,16 @@ invalid_nontype_parm_type_p (tree type, tsubst_flags_t complain)
else if (TYPE_PTRMEM_P (type))
return false;
else if (TREE_CODE (type) == TEMPLATE_TYPE_PARM)
- return false;
+ {
+ if (CLASS_PLACEHOLDER_TEMPLATE (type) && cxx_dialect < cxx2a)
+ {
+ if (complain & tf_error)
+ error ("non-type template parameters of deduced class type only "
+ "available with %<-std=c++2a%> or %<-std=gnu++2a%>");
+ return true;
+ }
+ return false;
+ }
else if (TREE_CODE (type) == TYPENAME_TYPE)
return false;
else if (TREE_CODE (type) == DECLTYPE_TYPE)
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction64.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction64.C
index 3a06e6f..a21ea12 100644
--- a/gcc/testsuite/g++.dg/cpp1z/class-deduction64.C
+++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction64.C
@@ -3,7 +3,7 @@
template <int> struct S;
-template <S> struct W {
+template <S> struct W { // { dg-error "class type" "" { target c++17_only } }
template <typename> static int foo();
bool b = foo<int>();
};