`make_opaque_handle()` causes compiler to segfault when defining constexpr local shorthand for local class"s `noexcept`s: `is_nothrow`

Fortune for opaque_handle's current commit: Future small blessing − 末小吉
master
Avril 3 years ago
parent 70d92c60b1
commit 742aa072ec
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -210,7 +210,7 @@ concept OpaqueHandleFunc = std::is_invocable_v<F, T*, opaque_handle_operation>
template<typename T, OpaqueHandleFunc<T> HandleF> // Note: This should be a lambda, or a free-function. it's lifetime must not end before the `opaque_handle` returned from this function does. template<typename T, OpaqueHandleFunc<T> HandleF> // Note: This should be a lambda, or a free-function. it's lifetime must not end before the `opaque_handle` returned from this function does.
constexpr inline opaque_handle make_opaque_handle(T* data, const HandleF& handler) noexcept constexpr inline opaque_handle make_opaque_handle(T* data, const HandleF& handler) noexcept
{ {
constexpr bool is_nothrow = std::is_nothrow_invocable_v<HandleF, T*, opaque_handle_operation>; constexpr const bool is_nothrow = std::is_nothrow_invocable_v<HandleF, T*, opaque_handle_operation>;
struct object_handler struct object_handler
{ {
@ -242,8 +242,8 @@ constexpr inline opaque_handle make_opaque_handle(T* data, const HandleF& handle
template<typename T, OpaqueHandleFunc<T> HandleF> template<typename T, OpaqueHandleFunc<T> HandleF>
constexpr inline opaque_handle make_opaque_handle(T* data, HandleF&& handler) noexcept(std::is_nothrow_move_constructible_v<HandleF>) constexpr inline opaque_handle make_opaque_handle(T* data, HandleF&& handler) noexcept(std::is_nothrow_move_constructible_v<HandleF>)
{ {
constexpr bool is_nothrow = std::is_nothrow_invocable_v<HandleF, T*, opaque_handle_operation>; constexpr const bool is_nothrow = std::is_nothrow_invocable_v<HandleF, T*, opaque_handle_operation>;
constexpr bool is_nothrow_ctor = std::is_nothrow_move_constructible_v<HandleF>; constexpr const bool is_nothrow_ctor = std::is_nothrow_move_constructible_v<HandleF>;
struct object_handler struct object_handler
{ {

@ -27,9 +27,25 @@ static inline void print(const std::string& string)
return print_view(sv); return print_view(sv);
} }
void use_moh()
{
std::string str{"Hello from 2!"};
opaque_handle v{make_opaque_handle<std::string>(&str, [](std::string* ptr, auto op) noexcept {
if(ptr) {
switch(op) {
case opaque_handle_operation::Clone: return new std::string(*ptr);
case opaque_handle_operation::Delete: delete ptr; break;
}
}
return static_cast<std::string*>(nullptr);
})};
print(*v);
}
int main() int main()
{ {
const opaque_handle v{make_opaque_object_handle(std::string{"Hello world"})}; const opaque_handle v{make_opaque_object_handle(std::string{"Hello world"})};
print(*v); //XXX: Why does converting it to string_view here break it? print(*v); //XXX: Why does converting it to string_view here break it?
use_moh();
return 0; return 0;
} }

Loading…
Cancel
Save