[Bug libstdc++/53080] New: std::array - std::get() and std::tuple_element is nothing bounds check

faithandbrave at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Apr 23 02:15:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53080

             Bug #: 53080
           Summary: std::array - std::get() and std::tuple_element is
                    nothing bounds check
    Classification: Unclassified
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: faithandbrave@gmail.com


"23.3.2.9 Tuple interface to class template array" in N3337(C++ Specification
Draft)

tuple_element<I, array<T, N> >::type
Requires: I < N. The program is ill-formed if I is out of bounds.

template <size_t I, class T, size_t N> T& get(array<T, N>& a) noexcept;
Requires: I < N. The program is ill-formed if I is out of bounds.

GCC 4.7.0 libstdc++ <array> header is no check bounds.
I think need static_assert to tuple_element and get().

Issue code is follow:

template<std::size_t _Int, typename _Tp, std::size_t _Nm>
struct tuple_element<_Int, array<_Tp, _Nm> >
  { typedef _Tp type; };

template<std::size_t _Int, typename _Tp, std::size_t _Nm>
  constexpr _Tp&
  get(array<_Tp, _Nm>& __arr) noexcept
  { return __arr._M_instance[_Int]; }

template<std::size_t _Int, typename _Tp, std::size_t _Nm>
  constexpr _Tp&&
  get(array<_Tp, _Nm>&& __arr) noexcept
  { return std::move(get<_Int>(__arr)); }

template<std::size_t _Int, typename _Tp, std::size_t _Nm>
  constexpr const _Tp&
  get(const array<_Tp, _Nm>& __arr) noexcept
  { return __arr._M_instance[_Int]; }



More information about the Gcc-bugs mailing list