c++: abbreviated function template friend matching [PR96106]
In the below testcase, duplicate_decls wasn't merging the tsubsted friend declaration for 'void add(auto)' with its definition, because reduce_template_parm_level (during tsubst_friend_function) lost the DECL_VIRTUAL_P flag on the auto's invented template parameter, which caused template_heads_equivalent_p to deem the two template heads as not equivalent in C++20 mode. This patch makes reduce_template_parm_level carry over the DECL_VIRTUAL_P flag from the original TEMPLATE_PARM_DECL. gcc/cp/ChangeLog: PR c++/96106 * pt.c (reduce_template_parm_level): Propagate DECL_VIRTUAL_P from the original TEMPLATE_PARM_DECL to the new lowered one. gcc/testsuite/ChangeLog: PR c++/96106 * g++.dg/concepts/abbrev7.C: New test.
This commit is contained in:
parent
dc3d1e1814
commit
f31dd9beb9
|
@ -4453,6 +4453,7 @@ reduce_template_parm_level (tree index, tree type, int levels, tree args,
|
|||
type);
|
||||
TREE_CONSTANT (decl) = TREE_CONSTANT (orig_decl);
|
||||
TREE_READONLY (decl) = TREE_READONLY (orig_decl);
|
||||
DECL_VIRTUAL_P (decl) = DECL_VIRTUAL_P (orig_decl);
|
||||
DECL_ARTIFICIAL (decl) = 1;
|
||||
SET_DECL_TEMPLATE_PARM_P (decl);
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// PR c++/96106
|
||||
// { dg-do compile { target concepts } }
|
||||
|
||||
template<typename>
|
||||
struct number {
|
||||
friend void add(auto);
|
||||
};
|
||||
|
||||
void add(auto) { }
|
||||
|
||||
void foo() {
|
||||
number<int> n;
|
||||
add(n); // { dg-bogus "ambiguous" }
|
||||
}
|
Loading…
Reference in New Issue