fix(library/parray): missing desctrutor/constructor invocations at reroot

This commit is contained in:
Leonardo de Moura 2017-05-03 13:17:26 -07:00
parent 97ab603325
commit 6092966702
2 changed files with 44 additions and 2 deletions

View file

@ -215,7 +215,7 @@ class parray {
if (sz == capacity(vs))
vs = expand(vs, sz);
c->m_idx = sz;
vs[sz] = p->elem();
new (vs + sz) T(p->elem());
sz++;
break;
case PopBack:
@ -225,6 +225,7 @@ class parray {
} else {
*c->m_elem = vs[sz];
}
(vs + sz)->~T();
c->m_kind = PushBack;
c->m_idx = sz;
break;

View file

@ -126,6 +126,47 @@ static void tst_perf(unsigned sz, unsigned n) {
}
}
class Foo {
unsigned * m_data;
public:
Foo():m_data(new unsigned(1)) {}
Foo(Foo const & src):m_data(new unsigned(*src.m_data)) {}
Foo(Foo && src):m_data(new unsigned(*src.m_data)) {}
Foo(unsigned n):m_data(new unsigned(n)) {}
~Foo() { delete m_data; }
Foo & operator=(Foo const & src) {
*m_data = *src.m_data;
return *this;
}
Foo & operator=(Foo const && src) {
*m_data = *src.m_data;
return *this;
}
unsigned get_val() const { return *m_data; }
};
static void tst4() {
parray<Foo> v1;
v1.push_back(Foo(2));
v1.push_back(Foo(3));
parray<Foo> v2 = v1;
for (unsigned i = 0; i < 10; i++)
v1.push_back(Foo(i));
v1.set(0, Foo(100));
v1.set(1, Foo(100));
lean_assert(v2.size() == 2);
lean_assert(v2[0].get_val() == 2);
lean_assert(v2[1].get_val() == 3);
parray<Foo> v3 = v1;
v1.pop_back();
v1.pop_back();
lean_assert(v1.size() == 10);
lean_assert(v3.size() == 12);
}
int main() {
save_stack_info();
initialize_util_module();
@ -139,7 +180,7 @@ int main() {
tst1();
tst2();
tst3(100000);
tst4();
tst_perf(100000, 10000);
finalize_library_module();