diff mbox

libstdc++/56193 re-add basic_ios::operator bool()

Message ID 20140924221814.GZ2669@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Sept. 24, 2014, 10:18 p.m. UTC
This changes operator void*() to operator bool(), and ensures we
export both from the library.

I have a new test for this, but will commit that tomorrow.

Tested x86_64-linux, committed to trunk.
diff mbox

Patch

commit 65eba18bbe122c7e274a81aace7e7290645245c8
Author: redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Wed Sep 24 22:13:35 2014 +0000

    	PR libstdc++/56193
    	* config/abi/pre/gnu.ver: Add new exports.
    	* include/bits/basic_ios.h (basic_ios::operator bool): Define.
    	* src/c++98/ios_locale.cc (basic_ios::operator void*): Instantiate.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215571 138bc75d-0d04-0410-961f-82ee72b054a4

diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index 63985fd..0559444 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -1470,6 +1470,9 @@  GLIBCXX_3.4.21 {
     _ZNSoC[12]ERSd;
     _ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]ERSt14basic_iostreamIwS1_E;
 
+    # std::basic_ios::operator bool() const
+    _ZNKSt9basic_iosI[cw]St11char_traitsI[cw]EEcvbEv;
+
 } GLIBCXX_3.4.20;
 
 
diff --git a/libstdc++-v3/include/bits/basic_ios.h b/libstdc++-v3/include/bits/basic_ios.h
index 10263ed..0a83d0d 100644
--- a/libstdc++-v3/include/bits/basic_ios.h
+++ b/libstdc++-v3/include/bits/basic_ios.h
@@ -113,8 +113,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
        *  This allows you to write constructs such as
        *  <code>if (!a_stream) ...</code> and <code>while (a_stream) ...</code>
       */
+#if __cplusplus >= 201103L
+      explicit operator bool() const
+      { return !this->fail(); }
+#else
       operator void*() const
       { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
+#endif
 
       bool
       operator!() const
diff --git a/libstdc++-v3/src/c++98/ios_locale.cc b/libstdc++-v3/src/c++98/ios_locale.cc
index fd2e9e4..968af98 100644
--- a/libstdc++-v3/src/c++98/ios_locale.cc
+++ b/libstdc++-v3/src/c++98/ios_locale.cc
@@ -54,5 +54,12 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     return __old;
   }
 
+  // Explicit instantiations for basic_ios are done in src/c++11/ios.cc
+  // and so do not include this member, which is only defined for C++98.
+  template basic_ios<char>::operator void*() const;
+#ifdef _GLIBCXX_USE_WCHAR_T
+  template basic_ios<wchar_t>::operator void*() const;
+#endif
+
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace