2005-07-22 Jakub Jelinek <jakub@redhat.com>
* src/sstream-inst.cc: Add .hidden directive for
streamsize basic_stringbuf<{char,wchar_t}>::showmanyc().
* src/sstream-inst-showmanyc.cc: New file.
* src/Makefile.am (libstdc++_nonshared.la): Add new library.
* src/Makefile.in: Rebuilt.
* testsuite/lib/libstdc++.exp: Append -lstdc++_nonshared for
testsuite executable linking.
2005-06-08 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/21955
* include/std/std_sstream.h (basic_stringbuf::showmanyc): Add.
* testsuite/27_io/basic_streambuf/in_avail/char/1.cc: New, test
base class behavior.
* testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc: Same.
* testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc: New.
* testsuite/27_io/basic_stringbuf/in_avail/char/1.cc: Match
filebuf behavior.
* testsuite/27_io/basic_stringbuf/str/char/1.cc: Same.
--- libstdc++-v3/src/sstream-inst.cc.jj 2003-07-11 10:28:13.000000000 +0200
+++ libstdc++-v3/src/sstream-inst.cc 2005-07-21 17:46:08.000000000 +0200
@@ -60,3 +60,8 @@ namespace std
template class basic_stringstream<wchar_t>;
#endif
} // namespace std
+
+#ifdef PIC
+__asm (".hidden _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9showmanycEv");
+__asm (".hidden _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9showmanycEv");
+#endif
--- libstdc++-v3/src/sstream-inst-showmanyc.cc.jj 2005-07-21 21:27:40.000000000 +0200
+++ libstdc++-v3/src/sstream-inst-showmanyc.cc 2005-07-22 09:16:58.000000000 +0200
@@ -0,0 +1,39 @@
+// Explicit instantiation file.
+
+// Copyright (C) 2005
+// 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+#include <sstream>
+
+namespace std
+{
+ // These symbols are hidden in libstdc++.so, as it is undesirable to export
+ // @@GLIBCXX_3.4.6
+ template streamsize basic_stringbuf<char, char_traits<char>, allocator<char> >::showmanyc();
+ template streamsize basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >::showmanyc();
+} // namespace std
--- libstdc++-v3/src/Makefile.am.jj 2004-04-20 15:55:47.000000000 +0200
+++ libstdc++-v3/src/Makefile.am 2005-07-22 09:00:32.000000000 +0200
@@ -25,7 +25,7 @@
include $(top_srcdir)/fragment.am
# Cross compiler support.
-toolexeclib_LTLIBRARIES = libstdc++.la
+toolexeclib_LTLIBRARIES = libstdc++.la libstdc++_nonshared.la
# Symbol versioning for shared libraries.
if GLIBCXX_BUILD_VERSIONED_SHLIB
@@ -150,6 +150,11 @@ libstdc___la_DEPENDENCIES = ${version_de
libstdc___la_LDFLAGS = \
-version-info $(libtool_VERSION) ${version_arg} -lm
+libstdc___nonshared_la_SOURCES = \
+ sstream-inst-showmanyc.cc
+libstdc___nonshared_la_LIBADD =
+libstdc___nonshared_la_DEPENDENCIES = $(libstdc___nonshared_la_LIBADD)
+libstdc___nonshared_la_LDFLAGS = -static
# Use special rules for the deprecated source files so that they find
# deprecated include files.
@@ -159,6 +164,14 @@ strstream.lo: strstream.cc
strstream.o: strstream.cc
$(CXXCOMPILE) -I$(GLIBCXX_INCLUDE_DIR)/backward -Wno-deprecated -c $<
+# Use special rules for libstdc++_nonshared.la files, as -prefer-pic
+# doesn't seem to work for some reason.
+sstream-inst-showmanyc.lo: sstream-inst-showmanyc.cc
+ $(LTCXXCOMPILE) -c $< \
+ && cp -f .libs/sstream-inst-showmanyc.o sstream-inst-showmanyc.o
+sstream-inst-showmanyc.o: sstream-inst-showmanyc.cc
+ $(CXXCOMPILE) -fPIC -DPIC -c $<
+
# Use special rules for the concept-checking instantiations so that all
# the generated template functions are also instantiated. Force the checks
# to be on so that the instantiations are actually seen.
--- libstdc++-v3/src/Makefile.in.jj 2004-04-20 15:55:47.000000000 +0200
+++ libstdc++-v3/src/Makefile.in 2005-07-22 09:06:15.000000000 +0200
@@ -221,7 +221,7 @@ WARN_CXXFLAGS = \
AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
# Cross compiler support.
-toolexeclib_LTLIBRARIES = libstdc++.la
+toolexeclib_LTLIBRARIES = libstdc++.la libstdc++_nonshared.la
# Symbol versioning for shared libraries.
@GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@version_arg = -Wl,--version-script=libstdc++-symbol.ver
@@ -308,6 +308,13 @@ libstdc___la_LDFLAGS = \
-version-info $(libtool_VERSION) ${version_arg} -lm
+libstdc___nonshared_la_SOURCES = \
+ sstream-inst-showmanyc.cc
+
+libstdc___nonshared_la_LIBADD =
+libstdc___nonshared_la_DEPENDENCIES = $(libstdc___nonshared_la_LIBADD)
+libstdc___nonshared_la_LDFLAGS = -static
+
# Use special rules for the deprecated source files so that they find
# deprecated include files.
GLIBCXX_INCLUDE_DIR = $(glibcxx_builddir)/include
@@ -379,6 +386,8 @@ am__objects_3 = allocator.lo codecvt.lo
$(am__objects_1) $(am__objects_2)
am_libstdc___la_OBJECTS = $(am__objects_3)
libstdc___la_OBJECTS = $(am_libstdc___la_OBJECTS)
+am_libstdc___nonshared_la_OBJECTS = sstream-inst-showmanyc.lo
+libstdc___nonshared_la_OBJECTS = $(am_libstdc___nonshared_la_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
depcomp =
@@ -386,10 +395,10 @@ am__depfiles_maybe =
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
-DIST_SOURCES = $(libstdc___la_SOURCES)
+DIST_SOURCES = $(libstdc___la_SOURCES) $(libstdc___nonshared_la_SOURCES)
DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/fragment.am \
Makefile.am
-SOURCES = $(libstdc___la_SOURCES)
+SOURCES = $(libstdc___la_SOURCES) $(libstdc___nonshared_la_SOURCES)
all: all-am
@@ -430,6 +439,8 @@ clean-toolexeclibLTLIBRARIES:
done
libstdc++.la: $(libstdc___la_OBJECTS) $(libstdc___la_DEPENDENCIES)
$(CXXLINK) -rpath $(toolexeclibdir) $(libstdc___la_LDFLAGS) $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) $(LIBS)
+libstdc++_nonshared.la: $(libstdc___nonshared_la_OBJECTS) $(libstdc___nonshared_la_DEPENDENCIES)
+ $(CXXLINK) -rpath $(toolexeclibdir) $(libstdc___nonshared_la_LDFLAGS) $(libstdc___nonshared_la_OBJECTS) $(libstdc___nonshared_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT) core *.core
@@ -674,6 +685,14 @@ strstream.lo: strstream.cc
strstream.o: strstream.cc
$(CXXCOMPILE) -I$(GLIBCXX_INCLUDE_DIR)/backward -Wno-deprecated -c $<
+# Use special rules for libstdc++_nonshared.la files, as -prefer-pic
+# doesn't seem to work for some reason.
+sstream-inst-showmanyc.lo: sstream-inst-showmanyc.cc
+ $(LTCXXCOMPILE) -c $< \
+ && cp -f .libs/sstream-inst-showmanyc.o sstream-inst-showmanyc.o
+sstream-inst-showmanyc.o: sstream-inst-showmanyc.cc
+ $(CXXCOMPILE) -fPIC -DPIC -c $<
+
# Use special rules for the concept-checking instantiations so that all
# the generated template functions are also instantiated. Force the checks
# to be on so that the instantiations are actually seen.
--- libstdc++-v3/include/std/std_sstream.h.jj 2004-10-04 14:58:25.000000000 +0200
+++ libstdc++-v3/include/std/std_sstream.h 2005-07-21 17:17:16.000000000 +0200
@@ -185,6 +185,18 @@ namespace std
_M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
}
+ virtual streamsize
+ showmanyc()
+ {
+ streamsize __ret = -1;
+ if (_M_mode & ios_base::in)
+ {
+ _M_update_egptr();
+ __ret = this->egptr() - this->gptr();
+ }
+ return __ret;
+ }
+
// [documentation is inherited]
virtual int_type
underflow();
--- libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc.jj 2003-10-01 12:12:11.000000000 +0200
+++ libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc 2005-07-22 01:22:15.000000000 +0200
@@ -45,7 +45,7 @@ void test03()
std::streamsize d1 = strb_01.in_avail();
std::streamsize d2 = strb_03.in_avail();
VERIFY( d1 ); // non-zero
- VERIFY( !d2 ); // zero, cuz ios_base::out
+ VERIFY( d2 == -1 ); // -1, cuz ios_base::out
VERIFY( d1 != d2 ); //these should be the same
VERIFY( static_cast<std::streamsize>(str_01.length()) == d1 );
VERIFY( strb_01.str() == strb_03.str() ); //ditto
--- libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc.jj 2003-10-01 12:12:10.000000000 +0200
+++ libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc 2005-07-22 01:22:04.000000000 +0200
@@ -49,8 +49,8 @@ void test04()
VERIFY( strmof_1 == static_cast<std::streamoff>(str_01.length()) );
VERIFY( strmof_2 == static_cast<std::streamoff>(str_02.length()) );
strmof_1 = strb_03.in_avail();
- // zero cuz write-only, or eof()? zero, from showmany
- VERIFY( strmof_1 == 0 );
+ // zero cuz write-only, or eof() to match basic_filebuf
+ VERIFY( strmof_1 == -1 );
}
int main()
--- libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc.jj 2005-07-22 01:22:04.000000000 +0200
+++ libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc 2005-07-22 01:22:04.000000000 +0200
@@ -0,0 +1,54 @@
+// 2005-06-07 Benjamin Kosnik
+
+// Copyright (C) 2005
+// 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+#include <sstream>
+#include <testsuite_hooks.h>
+#include <stdexcept>
+
+double
+test_stringstream()
+{
+ double result;
+ char* source = "1918";
+ std::stringstream s;
+ s << source;
+
+ std::string tmp = s.str();
+ std::streambuf* sb = s.rdbuf();
+ int i = sb->in_avail();
+
+ if (i)
+ {
+ s >> result;
+ }
+ else
+ {
+ throw std::runtime_error("conversion failed");
+ }
+ return result;
+}
+
+
+int main ()
+{
+ test_stringstream();
+ return 0;
+}
--- libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc.jj 2005-07-22 01:21:41.000000000 +0200
+++ libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc 2005-07-22 01:21:41.000000000 +0200
@@ -0,0 +1,54 @@
+// 2005-06-07 Benjamin Kosnik <bkoz@redhat.com>
+
+// Copyright (C) 2005 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 27.8.1.4 Overridden virtual functions
+
+#include <fstream>
+#include <testsuite_hooks.h>
+
+typedef std::basic_streambuf<char> streambuf_type;
+
+struct testbuf : streambuf_type
+{
+ testbuf() { }
+};
+
+void test05()
+{
+ typedef streambuf_type::int_type int_type;
+ typedef streambuf_type::traits_type traits_type;
+ typedef streambuf_type::pos_type pos_type;
+ typedef streambuf_type::off_type off_type;
+ typedef size_t size_type;
+
+ bool test __attribute__((unused)) = true;
+ std::streamoff strmof_1, strmof_2;
+ testbuf sb01;
+
+ // int in_avail()
+ strmof_1 = sb01.in_avail();
+ VERIFY( strmof_1 == 0 );
+}
+
+int main()
+{
+ test05();
+ return 0;
+}
--- libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc.jj 2005-07-22 01:21:41.000000000 +0200
+++ libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc 2005-07-22 01:21:41.000000000 +0200
@@ -0,0 +1,54 @@
+// 2005-06-07 Benjamin Kosnik <bkoz@redhat.com>
+
+// Copyright (C) 2005 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 27.8.1.4 Overridden virtual functions
+
+#include <fstream>
+#include <testsuite_hooks.h>
+
+typedef std::basic_streambuf<wchar_t> streambuf_type;
+
+struct testbuf : streambuf_type
+{
+ testbuf() { }
+};
+
+void test05()
+{
+ typedef streambuf_type::int_type int_type;
+ typedef streambuf_type::traits_type traits_type;
+ typedef streambuf_type::pos_type pos_type;
+ typedef streambuf_type::off_type off_type;
+ typedef size_t size_type;
+
+ bool test __attribute__((unused)) = true;
+ std::streamoff strmof_1, strmof_2;
+ testbuf sb01;
+
+ // int in_avail()
+ strmof_1 = sb01.in_avail();
+ VERIFY( strmof_1 == 0 );
+}
+
+int main()
+{
+ test05();
+ return 0;
+}
--- libstdc++-v3/testsuite/lib/libstdc++.exp.jj 2005-05-06 12:59:10.000000000 +0200
+++ libstdc++-v3/testsuite/lib/libstdc++.exp 2005-07-22 10:03:52.000000000 +0200
@@ -283,6 +283,7 @@ proc v3_target_compile { source dest typ
# Link the support objects into executables.
if { $type == "executable" } {
set cxx_final [concat $cxx_final ${v3-test_objs}]
+ lappend options "libs=-lstdc++_nonshared"
}
lappend options "compiler=$cxx_final"