[Bug c++/107853] [10/11/12 Regression] variadic template with a variadic template friend with a requires of fold expression

2023-04-05 Thread mpolacek at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107853

Marek Polacek  changed:

   What|Removed |Added

 CC||h2+bugs at fsfe dot org

--- Comment #8 from Marek Polacek  ---
*** Bug 109425 has been marked as a duplicate of this bug. ***

[Bug c++/107853] [10/11/12 Regression] variadic template with a variadic template friend with a requires of fold expression

2023-03-06 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107853

--- Comment #7 from CVS Commits  ---
The releases/gcc-12 branch has been updated by Patrick Palka
:

https://gcc.gnu.org/g:cb39089c5a0da1e9b16ad27db557a2c3f930e668

commit r12-9229-gcb39089c5a0da1e9b16ad27db557a2c3f930e668
Author: Patrick Palka 
Date:   Fri Dec 23 09:18:37 2022 -0500

c++: template friend with variadic constraints [PR107853]

When instantiating a constrained hidden template friend, we substitute
into its template-head requirements in tsubst_friend_function.  For this
substitution we use the template's full argument vector whose outer
levels correspond to the instantiated class's arguments and innermost
level corresponds to the template's own level-lowered generic arguments.

But for A::f here, for which the relevant argument vector is
{{int}, {Us...}}, the substitution into (C && ...) triggers the
assert in use_pack_expansion_extra_args_p since one argument is a pack
expansion and the other isn't.

And for A::f, for which the relevant argument vector is
{{int, int}, {Us...}}, the use_pack_expansion_extra_args_p assert would
also trigger but we first get a bogus "mismatched argument pack lengths"
error from tsubst_pack_expansion.

Sidestepping the question of whether tsubst_pack_expansion should be
able to handle such substitutions, it seems we can work around this by
using only the instantiated class's arguments and not also the template
friend's own generic arguments, which is consistent with how we normally
substitute into the signature of a member template.

PR c++/107853

gcc/cp/ChangeLog:

* constraint.cc (maybe_substitute_reqs_for): Substitute into
the template-head requirements of a template friend using only
its outer arguments via outer_template_args.
* cp-tree.h (outer_template_args): Declare.
* pt.cc (outer_template_args): Define, factored out and
generalized from ...
(ctor_deduction_guides_for): ... here.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-friend12.C: New test.
* g++.dg/cpp2a/concepts-friend13.C: New test.

(cherry picked from commit bd1fc4a219d8c0fad0ec41002e895b49e384c1c2)

[Bug c++/107853] [10/11/12 Regression] variadic template with a variadic template friend with a requires of fold expression

2022-12-23 Thread ppalka at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107853

Patrick Palka  changed:

   What|Removed |Added

Summary|[10/11/12/13 Regression]|[10/11/12 Regression]
   |variadic template with a|variadic template with a
   |variadic template friend|variadic template friend
   |with a requires of fold |with a requires of fold
   |expression  |expression
  Known to work||13.0

--- Comment #6 from Patrick Palka  ---
Fixed on trunk so far