The error message for the ill-formed code below is hard to read because of
the unnecessary cast and the explicit qualification of the data member. The
error becomes essentially unreadable when the code is more involved. Other
compilers manage to do better. For example, here's the diagnostic issued
for the same file by EDG eccp:

"t.cpp", line 5: error: no operator "+=" matches these operands
            operand types are: A<int> += const A<int>
          a [0] += x;
                ^
          detected during instantiation of
                    "void B<T>::operator=(const A<T> &) [with T=int]" at line
                    15

1 error detected in the compilation of "t.cpp".


$ cat t.cpp && gcc t.cpp
template <class> struct A { };

template <class T> struct B {
    void operator= (const A<T> &x) {
        a [0] += x;
    }
    A<T> *a;
};


int main ()
{
    A<int> a;
    B<int> b;
    b = a;
}
t.cpp: In member function 'void B<T>::operator=(const A<T>&) [with T = int]':
t.cpp:15:   instantiated from here
t.cpp:5: error: no match for 'operator+=' in '*((B<int>*)this)->B<int>::a += x'


-- 
           Summary: cryptic expression in error message for ill-formed
                    template code
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: sebor at roguewave dot com


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

Reply via email to