+2020-05-11 Jason Merrill <jason@redhat.com>
+
+ Resolve C++20 NB comment CA104
+ * pt.c (determine_specialization): Compare constraints for
+ specialization of member template of class instantiation.
+
2020-05-11 Jason Merrill <jason@redhat.com>
PR c++/92583
below. */
if (tsk == tsk_template)
{
- if (compparms (fn_arg_types, decl_arg_types))
- candidates = tree_cons (NULL_TREE, fn, candidates);
+ if (!comp_template_parms (DECL_TEMPLATE_PARMS (fn),
+ current_template_parms))
+ continue;
+ if (!same_type_p (TREE_TYPE (TREE_TYPE (decl)),
+ TREE_TYPE (TREE_TYPE (fn))))
+ continue;
+ if (!compparms (fn_arg_types, decl_arg_types))
+ continue;
+
+ tree freq = get_trailing_function_requirements (fn);
+ tree dreq = get_trailing_function_requirements (decl);
+ if (!freq != !dreq)
+ continue;
+ if (freq)
+ {
+ tree fargs = DECL_TI_ARGS (fn);
+ tsubst_flags_t complain = tf_none;
+ freq = tsubst_constraint (freq, fargs, complain, fn);
+ if (!cp_tree_equal (freq, dreq))
+ continue;
+ }
+
+ candidates = tree_cons (NULL_TREE, fn, candidates);
continue;
}
*targs_out = copy_node (DECL_TI_ARGS (fn));
/* Propagate the candidate's constraints to the declaration. */
- set_constraints (decl, get_constraints (fn));
+ if (tsk != tsk_template)
+ set_constraints (decl, get_constraints (fn));
/* DECL is a re-declaration or partial instantiation of a template
function. */
--- /dev/null
+// Example from CA 104 proposal.
+// { dg-do compile { target concepts } }
+
+template <class T> concept C = sizeof(T) == 8;
+template <class T> struct A {
+ template <class U> U f(U) requires C<typename T::type>; // #1
+ template <class U> U f(U) requires C<T>; // #2
+};
+
+template <> template <class U> U A<int>::f(U) requires C<int> { } // OK, specializes #2