From cbb9305c264bbe11c2d972f1a80db7fffdbed82a Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Tue, 4 Mar 2014 20:31:21 +0000 Subject: [PATCH] LWG issue #2252: Add more tests for exception safety. No changes needed in the library git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@202885 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../push_back_exception_safety.pass.cpp | 24 ++++++++++++------- .../push_front_exception_safety.pass.cpp | 24 ++++++++++++------- .../push_back_exception_safety.pass.cpp | 24 ++++++++++++------- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp b/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp index 0aee63e3..3e628791 100644 --- a/test/containers/sequences/deque/deque.modifiers/push_back_exception_safety.pass.cpp +++ b/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 vec; vec.push_back(instance); + std::deque vec2(vec); gCopyConstructorShouldThow = true; try { vec.push_back(instance); } catch (...) { + assert(vec==vec2); } } diff --git a/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp b/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp index 662f9a48..6ae06db0 100644 --- a/test/containers/sequences/deque/deque.modifiers/push_front_exception_safety.pass.cpp +++ b/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 vec; vec.push_front(instance); + std::deque vec2(vec); gCopyConstructorShouldThow = true; try { vec.push_front(instance); } catch (...) { + assert(vec==vec2); } } diff --git a/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp b/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp index cd81e602..f232743b 100644 --- a/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp +++ b/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 vec; vec.push_back(instance); + std::vector vec2(vec); gCopyConstructorShouldThow = true; try { vec.push_back(instance); } catch (...) { + assert(vec==vec2); } }