Hi,
noticed this while investigating the spurious failure of
bitset/operations/constexpr.cc in debug-mode. Unfortunately debug-mode
bitset checking is pretty weak in C++0x mode (for other reasons too),
but at least now the operator is conforming and the testsuite is clean.
Committed to mainline.
Thanks,
Paolo.
/////////////////
2011-11-19 Paolo Carlini <paolo.carl...@oracle.com>
* include/debug/bitset (operator[](size_t) const): Declare constexpr.
* include/profile/bitset: Likewise.
* testsuite/23_containers/bitset/operations/constexpr.cc: Split out
non portable bits to...
* testsuite/23_containers/bitset/operations/constexpr-2.cc: ... here.
Index: include/debug/bitset
===================================================================
--- include/debug/bitset (revision 181505)
+++ include/debug/bitset (working copy)
@@ -51,7 +51,7 @@
public:
// In C++0x we rely on normal reference type to preserve the property
// of bitset to be use as a literal.
- // TODO: Find an other solution.
+ // TODO: Find another solution.
#ifdef __GXX_EXPERIMENTAL_CXX0X__
typedef typename _Base::reference reference;
#else
@@ -272,11 +272,14 @@
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 11. Bitset minor problems
- bool
+ _GLIBCXX_CONSTEXPR bool
operator[](size_t __pos) const
{
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
+ // TODO: Check in debug-mode too.
__glibcxx_check_subscript(__pos);
- return _M_base()[__pos];
+#endif
+ return _Base::operator[](__pos);
}
using _Base::to_ulong;
Index: include/profile/bitset
===================================================================
--- include/profile/bitset (revision 181505)
+++ include/profile/bitset (working copy)
@@ -232,10 +232,10 @@
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 11. Bitset minor problems
- bool
+ _GLIBCXX_CONSTEXPR bool
operator[](size_t __pos) const
{
- return _M_base()[__pos];
+ return _Base::operator[](__pos);
}
using _Base::to_ulong;
Index: testsuite/23_containers/bitset/operations/constexpr-2.cc
===================================================================
--- testsuite/23_containers/bitset/operations/constexpr-2.cc (revision
181505)
+++ testsuite/23_containers/bitset/operations/constexpr-2.cc (working copy)
@@ -1,4 +1,5 @@
// { dg-do compile }
+// { dg-require-normal-mode "" }
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2011 Free Software Foundation, Inc.
@@ -31,10 +32,5 @@
auto r2 __attribute__((unused)) = base._M_getdata();
constexpr auto r3 __attribute__((unused)) = base._M_hiword();
- // bitset operators
- typedef std::bitset<6> bitset_type;
- constexpr bitset_type a = bitset_type();
- constexpr auto v __attribute__((unused)) = a[0];
-
return 0;
}
Index: testsuite/23_containers/bitset/operations/constexpr.cc
===================================================================
--- testsuite/23_containers/bitset/operations/constexpr.cc (revision
181505)
+++ testsuite/23_containers/bitset/operations/constexpr.cc (working copy)
@@ -22,15 +22,6 @@
int main()
{
- // bitset base type
- typedef std::_Base_bitset<6> bitset_base;
- constexpr bitset_base base = bitset_base();
-
- constexpr auto r1 __attribute__((unused)) = base._M_getword(2);
- // constexpr auto r2 = base._M_getdata(); // error, pointer to this
- auto r2 __attribute__((unused)) = base._M_getdata();
- constexpr auto r3 __attribute__((unused)) = base._M_hiword();
-
// bitset operators
typedef std::bitset<6> bitset_type;
constexpr bitset_type a = bitset_type();