https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108067
Bug ID: 108067
Summary: Miscompilation with friend function with parameter
pack: mismatched argument pack lengths
Product: gcc
Version: 12.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: danakj at orodu dot net
Target Milestone: ---
The following code compiles in Clang and MSVC but not in GCC.
Repros in GCC 10, 11, 12, and trunk.
```
template <class A, class B>
static constexpr bool C = true;
template <class... Ts>
struct Foo {
template <class... Us>
requires((... && C<Ts, Us>))
void bar(const Foo<Us...>& r) {}
template <class... Us>
requires((... && C<Ts, Us>))
friend void baz(const Foo& l, const Foo<Us...>& r) {}
};
int main() {
Foo<int, int> x;
x.bar(Foo<int, int>()); // Works.
baz(x, Foo<int, int>()); // Doesn't work.
}
```
godbolt: https://godbolt.org/z/3Ybofbcoc
<source>: In instantiation of 'struct Foo<int, int>':
<source>:16:19: required from here
<source>:12:17: error: mismatched argument pack lengths while expanding 'C<Ts,
Us>'
12 | friend void baz(const Foo& l, const Foo<Us...>& r) {}
| ^~~
ASM generation compiler returned: 1
<source>: In instantiation of 'struct Foo<int, int>':
<source>:16:19: required from here
<source>:12:17: error: mismatched argument pack lengths while expanding 'C<Ts,
Us>'
12 | friend void baz(const Foo& l, const Foo<Us...>& r) {}
| ^~~
Execution build compiler returned: 1