From 07be61200c8b5ed4b686450d57a590eaeffe66c7 Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Wed, 20 Jul 2011 15:44:18 +0000 Subject: [PATCH] bitset (operator[]): Make constexpr. 2011-07-20 Benjamin Kosnik * include/std/bitset (operator[]): Make constexpr. * testsuite/23_containers/bitset/operations/constexpr.cc: New. From-SVN: r176519 --- libstdc++-v3/ChangeLog | 5 +++ libstdc++-v3/include/std/bitset | 15 ++++--- .../bitset/operations/constexpr.cc | 40 +++++++++++++++++++ 3 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 libstdc++-v3/testsuite/23_containers/bitset/operations/constexpr.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 519f9cbb5f8..d5b759819bb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2011-07-20 Benjamin Kosnik + + * include/std/bitset (operator[]): Make constexpr. + * testsuite/23_containers/bitset/operations/constexpr.cc: New. + 2011-07-20 Paolo Carlini * include/debug/safe_local_iterator.h (_Safe_local_iterator<>:: diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset index 6d23df2cba8..f880e72bd0d 100644 --- a/libstdc++-v3/include/std/bitset +++ b/libstdc++-v3/include/std/bitset @@ -111,7 +111,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT { return _M_w[_S_whichword(__pos)]; } - _WordT + _GLIBCXX_CONSTEXPR _WordT _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT { return _M_w[_S_whichword(__pos)]; } @@ -221,12 +221,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER // find first "on" bit size_t - _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT; + _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT; // find the next "on" bit that follows "prev" size_t - _M_do_find_next(size_t __prev, size_t __not_found) const - _GLIBCXX_NOEXCEPT; + _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT; }; // Definitions of non-inline functions from _Base_bitset. @@ -405,7 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_getword(size_t) _GLIBCXX_NOEXCEPT { return _M_w; } - _WordT + _GLIBCXX_CONSTEXPR _WordT _M_getword(size_t) const _GLIBCXX_NOEXCEPT { return _M_w; } @@ -557,7 +556,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return *new _WordT; } - _WordT + _GLIBCXX_CONSTEXPR _WordT _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT { return 0; } @@ -1017,7 +1016,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return *this; } - bool + _GLIBCXX_CONSTEXPR bool _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos)) != static_cast<_WordT>(0)); } @@ -1122,7 +1121,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER operator[](size_t __position) { return reference(*this, __position); } - bool + _GLIBCXX_CONSTEXPR bool operator[](size_t __position) const { return _Unchecked_test(__position); } //@} diff --git a/libstdc++-v3/testsuite/23_containers/bitset/operations/constexpr.cc b/libstdc++-v3/testsuite/23_containers/bitset/operations/constexpr.cc new file mode 100644 index 00000000000..9f0fa3d3dc1 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/bitset/operations/constexpr.cc @@ -0,0 +1,40 @@ +// { 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 +// . + +#include + +int main() +{ + // bitset base type + typedef std::_Base_bitset<6> bitset_base; + constexpr bitset_base base = bitset_base(); + + constexpr auto r1 = base._M_getword(2); + // constexpr auto r2 = base._M_getdata(); // error, pointer to this + auto r2 = base._M_getdata(); + constexpr auto r3 = base._M_hiword(); + + // bitset operators + typedef std::bitset<6> bitset_type; + constexpr bitset_type a = bitset_type(); + constexpr auto v = a[0]; + + return 0; +} -- 2.30.2