[Bug libstdc++/87431] New: valueless_by_exception() should unconditionally return false if all the constructors are noexcept

antoshkka at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Sep 25 10:22:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87431

            Bug ID: 87431
           Summary: valueless_by_exception() should unconditionally return
                    false if all the constructors are noexcept
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com
  Target Milestone: ---

Right now the variant::valueless_by_exception() calls !_M_valid() that is
defined like that:

      _M_valid() const noexcept
      {
        return this->_M_index != __index_type(variant_npos);
      }

Above code is quite complex for the optimizer. It may be profitable to detect
variant types that never have valueless_by_exception() state and re-implement
_M_valid:


      _M_valid() const noexcept
      {
        return __always_valid::value /*compile-time constant*/ ||
this->_M_index != __index_type(variant_npos);
      }

Such change would improve assembly for multiple functions including
comparisons, swap, get, constructors.


More information about the Gcc-bugs mailing list