[libcxx] r231729 - [libcxx] Fix __RAII_IncreaseAnnotator for increases >= 1
Eric Fiselier
eric at efcs.ca
Mon Mar 9 17:25:21 PDT 2015
Author: ericwf
Date: Mon Mar 9 19:25:20 2015
New Revision: 231729
URL: http://llvm.org/viewvc/llvm-project?rev=231729&view=rev
Log:
[libcxx] Fix __RAII_IncreaseAnnotator for increases >= 1
Summary: Fix suggested by @mclow.lists on D8109. Store the size of the un-poisoned vector upon construction instead of calculating it later.
Reviewers: titus, mclow.lists, kcc, EricWF
Reviewed By: EricWF
Subscribers: mclow.lists, cfe-commits
Differential Revision: http://reviews.llvm.org/D8172
Modified:
libcxx/trunk/include/vector
libcxx/trunk/test/std/containers/sequences/vector/asan_throw.pass.cpp
Modified: libcxx/trunk/include/vector
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/vector?rev=231729&r1=231728&r2=231729&view=diff
==============================================================================
--- libcxx/trunk/include/vector (original)
+++ libcxx/trunk/include/vector Mon Mar 9 19:25:20 2015
@@ -868,17 +868,17 @@ private:
// but if an exception is thrown after that the annotation has to be undone.
struct __RAII_IncreaseAnnotator {
__RAII_IncreaseAnnotator(const vector &__v, size_type __n = 1)
- : __commit(false), __v(__v), __n(__n) {
+ : __commit(false), __v(__v), __old_size(__v.size() + __n) {
__v.__annotate_increase(__n);
}
void __done() { __commit = true; }
~__RAII_IncreaseAnnotator() {
if (__commit) return;
- __v.__annotate_shrink(__v.size() + __n);
+ __v.__annotate_shrink(__old_size);
}
bool __commit;
- size_type __n;
const vector &__v;
+ size_type __old_size;
};
#else
struct __RAII_IncreaseAnnotator {
Modified: libcxx/trunk/test/std/containers/sequences/vector/asan_throw.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/vector/asan_throw.pass.cpp?rev=231729&r1=231728&r2=231729&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/vector/asan_throw.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/vector/asan_throw.pass.cpp Mon Mar 9 19:25:20 2015
@@ -37,6 +37,22 @@ private:
char a;
};
+class ThrowOnCopy {
+public:
+ ThrowOnCopy() : should_throw(false) {}
+ explicit ThrowOnCopy(bool should_throw) : should_throw(should_throw) {}
+
+ ThrowOnCopy(ThrowOnCopy const & other)
+ : should_throw(other.should_throw)
+ {
+ if (should_throw) {
+ throw 0;
+ }
+ }
+
+ bool should_throw;
+};
+
void test_push_back() {
std::vector<X> v;
v.reserve(2);
@@ -157,6 +173,23 @@ void test_insert_n() {
assert(0);
}
+
+void test_insert_n2() {
+ std::vector<ThrowOnCopy> v(10);
+ v.reserve(100);
+ assert(v.size() == 10);
+ v[6].should_throw = true;
+ try {
+ v.insert(v.cbegin(), 5, ThrowOnCopy());
+ assert(0);
+ } catch (int e) {
+ assert(v.size() == 11);
+ assert(is_contiguous_container_asan_correct(v));
+ return;
+ }
+ assert(0);
+}
+
void test_resize() {
std::vector<X> v;
v.reserve(3);
@@ -193,6 +226,7 @@ int main() {
test_emplace();
test_insert_range2();
test_insert_n();
+ test_insert_n2();
test_resize();
test_resize_param();
}
More information about the cfe-commits
mailing list