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

            Bug ID: 89090
           Summary: vector.tcc uses "if constexpr"  in C++11 mode
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: csaba_22 at yahoo dot co.uk
  Target Milestone: ---

vector.tcc contains the following at line 613
#if __cplusplus >= 201103L
  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    _M_default_append(size_type __n)
    {
      if (__n != 0)
        {
          const size_type __size = size();
          size_type __navail = size_type(this->_M_impl._M_end_of_storage
                                         - this->_M_impl._M_finish);

          if (__size > max_size() || __navail > max_size() - __size)
            __builtin_unreachable();

          if (__navail >= __n)
            {
              _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
              this->_M_impl._M_finish =
                std::__uninitialized_default_n_a(this->_M_impl._M_finish,
                                                 __n, _M_get_Tp_allocator());
              _GLIBCXX_ASAN_ANNOTATE_GREW(__n);
            }
          else
            {
              const size_type __len =
                _M_check_len(__n, "vector::_M_default_append");
              pointer __new_start(this->_M_allocate(__len));
#if __cplusplus >= 201103L
              if constexpr (__use_relocate)
                {
                  __try
                    {
                      std::__uninitialized_default_n_a(__new_start + __size,
                              __n, _M_get_Tp_allocator());
                    }
                  __catch(...)
                    {
                      _M_deallocate(__new_start, __len);
                      __throw_exception_again;
                    }
                  std::__relocate_a(this->_M_impl._M_start,
                                    this->_M_impl._M_finish,
                                    __new_start, _M_get_Tp_allocator());
                }
              else
#endif
                {
                  pointer __destroy_from = pointer();
                  __try
                    {
                      std::__uninitialized_default_n_a(__new_start + __size,
                              __n, _M_get_Tp_allocator());
                      __destroy_from = __new_start + __size;
                      std::__uninitialized_move_if_noexcept_a(
                              this->_M_impl._M_start, this->_M_impl._M_finish,
                              __new_start, _M_get_Tp_allocator());
                    }
                  __catch(...)
                    {
                      if (__destroy_from)
                        std::_Destroy(__destroy_from, __destroy_from + __n,
                                      _M_get_Tp_allocator());
                      _M_deallocate(__new_start, __len);
                      __throw_exception_again;
                    }
                  std::_Destroy(this->_M_impl._M_start,
this->_M_impl._M_finish,
                                _M_get_Tp_allocator());
                }
              _GLIBCXX_ASAN_ANNOTATE_REINIT;
              _M_deallocate(this->_M_impl._M_start,
                            this->_M_impl._M_end_of_storage
                            - this->_M_impl._M_start);
              this->_M_impl._M_start = __new_start;
              this->_M_impl._M_finish = __new_start + __size + __n;
              this->_M_impl._M_end_of_storage = __new_start + __len;
            }
        }
    }

The two nested "#if __cplusplus >= 201103L" checks are suspicious (copy-paste
error?)
Generating preprocessor output from a one-liner of #include <vector> with
-std=c++11 -save-temps results in a .ii file which shouldn't even compile in
C++11 mode.

Reply via email to