From: Patrick Palka Date: Tue, 18 Jan 2022 19:50:06 +0000 (-0500) Subject: c++: DEPENDENT_OPERATOR_TYPE as type of NTTP [PR104074] X-Git-Tag: basepoints/gcc-13~1616 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3c4a54adb2164315d18fd8980c0fc37eb3d22252;p=thirdparty%2Fgcc.git c++: DEPENDENT_OPERATOR_TYPE as type of NTTP [PR104074] We're incorrectly rejecting the below testcase during template argument coercion because invalid_nontype_parm_type_p returns true for DEPENDENT_OPERATOR_TYPE in C++17 mode. This patch fixes this by partially rewriting invalid_nontype_parm_type_p in terms of WILDCARD_TYPE_P, for which DEPENDENT_OPERATOR_TYPE is true, so that the predicate handles wildcard types consistently. PR c++/104074 gcc/cp/ChangeLog: * pt.cc (invalid_nontype_parm_type_p): Use WILDCARD_TYPE_P so that we return false for DEPENDENT_OPERATOR_TYPE too. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/nontype-auto20.C: New test. --- diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 4a2b33ec9403..586ad1c97f63 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -26931,16 +26931,14 @@ invalid_nontype_parm_type_p (tree type, tsubst_flags_t complain) } return false; } - else if (TREE_CODE (type) == TYPENAME_TYPE) - return false; - else if (TREE_CODE (type) == DECLTYPE_TYPE) - return false; else if (TREE_CODE (type) == NULLPTR_TYPE) return false; - /* 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) + else if (TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM + && cxx_dialect < cxx11) + /* Fall through; before C++11 alias templates, a bound ttp + always instantiates into a class type. */; + else if (WILDCARD_TYPE_P (type)) + /* Any other wildcard type not already handled above is allowed. */ return false; else if (TREE_CODE (type) == COMPLEX_TYPE) /* Fall through. */; diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype-auto20.C b/gcc/testsuite/g++.dg/cpp1z/nontype-auto20.C new file mode 100644 index 000000000000..87a2a5fb9f77 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/nontype-auto20.C @@ -0,0 +1,5 @@ +// PR c++/104074 +// { dg-do compile { target c++17 } } + +template class gr_sp; +template using gr_rp = gr_sp;