diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ec1897ca4cd7a459d103fa74d05de6bf97e9ac79..ae002030156f7e3d30c1dacd89f1a958dc3424cb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,9 +1,16 @@ +2011-07-20 Benjamin Kosnik <bkoz@redhat.com> + Daniel Krugler <daniel.kruegler@googlemail.com> + + * include/std/array (array::at, array::operator[]): Mark constexpr. + * testsuite/23_containers/array/requirements/ + constexpr_element_access.cc: Add. + 2011-07-20 Benjamin Kosnik <bkoz@redhat.com> Daniel Krugler <daniel.kruegler@googlemail.com> * include/std/chrono: (system_clock::is_steady): Update to N3291 from is_monotonic. - (time_point): Add constexpr to nonmember arithmetic operators. + (time_point): Mark nonmember arithmetic operators constexpr. * src/chrono.cc: Modify for above. * src/compatibility-c++0x.cc: Same. * testsuite/20_util/time_point/nonmember/constexpr.cc: New. diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index 474b884ecb5b77bfb3589dc6c702aeeb3bfc7593..0abb628aded01fbadbe8fb16a992e2477df80d59 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -35,6 +35,7 @@ # include <bits/c++0x_warning.h> #else +#include <stdexcept> #include <bits/stl_algobase.h> #include <bits/range_access.h> @@ -150,8 +151,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator[](size_type __n) { return _M_instance[__n]; } - const_reference - operator[](size_type __n) const + constexpr const_reference + operator[](size_type __n) const noexcept { return _M_instance[__n]; } reference @@ -162,12 +163,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return _M_instance[__n]; } - const_reference + constexpr const_reference at(size_type __n) const { - if (__n >= _Nm) - std::__throw_out_of_range(__N("array::at")); - return _M_instance[__n]; + return __n < _Nm ? _M_instance[__n] : +#ifdef __EXCEPTIONS + throw out_of_range(__N("array::at")); +#else + _M_instance[0]; +#endif } reference diff --git a/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_element_access.cc b/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_element_access.cc new file mode 100644 index 0000000000000000000000000000000000000000..23bc104aeab1e91fda6196c7761000e4ca677d25 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_element_access.cc @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2011 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <array> + +int main() +{ + // array + typedef std::array<std::size_t, 6> array_type; + constexpr array_type a = { 0, 55, 66, 99, 4115, 2 }; + constexpr auto v1 = a[1]; + constexpr auto v2 = a.at(2); + return 0; +}