Skip to content
Snippets Groups Projects
  • Jason Merrill's avatar
    810bcc00
    c++: constrained hidden friends [PR109751] · 810bcc00
    Jason Merrill authored
    r13-4035 avoided a problem with overloading of constrained hidden friends by
    checking satisfaction, but checking satisfaction early is inconsistent with
    the usual late checking and can lead to hard errors, so let's not do that
    after all.
    
    We were wrongly treating the different instantiations of the same friend
    template as the same function because maybe_substitute_reqs_for was failing
    to actually substitute in the case of a non-template friend.  But we don't
    actually need to do the substitution anyway, because [temp.friend] says that
    such a friend can't be the same as any other declaration.
    
    After fixing that, instead of a redefinition error we got an ambiguous
    overload error, fixed by allowing constrained hidden friends to coexist
    until overload resolution, at which point they probably won't be in the same
    ADL overload set anyway.
    
    And we avoid mangling collisions by following the proposed mangling for
    these friends as a member function with an extra 'F' before the name.  I
    demangle this by just adding [friend] to the name of the function because
    it's not feasible to reconstruct the actual scope of the function since the
    mangling ABI doesn't distinguish between class and namespace scopes.
    
    	PR c++/109751
    
    gcc/cp/ChangeLog:
    
    	* cp-tree.h (member_like_constrained_friend_p): Declare.
    	* decl.cc (member_like_constrained_friend_p): New.
    	(function_requirements_equivalent_p): Check it.
    	(duplicate_decls): Check it.
    	(grokfndecl): Check friend template constraints.
    	* mangle.cc (decl_mangling_context): Check it.
    	(write_unqualified_name): Check it.
    	* pt.cc (uses_outer_template_parms_in_constraints): Fix for friends.
    	(tsubst_friend_function): Don't check satisfaction.
    
    include/ChangeLog:
    
    	* demangle.h (enum demangle_component_type): Add
    	DEMANGLE_COMPONENT_FRIEND.
    
    libiberty/ChangeLog:
    
    	* cp-demangle.c (d_make_comp): Handle DEMANGLE_COMPONENT_FRIEND.
    	(d_count_templates_scopes): Likewise.
    	(d_print_comp_inner): Likewise.
    	(d_unqualified_name): Handle member-like friend mangling.
    	* testsuite/demangle-expected: Add test.
    
    gcc/testsuite/ChangeLog:
    
    	* g++.dg/cpp2a/concepts-friend11.C: Now works.  Add template.
    	* g++.dg/cpp2a/concepts-friend15.C: New test.
    810bcc00
    History
    c++: constrained hidden friends [PR109751]
    Jason Merrill authored
    r13-4035 avoided a problem with overloading of constrained hidden friends by
    checking satisfaction, but checking satisfaction early is inconsistent with
    the usual late checking and can lead to hard errors, so let's not do that
    after all.
    
    We were wrongly treating the different instantiations of the same friend
    template as the same function because maybe_substitute_reqs_for was failing
    to actually substitute in the case of a non-template friend.  But we don't
    actually need to do the substitution anyway, because [temp.friend] says that
    such a friend can't be the same as any other declaration.
    
    After fixing that, instead of a redefinition error we got an ambiguous
    overload error, fixed by allowing constrained hidden friends to coexist
    until overload resolution, at which point they probably won't be in the same
    ADL overload set anyway.
    
    And we avoid mangling collisions by following the proposed mangling for
    these friends as a member function with an extra 'F' before the name.  I
    demangle this by just adding [friend] to the name of the function because
    it's not feasible to reconstruct the actual scope of the function since the
    mangling ABI doesn't distinguish between class and namespace scopes.
    
    	PR c++/109751
    
    gcc/cp/ChangeLog:
    
    	* cp-tree.h (member_like_constrained_friend_p): Declare.
    	* decl.cc (member_like_constrained_friend_p): New.
    	(function_requirements_equivalent_p): Check it.
    	(duplicate_decls): Check it.
    	(grokfndecl): Check friend template constraints.
    	* mangle.cc (decl_mangling_context): Check it.
    	(write_unqualified_name): Check it.
    	* pt.cc (uses_outer_template_parms_in_constraints): Fix for friends.
    	(tsubst_friend_function): Don't check satisfaction.
    
    include/ChangeLog:
    
    	* demangle.h (enum demangle_component_type): Add
    	DEMANGLE_COMPONENT_FRIEND.
    
    libiberty/ChangeLog:
    
    	* cp-demangle.c (d_make_comp): Handle DEMANGLE_COMPONENT_FRIEND.
    	(d_count_templates_scopes): Likewise.
    	(d_print_comp_inner): Likewise.
    	(d_unqualified_name): Handle member-like friend mangling.
    	* testsuite/demangle-expected: Add test.
    
    gcc/testsuite/ChangeLog:
    
    	* g++.dg/cpp2a/concepts-friend11.C: Now works.  Add template.
    	* g++.dg/cpp2a/concepts-friend15.C: New test.