This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/51866] New: [c++0x][4.7 Regression] unordered_set compares moved-out values
- From: "roman at binarylife dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 16 Jan 2012 01:34:26 +0000
- Subject: [Bug libstdc++/51866] New: [c++0x][4.7 Regression] unordered_set compares moved-out values
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51866
Bug #: 51866
Summary: [c++0x][4.7 Regression] unordered_set compares
moved-out values
Classification: Unclassified
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: roman@binarylife.net
$ cat test.cpp
#include <unordered_set>
#include <iostream>
#include <cstdlib>
struct num {
int value;
num(int n) : value(n) {}
num(num const&) = default;
num& operator=(num const&) = default;
num(num&& o) : value(o.value) { o.value=-1; }
num& operator=(num&& o) { if (this!=&o) { value=o.value; o.value=-1; }
return *this; }
};
struct num_hash {
size_t operator()(num const& a)const {
if (a.value<0) std::cout<<"hash of moved value"<<std::endl;
return 0;
}
};
struct num_equal {
bool operator()(num const& a,num const& b)const {
if (a.value<0 || b.value<0) {
std::cout<<"compare of moved value: a="<<a.value<<",
b="<<b.value<<std::endl;
return false;
}
return a.value==b.value;
}
};
int main() {
std::unordered_multiset<num,num_hash,num_equal> mset;
mset.insert(num(1));
mset.insert(num(2));
mset.insert(num(1));
mset.insert(num(2));
if (mset.size()!=4) abort();
auto iter=mset.cbegin();
int x0=(iter++)->value;
int x1=(iter++)->value;
int x2=(iter++)->value;
int x3=(iter++)->value;
if ((x0==1 && x1==1 && x2==2 && x3==2) ||
(x0==2 && x1==2 && x2==1 && x3==1)) return 0;
std::cout<<x0<<' '<<x1<<' '<<x2<<' '<<x3<<std::endl;
abort();
}
$ g++ -std=c++0x test.cpp && ./a.out
compare of moved value: a=-1, b=1
compare of moved value: a=-1, b=2
compare of moved value: a=-1, b=1
compare of moved value: a=-1, b=1
compare of moved value: a=-1, b=2
compare of moved value: a=-1, b=1
2 1 2 1
Aborted