array (array::at, [...]): Mark constexpr.

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.


Co-Authored-By: Daniel Krugler <daniel.kruegler@googlemail.com>

From-SVN: r176550
This commit is contained in:
Benjamin Kosnik 2011-07-21 05:48:03 +00:00 committed by Benjamin Kosnik
parent 1b97ec17bc
commit bfef3a711a
3 changed files with 49 additions and 7 deletions

View File

@ -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> 2011-07-20 Benjamin Kosnik <bkoz@redhat.com>
Daniel Krugler <daniel.kruegler@googlemail.com> Daniel Krugler <daniel.kruegler@googlemail.com>
* include/std/chrono: (system_clock::is_steady): Update to N3291 * include/std/chrono: (system_clock::is_steady): Update to N3291
from is_monotonic. 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/chrono.cc: Modify for above.
* src/compatibility-c++0x.cc: Same. * src/compatibility-c++0x.cc: Same.
* testsuite/20_util/time_point/nonmember/constexpr.cc: New. * testsuite/20_util/time_point/nonmember/constexpr.cc: New.

View File

@ -35,6 +35,7 @@
# include <bits/c++0x_warning.h> # include <bits/c++0x_warning.h>
#else #else
#include <stdexcept>
#include <bits/stl_algobase.h> #include <bits/stl_algobase.h>
#include <bits/range_access.h> #include <bits/range_access.h>
@ -150,8 +151,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
operator[](size_type __n) operator[](size_type __n)
{ return _M_instance[__n]; } { return _M_instance[__n]; }
const_reference constexpr const_reference
operator[](size_type __n) const operator[](size_type __n) const noexcept
{ return _M_instance[__n]; } { return _M_instance[__n]; }
reference reference
@ -162,12 +163,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return _M_instance[__n]; return _M_instance[__n];
} }
const_reference constexpr const_reference
at(size_type __n) const at(size_type __n) const
{ {
if (__n >= _Nm) return __n < _Nm ? _M_instance[__n] :
std::__throw_out_of_range(__N("array::at")); #ifdef __EXCEPTIONS
return _M_instance[__n]; throw out_of_range(__N("array::at"));
#else
_M_instance[0];
#endif
} }
reference reference

View File

@ -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;
}