Consider the following sample program:

struct S
{
 int x;
 int y;
};

int foo(int x, int y)
{
 return x+y;
}

int foo(const S &s)
{
 return s.x + s.y;
}

int foo2(int x)
{
 foo(x);
}


When compiling this, clang prints:


#> clang ./tst.cc
./tst.cc:19:3: error: no matching function for call to 'foo'
 foo(x);
 ^~~
./tst.cc:12:5: note: candidate function not viable: no known conversion from
     'int' to 'struct S const' for 1st argument
int foo(const S &s)
   ^
./tst.cc:7:5: note: candidate function not viable: requires 2 arguments, but 1
     was provided
int foo(int x, int y)
   ^
3 diagnostics generated.


Notice that each failed match is clearly explained.  By comparison, gcc prints:


#> ./install/bin/gcc -c ./tst.cc
./tst.cc: In function ‘int foo2(int)’:
./tst.cc:19:8: error: no matching function for call to ‘foo(int&)’
./tst.cc:7:5: note: candidates are: int foo(int, int)
./tst.cc:12:5: note:                 int foo(const S&)


In this case, it is easy to see what's going on.  However, many C++ functions
contain multiple template arguments.  In those cases, it can be difficult to
parse the diagnostics and understand what is wrong.

GCC should clearly indicate why each match failed.


-- 
           Summary: When printing a list of candidate functions, explain why
                    each function failed to match.
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: aaw at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45329

Reply via email to