mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
If __index_type is a smaller type than size_t, then the result of size_t(__index_type(-1)) is not equal to size_t(-1), but to an incorrect value such as size_t(255) or size_t(65535). The old implementation of variant<T...>::index() uses (size_t(__index_type(_M_index + 1)) - 1) which is always correct, but generates suboptimal code for many common cases. When the __index_type is size_t or valueless variants are not possible we can just return the value directly. When the number of alternatives is sufficiently small the result of converting the _M_index value to the corresponding signed type will be either non-negative or -1. In those cases converting to the signed type and then to size_t will either produce the correct positive value or will sign extend -1 to (size_t)-1 as desired. For the remaining case we keep the existing arithmetic operations to ensure the correct result. PR libstdc++/91788 (partial) * include/std/variant (variant::index()): Improve codegen for cases where conversion to size_t already works correctly. From-SVN: r276056
file: libstdc++-v3/README New users may wish to point their web browsers to the file index.html in the 'doc/html' subdirectory. It contains brief building instructions and notes on how to configure the library in interesting ways.