Jakub noticed that we were improperly allowing this in C++17 mode.

Tested x86_64-pc-linux-gnu, applying to trunk.

        * pt.c (invalid_nontype_parm_type_p): Reject class placeholder in
        C++17.
---
 gcc/cp/pt.c                                    | 11 ++++++++++-
 gcc/testsuite/g++.dg/cpp1z/class-deduction64.C |  2 +-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5b12aa6996a..bc23e9e0354 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 3a06e6fb522..a21ea129f46 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>();
 };

base-commit: 95d4b531e7e3750bdde17079e209909deee6b219
-- 
2.18.1

Reply via email to