rel_ops issues
Joe Buck
jbuck@racerx.synopsys.com
Mon Apr 2 17:04:00 GMT 2001
Ben writes:
> people can somebody please post
>
> 1) testsuite additions that clearly cause the regressions that joe is seeing
> 2) patches for the same
1) is in GNATS, reports 2405 and 2406, though the pages look garbled.
Test case for report 2405: compile
-----------------------------------------------------------------
#include <utility>
using std::rel_ops::operator!=;
#include <vector>
using std::vector;
void add_to(vector<int>& v, int x) { v.push_back(x);}
-----------------------------------------------------------------
Test case for report 2406:
----------------------------------------------------
#include <vector>
using std::vector;
struct foo {
int a;
};
bool operator==(const foo&, const foo&);
bool veq(const vector<foo>& a, const vector<foo>& b)
{
return a == b;
}
----------------------------------------------------
Because of legal problems I can't give you patches that have an
assignment, but I can describe one possible patches that I have
tested, it's pretty mechanical.
For 2405, we need to add additional partial specializations for
operator!= (and also <=, >=, and >) for __normal_iterator.
These partial specializations are for the case where both arguments
to operator!= are exactly the same. This means that there are two,
rather than three, typename arguments.
For 2406, the problem is with std::equal's use of operator!= (the
three-argument version).
There are two possible fixes. One is to add
using std::rel_ops::operator!=;
to the body of the function, ignoring Gaby's anguished screams. :-)
The other is to replace the occurrences of != with ! and == .
Actually, only one of the two != operators needs changing, the
one that does not operate on iterators.
I had thought that there would be lots of other cases like 2406.
But it seems that std::equal might be the only one; the other uses
of != that I can find in stl_algo and stl_algobase operate only
on iterators, and for those, __normal_iterator should supply
a definition or else the iterator will be a pointer and have a
valid !=. So I'm only asking for a fix to std::equal.
More information about the Libstdc++
mailing list