diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 545247e3e537..54fe95f1ac96 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2019-09-23 Jonathan Wakely + + PR libstdc++/91788 (partial) + * include/std/variant (variant::index()): Improve codegen for cases + where conversion to size_t already works correctly. + 2019-09-23 Andreas Schwab * config/abi/post/riscv64-linux-gnu/baseline_symbols.txt: Update. diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index d93ea86ea296..c0043243ec29 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -1518,7 +1518,17 @@ namespace __variant { return !this->_M_valid(); } constexpr size_t index() const noexcept - { return size_t(typename _Base::__index_type(this->_M_index + 1)) - 1; } + { + using __index_type = typename _Base::__index_type; + if constexpr (is_same_v<__index_type, size_t>) + return this->_M_index; + else if constexpr (__detail::__variant::__never_valueless<_Types...>()) + return this->_M_index; + else if constexpr (sizeof...(_Types) <= __index_type(-1) / 2) + return make_signed_t<__index_type>(this->_M_index); + else + return size_t(__index_type(this->_M_index + 1)) - 1; + } void swap(variant& __rhs)