aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386>2009-10-01 21:56:16 +0000
committerzhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386>2009-10-01 21:56:16 +0000
commit7c95d8346e9c62e9d6d7e8202fbcfb34c4404db9 (patch)
tree4208fb4a76d605c834925493e87a3522d7e60682
parent79643f51ed835bc8c897fb429a9d77a41701d7ad (diff)
downloadgoogletest-7c95d8346e9c62e9d6d7e8202fbcfb34c4404db9.tar.gz
googletest-7c95d8346e9c62e9d6d7e8202fbcfb34c4404db9.tar.bz2
googletest-7c95d8346e9c62e9d6d7e8202fbcfb34c4404db9.zip
Works around a Symbian compiler bug that causes memory leak (by Mika Raento).
-rw-r--r--include/gmock/gmock-spec-builders.h13
-rw-r--r--src/gmock-spec-builders.cc8
2 files changed, 18 insertions, 3 deletions
diff --git a/include/gmock/gmock-spec-builders.h b/include/gmock/gmock-spec-builders.h
index 0748d9d4..765e06d9 100644
--- a/include/gmock/gmock-spec-builders.h
+++ b/include/gmock/gmock-spec-builders.h
@@ -351,10 +351,18 @@ class Mock {
// - Constness is shallow: a const Expectation object itself cannot
// be modified, but the mutable methods of the ExpectationBase
// object it references can be called via expectation_base().
+// - The constructors and destructor are defined out-of-line because
+// the Symbian WINSCW compiler wants to otherwise instantiate them
+// when it sees this class definition, at which point it doesn't have
+// ExpectationBase available yet, leading to incorrect destruction
+// in the linked_ptr (or compilation errors if using a checking
+// linked_ptr).
class Expectation {
public:
// Constructs a null object that doesn't reference any expectation.
- Expectation() {}
+ Expectation();
+
+ ~Expectation();
// This single-argument ctor must not be explicit, in order to support the
// Expectation e = EXPECT_CALL(...);
@@ -399,8 +407,7 @@ class Expectation {
typedef ::std::set<Expectation, Less> Set;
Expectation(
- const internal::linked_ptr<internal::ExpectationBase>& expectation_base) :
- expectation_base_(expectation_base) {}
+ const internal::linked_ptr<internal::ExpectationBase>& expectation_base);
// Returns the expectation this object references.
const internal::linked_ptr<internal::ExpectationBase>&
diff --git a/src/gmock-spec-builders.cc b/src/gmock-spec-builders.cc
index 72558658..6cc94ddd 100644
--- a/src/gmock-spec-builders.cc
+++ b/src/gmock-spec-builders.cc
@@ -420,6 +420,14 @@ void Mock::ClearDefaultActionsLocked(void* mock_obj) {
// needed by VerifyAndClearExpectationsLocked().
}
+Expectation::Expectation() {}
+
+Expectation::Expectation(
+ const internal::linked_ptr<internal::ExpectationBase>& expectation_base)
+ : expectation_base_(expectation_base) {}
+
+Expectation::~Expectation() {}
+
// Adds an expectation to a sequence.
void Sequence::AddExpectation(const Expectation& expectation) const {
if (*last_expectation_ != expectation) {