This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/35631] New: operator overloads defined as a friend within a class are not always correctly resolved
- From: "nick dot orlov at mail dot ru" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 Mar 2008 02:07:44 -0000
- Subject: [Bug c++/35631] New: operator overloads defined as a friend within a class are not always correctly resolved
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The following example demonstrates the issue:
============================
#include <utility>
#include <iostream>
#define INLINE_FRIEND
class Outer {
enum InnerEnum {
Value0 = 0
};
typedef std::pair<InnerEnum, int> InnerPair;
friend bool operator==(const InnerPair& lhs, const InnerPair& rhs)
#ifdef INLINE_FRIEND
{
return lhs.first == rhs.first;
}
#else
;
#endif
public:
static void test();
};
#ifndef INLINE_FRIEND
bool operator==(const Outer::InnerPair& lhs, const Outer::InnerPair& rhs)
{
return lhs.first == rhs.first;
}
#endif
void Outer::test()
{
InnerPair pair1(Value0, 0);
InnerPair pair2(Value0, 1);
std::cout << (pair1 == pair2 ? "==" : "!=") << std::endl;
}
int main()
{
Outer::test();
return 0;
}
============================
When compiled with 4.1/4.2/4.3 this prints "!=", with 3.3/3.4 - '=='.
I believe that 3.3/3.4 were doing "the right thing" (unless I'm misreading the
standard)
I'm not sure if 4.0 is affected by this since I do not have it installed.
--
Summary: operator overloads defined as a friend within a class
are not always correctly resolved
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: nick dot orlov at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35631