https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120759

            Bug ID: 120759
           Summary: Empty initializer list (`{}`) in a parameter pack
                    disables deduction for the entire pack
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mital at mitalashok dot co.uk
  Target Milestone: ---

The following compiles with `-std=c++11 -fsyntax-only`
<https://godbolt.org/z/e7bKvxjvE>:

    template<typename... T>
    struct X {};

    template<typename... T>
    void f(X<T...>, T...);

    int main() {
        f(X<int, int>{}, {}, 1L);
        f(X<int, int>{}, 1L, {});
    }

This diverges from Clang, which fails to compile this with the following
diagnostic:

<source>:8:5: error: no matching function for call to 'f'
    8 |     f(X<int, int>{}, {}, 1L);
      |     ^
<source>:5:6: note: candidate template ignored: deduced conflicting types for
parameter 'T' (<int, int> vs. <(no value), long>)
    5 | void f(X<T...>, T...);
      |      ^
<source>:9:5: error: no matching function for call to 'f'
    9 |     f(X<int, int>{}, 1L, {});
      |     ^
<source>:5:6: note: candidate template ignored: deduced conflicting types for
parameter 'T' (<int, int> vs. <long, (no value)>)
    5 | void f(X<T...>, T...);

And a similar error with MSVC. All three compilers accept `{}, 1` or `1, {}`.

I believe GCC is interpreting <https://wg21.link/temp.deduct.call#1.sentence-4>

> an initializer list argument causes the parameter to be considered a 
> non-deduced context.

... as making that entire parameter pack a non-deduced context, which is
unexpected. Clang and MSVC seem to interpret it as only that specific position
in the parameter pack become non-deduced.
  • [Bug c++/120759] New: Empty ini... mital at mitalashok dot co.uk via Gcc-bugs

Reply via email to