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

            Bug ID: 89894
           Summary: poor error message when redefining a function
                    overloaded on a non-type specialization
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The error message below make it difficult to understand what exactly the root
cause problem is: the names of the types of the arguments are different and no
other detail is provided.  If the definitions of T and U and far apart (e.g.,
in different headers perhaps even supplied by different libraries) and
complicated (e.g., the result of some non-trivial algorithm) determining what
makes the types the same could be a non-trivial exercise.

Including a note in the error message pointing to the types underlying the
aliases would help.

Providing more detail about the underlying types, such as the values of the
constants the underlying templates are instantiated on analogously to what's
done for ordinary templates, would help even more.

$ cat z.C && gcc -c -Wall -std=c++2a z.C
struct A { int i; };
template <A> struct B { };

constexpr A f () { return A{1<<27}; }
constexpr A g () { return A{134217728}; }
typedef B<f ()> T;
typedef B<g ()> U;

void h (T) { }
void h (U) { }

z.C:10:6: error: redefinition of ‘void h(U)’
   10 | void h (U) { }
      |      ^
z.C:9:6: note: ‘void h(T)’ previously defined here
    9 | void h (T) { }
      |      ^

Reply via email to