Patchwork [v3] constexpr n3291 missing bits

login
register
mail settings
Submitter Benjamin Kosnik
Date July 20, 2011, 6:05 a.m.
Message ID <20110719230506.2a7747cb@shotwell>
Download mbox | patch
Permalink /patch/105584/
State New
Headers show

Comments

Benjamin Kosnik - July 20, 2011, 6:05 a.m.
While reviewing the state of gcc constexpr vs. ISO C++, I noticed that
the bitset access operator was missing, so I added it thusly.

Like ice cream on a hot summer day, the expanded constexpr diagnostics
do not disappoint. Thanks Jason!

An example:

testsuite/23_containers/bitset/operations/constexpr.cc:28:31: error:
call to non-constexpr function ‘constexpr bool
std::bitset<_Nb>::operator[](std::size_t) const [with long unsigned int
_Nb = 6ul, std::size_t = long unsigned int]’

In file included from 
bitset:1126:7: note: ‘constexpr bool
std::bitset<_Nb>::operator[](std::size_t) const [with long unsigned int
_Nb = 6ul, std::size_t = long unsigned int]’ is not constexpr because
it does not satisfy the requirements:

bitset:1127:42: error: call to non-constexpr function ‘constexpr bool
std::bitset<_Nb>::_Unchecked_test(std::size_t) const [with long
unsigned int _Nb = 6ul, std::size_t = long unsigned int]’

bitset:1021:7: note: ‘constexpr bool
std::bitset<_Nb>::_Unchecked_test(std::size_t) const [with long
unsigned int _Nb = 6ul, std::size_t = long unsigned int]’ is not
constexpr because it does not satisfy the requirements:

bitset:1023:28: error: call to non-constexpr function
‘std::_Base_bitset<1ul>::_WordT
std::_Base_bitset<1ul>::_M_getword(std::size_t) const’

Yay! This makes speculating about constexpr much easier to debug.


tested x86/linux

-benjamin

Patch

Index: include/std/bitset
===================================================================
--- include/std/bitset	(revision 176490)
+++ include/std/bitset	(working copy)
@@ -111,7 +111,7 @@ 
       _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 @@ 
 
       // 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 @@ 
       _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 @@ 
 	return *new _WordT;
       }
 
-      _WordT
+      _GLIBCXX_CONSTEXPR _WordT
       _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT
       { return 0; }
 
@@ -1017,7 +1016,7 @@ 
 	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 @@ 
       operator[](size_t __position)
       { return reference(*this, __position); }
 
-      bool
+      _GLIBCXX_CONSTEXPR bool
       operator[](size_t __position) const
       { return _Unchecked_test(__position); }
       //@}
Index: testsuite/23_containers/bitset/operations/constexpr.cc
===================================================================
--- testsuite/23_containers/bitset/operations/constexpr.cc	(revision 0)
+++ testsuite/23_containers/bitset/operations/constexpr.cc	(revision 0)
@@ -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
+// <http://www.gnu.org/licenses/>.
+
+#include <bitset>
+
+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;
+}