Skip to content

Commit 48b8d55

Browse files
committed
Use more permissive checks in release
Compilers are allowed and able to optimise heap allocations, even if it means this has an observable effect when using a custom operator new(). This is true since C++17 and N3664.
1 parent 471a21c commit 48b8d55

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

tests/runtime_tests_make_observable.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ TEMPLATE_LIST_TEST_CASE("make observable", "[make_observable][owner]", owner_typ
1010
TestType ptr = oup::make_observable<get_object<TestType>, get_policy<TestType>>();
1111

1212
if constexpr (is_sealed<TestType>) {
13-
CHECK(mem_track.allocated() == 1u);
13+
CHECK_MAX_ALLOC(1u);
1414
} else {
15-
CHECK(mem_track.allocated() == 2u);
15+
CHECK_MAX_ALLOC(2u);
1616
}
1717
CHECK(ptr.get() != nullptr);
1818
CHECK(ptr->state_ == test_object::state::default_init);
@@ -35,9 +35,9 @@ TEMPLATE_LIST_TEST_CASE("make observable with arguments", "[make_observable][own
3535
test_object::state::special_init);
3636

3737
if constexpr (is_sealed<TestType>) {
38-
CHECK(mem_track.allocated() == 1u);
38+
CHECK_MAX_ALLOC(1u);
3939
} else {
40-
CHECK(mem_track.allocated() == 2u);
40+
CHECK_MAX_ALLOC(2u);
4141
}
4242
CHECK(ptr.get() != nullptr);
4343
CHECK(ptr->state_ == test_object::state::special_init);
@@ -84,7 +84,7 @@ TEST_CASE("make observable unique", "[make_observable][owner]") {
8484
{
8585
TestType ptr = oup::make_observable_unique<test_object>();
8686

87-
CHECK(mem_track.allocated() == 2u);
87+
CHECK_MAX_ALLOC(2u);
8888
CHECK(ptr.get() != nullptr);
8989
CHECK(ptr->state_ == test_object::state::default_init);
9090
CHECK_INSTANCES(1, 1);
@@ -100,7 +100,7 @@ TEST_CASE("make observable sealed", "[make_observable][owner]") {
100100
{
101101
TestType ptr = oup::make_observable_sealed<test_object>();
102102

103-
CHECK(mem_track.allocated() == 1u);
103+
CHECK_MAX_ALLOC(1u);
104104
CHECK(ptr.get() != nullptr);
105105
CHECK(ptr->state_ == test_object::state::default_init);
106106
CHECK_INSTANCES(1, 1);

tests/tests_common.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,16 @@ using owner_types = snatch::type_list<
630630
CHECK(mem_track.double_delete() == 0u); \
631631
} while (0)
632632

633+
#if defined(NDEBUG)
634+
// When not in debug (hence, assuming optimisations are turned on),
635+
// some compilers manage to optimise-out some heap allocations, so use a looser
636+
// check.
637+
# define CHECK_MAX_ALLOC(MAX_ALLOC) CHECK(mem_track.allocated() <= MAX_ALLOC)
638+
#else
639+
// In debug, allocations must be exactly as expected.
640+
# define CHECK_MAX_ALLOC(MAX_ALLOC) CHECK(mem_track.allocated() == MAX_ALLOC)
641+
#endif
642+
633643
// clang-format off
634644
#if defined(__clang__)
635645
# define SNATCH_WARNING_DISABLE_SELF_ASSIGN _Pragma("clang diagnostic ignored \"-Wself-assign-overloaded\"")

0 commit comments

Comments
 (0)