-
-
Notifications
You must be signed in to change notification settings - Fork 194
Description
IMMER_RETHROW causes warnings in IMMER_NO_EXCEPTIONS builds.
Our build actually has exceptions support, but it's under GCC so immer thinks they're turned off. The detection of whether exceptions are supported or not is incorrect but I think that's a different bug (probably related to #168). This bug would apply equally to cases where exceptions were disabled deliberately.
Under GCC, with an unoptimized build, and with address sanitizer, this section of immer/detail/hamts/champ.hpp:
( https://github.com/arximboldi/immer/blob/master/immer/detail/hamts/champ.hpp#LL601C1-L614C1 )
else {
auto child = node_t::make_merged(
shift + B, std::move(v), hash, *val, Hash{}(*val));
IMMER_TRY {
return {node_t::copy_inner_replace_merged(
node, bit, offset, child),
true};
}
IMMER_CATCH (...) {
node_t::delete_deep_shift(child, shift + B);
IMMER_RETHROW;
}
}Yields a warning, which our build considers fatal. With ASAN, the compiler cannot see (for whatever reason) that the IMMER_TRY => if (true) is certain. So it considers IMMER_RETHROW to be reachable from the IMMER_CATCH => else branch.
The root cause is that IMMER_RETHROW is empty, (introduced by #160) and this looks like do_add falling off the end of the function without a return statement. I think IMMER_RETHROW should probably be a call to std::terminate or another noreturn function, so the compiler knows that it's not a return path.
src/third_party/immer/dist/immer/detail/hamts/champ.hpp:620:5: warning: control reaches end of non-void function [-Wreturn-type]
620 | }
| ^