From 657fea973b000000350c99de9e67bff0438d1503 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 3 Jan 2020 17:10:25 -0500 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 11 ++++++++++- gcc/testsuite/g++.dg/cpp1z/class-deduction64.C | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 35b954ca6b2..9b607b2f073 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-01-02 Jason Merrill + + * pt.c (invalid_nontype_parm_type_p): Reject class placeholder in + C++17. + 2020-01-02 Jakub Jelinek PR c/90677 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 struct S; -template struct W { +template struct W { // { dg-error "class type" "" { target c++17_only } } template static int foo(); bool b = foo(); }; -- 2.30.2