Patchwork [v3] Fix bitset::operator[] const in debug/profile mode

login
register
mail settings
Submitter Paolo Carlini
Date Nov. 19, 2011, 11:53 a.m.
Message ID <4EC798A8.9000503@oracle.com>
Download mbox | patch
Permalink /patch/126539/
State New
Headers show

Comments

Paolo Carlini - Nov. 19, 2011, 11:53 a.m.
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.carlini@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.

Patch

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();