[Bug c++/56943] New: Incorrect two-phase name lookup for operators

zeratul976 at hotmail dot com gcc-bugzilla@gcc.gnu.org
Fri Apr 12 23:35:00 GMT 2013


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

             Bug #: 56943
           Summary: Incorrect two-phase name lookup for operators
    Classification: Unclassified
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: zeratul976@hotmail.com


When the following code is run:


#include <iostream>

namespace N
{
    struct A
    {
        int operator+(const void*) 
        { 
            return 42; 
        }
    };
}

namespace M
{
    struct B
    {
    };
}


template <typename T, typename U>
int add(T t, U u)
{
    return t + u;
}

int operator+(N::A, M::B*) 
{ 
    return 5; 
}

int main(int argc, char** argv)
{
    N::A a;
    M::B b;
    std::cout << add(a, &b) << "\n";
}


the output is "5". I believe the correct output wouldbe "42", because when
looking up operator+ in the expression "t + u", the operator+(N::A, M::B*)
overload is found neither by unqualified lookup at the point of definition
(since it is not declared yet at the point of definition), nor by
argument-dependent lookup at the point of instantiation (since it is not in the
namespace of either of its arguments).

Clang outputs "42" for this example, as expected.



More information about the Gcc-bugs mailing list