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

            Bug ID: 93415
           Summary: Previous declaration of template without default
                    arguments leads to incorrect overload resolution
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Predelnik at gmail dot com
  Target Milestone: ---

#include <iostream>

template <bool B>
void f (int);
template <bool B = true>
void f (int)
{
  std::cout << "correct - int\n";
}

template <bool B = true>
void f (char)
{
    std::cout << "wrong - char\n";
}

int main ()
{
    f (0);
    return 0;
}

The above program prints "wrong - char" with gcc, however just removing
declartion of `f` without default arguments leads to expected result. It is
very annoying issue because do-nothing forward declarations may lead to
unexpected hard to find bugs. Other compilers seem to handle this case
properly.

Reply via email to