called from within the dtor, this may otherwise cause UB (fixes #7).main
@@ -28,7 +28,7 @@ namespace sr | |||
{ | |||
if( m_execute_on_destruction == true ) | |||
{ | |||
m_deleter(); | |||
callDeleterSafe(); | |||
} | |||
} | |||
@@ -45,6 +45,16 @@ namespace sr | |||
private: | |||
void callDeleterSafe() noexcept | |||
{ | |||
try | |||
{ | |||
m_deleter(); | |||
} | |||
catch( ... ) { /* Empty */ } | |||
} | |||
Deleter m_deleter; | |||
bool m_execute_on_destruction; | |||
}; |
@@ -64,3 +64,10 @@ TEST_CASE("move transfers state if released", "[ScopeGuard]") | |||
REQUIRE(executed == false); | |||
} | |||
TEST_CASE("no exception propagation from deleter", "[ScopeGuard]") | |||
{ | |||
REQUIRE_NOTHROW([] { | |||
auto guard = sr::scope_guard([] { throw "Don't propagate this!"; }); | |||
static_cast<void>(guard); | |||
}()); | |||
} |