diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2014-03-04 20:31:21 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2014-03-04 20:31:21 +0000 |
commit | d9e7cf3efd7cec5c82143baef8119dfd15988b87 (patch) | |
tree | c59418b344bfa462b19e62ad37123c284d2a961c /libcxx/test | |
parent | 7493a293987e100f97c6dbfe114442d0b39ee754 (diff) | |
download | bcm5719-llvm-d9e7cf3efd7cec5c82143baef8119dfd15988b87.tar.gz bcm5719-llvm-d9e7cf3efd7cec5c82143baef8119dfd15988b87.zip |
LWG issue #2252: Add more tests for exception safety. No changes needed in the library
llvm-svn: 202885
Diffstat (limited to 'libcxx/test')
3 files changed, 48 insertions, 24 deletions
diff --git a/libcxx/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp b/libcxx/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp index 0aee63e3314..3e628791a9f 100644 --- a/libcxx/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp +++ b/libcxx/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp @@ -19,12 +19,16 @@ static bool gCopyConstructorShouldThow = false; class CMyClass { - public: CMyClass(); + public: CMyClass(int tag); public: CMyClass(const CMyClass& iOther); public: ~CMyClass(); - private: int fMagicValue; - + bool equal(const CMyClass &rhs) const + { return fTag == rhs.fTag && fMagicValue == rhs.fMagicValue; } + private: + int fMagicValue; + int fTag; + private: static int kStartedConstructionMagicValue; private: static int kFinishedConstructionMagicValue; }; @@ -34,15 +38,15 @@ int CMyClass::kStartedConstructionMagicValue = 0; // Value for fMagicValue when the constructor has finished running int CMyClass::kFinishedConstructionMagicValue = 12345; -CMyClass::CMyClass() : - fMagicValue(kStartedConstructionMagicValue) +CMyClass::CMyClass(int tag) : + fMagicValue(kStartedConstructionMagicValue), fTag(tag) { // Signal that the constructor has finished running fMagicValue = kFinishedConstructionMagicValue; } -CMyClass::CMyClass(const CMyClass& /*iOther*/) : - fMagicValue(kStartedConstructionMagicValue) +CMyClass::CMyClass(const CMyClass& iOther) : + fMagicValue(kStartedConstructionMagicValue), fTag(iOther.fTag) { // If requested, throw an exception _before_ setting fMagicValue to kFinishedConstructionMagicValue if (gCopyConstructorShouldThow) { @@ -57,17 +61,21 @@ CMyClass::~CMyClass() { assert(fMagicValue == kFinishedConstructionMagicValue); } +bool operator==(const CMyClass &lhs, const CMyClass &rhs) { return lhs.equal(rhs); } + int main() { - CMyClass instance; + CMyClass instance(42); std::deque<CMyClass> vec; vec.push_back(instance); + std::deque<CMyClass> vec2(vec); gCopyConstructorShouldThow = true; try { vec.push_back(instance); } catch (...) { + assert(vec==vec2); } } diff --git a/libcxx/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp b/libcxx/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp index 662f9a48a3c..6ae06db0bca 100644 --- a/libcxx/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp +++ b/libcxx/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp @@ -19,12 +19,16 @@ static bool gCopyConstructorShouldThow = false; class CMyClass { - public: CMyClass(); + public: CMyClass(int tag); public: CMyClass(const CMyClass& iOther); public: ~CMyClass(); - private: int fMagicValue; - + bool equal(const CMyClass &rhs) const + { return fTag == rhs.fTag && fMagicValue == rhs.fMagicValue; } + private: + int fMagicValue; + int fTag; + private: static int kStartedConstructionMagicValue; private: static int kFinishedConstructionMagicValue; }; @@ -34,15 +38,15 @@ int CMyClass::kStartedConstructionMagicValue = 0; // Value for fMagicValue when the constructor has finished running int CMyClass::kFinishedConstructionMagicValue = 12345; -CMyClass::CMyClass() : - fMagicValue(kStartedConstructionMagicValue) +CMyClass::CMyClass(int tag) : + fMagicValue(kStartedConstructionMagicValue), fTag(tag) { // Signal that the constructor has finished running fMagicValue = kFinishedConstructionMagicValue; } -CMyClass::CMyClass(const CMyClass& /*iOther*/) : - fMagicValue(kStartedConstructionMagicValue) +CMyClass::CMyClass(const CMyClass& iOther) : + fMagicValue(kStartedConstructionMagicValue), fTag(iOther.fTag) { // If requested, throw an exception _before_ setting fMagicValue to kFinishedConstructionMagicValue if (gCopyConstructorShouldThow) { @@ -57,17 +61,21 @@ CMyClass::~CMyClass() { assert(fMagicValue == kFinishedConstructionMagicValue); } +bool operator==(const CMyClass &lhs, const CMyClass &rhs) { return lhs.equal(rhs); } + int main() { - CMyClass instance; + CMyClass instance(42); std::deque<CMyClass> vec; vec.push_front(instance); + std::deque<CMyClass> vec2(vec); gCopyConstructorShouldThow = true; try { vec.push_front(instance); } catch (...) { + assert(vec==vec2); } } diff --git a/libcxx/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp b/libcxx/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp index cd81e6028e2..f232743b5ca 100644 --- a/libcxx/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp +++ b/libcxx/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp @@ -19,12 +19,16 @@ static bool gCopyConstructorShouldThow = false; class CMyClass { - public: CMyClass(); + public: CMyClass(int tag); public: CMyClass(const CMyClass& iOther); public: ~CMyClass(); - private: int fMagicValue; - + bool equal(const CMyClass &rhs) const + { return fTag == rhs.fTag && fMagicValue == rhs.fMagicValue; } + private: + int fMagicValue; + int fTag; + private: static int kStartedConstructionMagicValue; private: static int kFinishedConstructionMagicValue; }; @@ -34,15 +38,15 @@ int CMyClass::kStartedConstructionMagicValue = 0; // Value for fMagicValue when the constructor has finished running int CMyClass::kFinishedConstructionMagicValue = 12345; -CMyClass::CMyClass() : - fMagicValue(kStartedConstructionMagicValue) +CMyClass::CMyClass(int tag) : + fMagicValue(kStartedConstructionMagicValue), fTag(tag) { // Signal that the constructor has finished running fMagicValue = kFinishedConstructionMagicValue; } -CMyClass::CMyClass(const CMyClass& /*iOther*/) : - fMagicValue(kStartedConstructionMagicValue) +CMyClass::CMyClass(const CMyClass& iOther) : + fMagicValue(kStartedConstructionMagicValue), fTag(iOther.fTag) { // If requested, throw an exception _before_ setting fMagicValue to kFinishedConstructionMagicValue if (gCopyConstructorShouldThow) { @@ -57,17 +61,21 @@ CMyClass::~CMyClass() { assert(fMagicValue == kFinishedConstructionMagicValue); } +bool operator==(const CMyClass &lhs, const CMyClass &rhs) { return lhs.equal(rhs); } + int main() { - CMyClass instance; + CMyClass instance(42); std::vector<CMyClass> vec; vec.push_back(instance); + std::vector<CMyClass> vec2(vec); gCopyConstructorShouldThow = true; try { vec.push_back(instance); } catch (...) { + assert(vec==vec2); } } |