diff --git a/src/platform/utils.hpp b/src/platform/utils.hpp index f12eb05..7b5a7fc 100644 --- a/src/platform/utils.hpp +++ b/src/platform/utils.hpp @@ -169,12 +169,13 @@ namespace detail { typename std::enable_if::type, void>::value, int>::type = 0 > class optional { - bool holds_value = false; - union { + char x; T uvalue; }; + bool holds_value = false; + public: optional() noexcept {} @@ -201,7 +202,7 @@ namespace detail { optional& operator=(const optional& other) { optional copy(other); - swap(*this, copy); + swap(copy); return *this; } @@ -229,12 +230,8 @@ namespace detail { typename std::enable_if::type, optional>::value, int>::type = 0 > optional& operator=(U&& value) { - if(holds_value) { - uvalue = std::forward(value); - } else { - new (static_cast(std::addressof(uvalue))) T(std::forward(value)); - holds_value = true; - } + optional o(std::move(value)); + swap(o); return *this; } diff --git a/src/symbols/symbols_core.cpp b/src/symbols/symbols_core.cpp index 0ab9025..52f16f3 100644 --- a/src/symbols/symbols_core.cpp +++ b/src/symbols/symbols_core.cpp @@ -51,7 +51,7 @@ namespace detail { } std::vector resolve_frames(const std::vector& frames) { - std::vector trace(frames.size(), stacktrace_frame { 0, 0, UINT_LEAST32_MAX, "", "" }); + std::vector trace(frames.size(), null_frame); #if defined(CPPTRACE_GET_SYMBOLS_WITH_LIBDL) \ || defined(CPPTRACE_GET_SYMBOLS_WITH_DBGHELP) \ || defined(CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE) @@ -87,7 +87,7 @@ namespace detail { || defined(CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE) auto dlframes = get_frames_object_info(frames); #endif - std::vector trace(frames.size(), stacktrace_frame { 0, 0, UINT_LEAST32_MAX, "", "" }); + std::vector trace(frames.size(), null_frame); #ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBDL apply_trace(trace, libdl::resolve_frames(frames)); #endif