c++: CONSTRUCTORs are non-deduced contexts [PR104291]

PR c++/104291

gcc/cp/ChangeLog:

	* pt.cc (for_each_template_parm_r) <case CONSTRUCTOR>: Clear
	walk_subtrees if !include_nondeduced_p.  Simplify given that
	cp_walk_subtrees already walks TYPE_PTRMEMFUNC_FN_TYPE_RAW.

gcc/testsuite/ChangeLog:

	* g++.dg/template/partial20.C: New test.
This commit is contained in:
Patrick Palka 2022-01-31 14:15:01 -05:00
parent 2cbe5dd54f
commit 0eb06ee9a4
2 changed files with 8 additions and 6 deletions

View File

@ -10525,12 +10525,6 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
*walk_subtrees = 0;
break;
case CONSTRUCTOR:
if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))
&& pfd->include_nondeduced_p)
WALK_SUBTREE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
break;
case INDIRECT_REF:
case COMPONENT_REF:
/* If there's no type, then this thing must be some expression
@ -10539,6 +10533,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
return error_mark_node;
break;
case CONSTRUCTOR:
case TRAIT_EXPR:
case PLUS_EXPR:
case MULT_EXPR:

View File

@ -0,0 +1,7 @@
// PR c++/104291
// { dg-do compile { target c++20 } }
struct A { int x; };
template<auto> struct B;
template<int N> struct B<A{N}> { }; // { dg-error "not deducible" }