diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-21 05:48:03 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-21 05:48:03 +0000 |
commit | 928134fff0dd1c1d76ab084e5fad20744e336dbf (patch) | |
tree | 3307f0f8f04a21abe09deaa14276b8d1498d7353 /libstdc++-v3 | |
parent | cd9f496fd38314abcc660f35881b6658843706f0 (diff) | |
download | gcc-928134fff0dd1c1d76ab084e5fad20744e336dbf.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176550 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/std/array | 16 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_element_access.cc | 31 |
3 files changed, 49 insertions, 7 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ec1897ca4cd..ae002030156 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 474b884ecb5..0abb628aded 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 00000000000..23bc104aeab --- /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; +} |