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

            Bug ID: 111140
           Summary: wrong error message
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: f.heckenb...@fh-soft.de
  Target Milestone: ---

% cat test.cpp
static void S__f (auto ...) { }

struct S
{
  static void f (auto ...) { }
};

int main ()
{
  S__f (1, { });
  S::f (1, { });
}
% g++ -std=c++20 test.cpp
test.cpp: In function 'int main()':
test.cpp:10:8: error: too many arguments to function 'void S__f(auto:1 ...)
[with auto:1 = {}]'
   10 |   S__f (1, { });
      |   ~~~~~^~~~~~~~
test.cpp:1:13: note: declared here
    1 | static void S__f (auto ...) { }
      |             ^~~~
test.cpp:11:8: error: no matching function for call to 'S::f(int,
<brace-enclosed initializer list>)'
   11 |   S::f (1, { });
      |   ~~~~~^~~~~~~~
test.cpp:5:15: note: candidate: 'static void S::f(auto:2 ...) [with auto:2 =
{}]'
    5 |   static void f (auto ...) { }
      |               ^
test.cpp:5:15: note:   candidate expects 0 arguments, 2 provided

These error messages are just misleading. The functions accept any number of
arguments. The actual problem is that no type can be deduced for "{ }". (Of
course, it's easy to see here, but in more complex situations with multiple
overloads, it makes it really hard to understand what the problem is.)

Also strange: S__f and S::f are practically the same, yet the error message is
differently worded (though the meaning is very close).

Reply via email to