libstdc++/2383: Problems with istrstream

Martin Sebor sebor@roguewave.com
Tue Mar 27 09:38:00 GMT 2001


schmid@snake.iap.physik.tu-darmstadt.de wrote:
> 
> >Number:         2383
> >Category:       libstdc++
> >Synopsis:       Problems with istrstream
...
> G++ 3.0 and 3.1 reject the following (IMHO legal) code ts1.C. G++
> 2.95.2 has no problem compiling it into a working executable. If the
> temporary std::istrstream(buff, strlen(buff)) is made a named
> variable (#if 0), g++ 3.0 and 3.1 accept the code. I am not shure, if
> this is a libstdc++ problem or g++ related.

The problem is that std::operator(basic_istream<>&, char*) takes
a non-const reference as its first argument, which makes it not
viable (13.3.2, p3). Since none of the other (member) candidates
is viable (there is no conversion from char(&)[] to any of
the fundamental types or void*&), the program is in error.

Regards
Martin

> 
> >How-To-Repeat:
> Source code ts1.C
> 
> #include <strstream>
> 
> #define BUFFSIZ 2048
> #define TESTSIZ 20
> 
> int main()
> {
>     char buff[BUFFSIZ], reference[TESTSIZ];
> 
> #if 1
>     std::istrstream(buff, strlen(buff)) >> reference;
> #else
>     std::istrstream a(buff, strlen(buff));
>     a >> reference;
> #endif
> }
> Compiling ts1.C
> 
> #if 1
> g++ -v -o ts1 ts1.C -W -Wall -save-temps
> Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/specs
> Configured with: ../gcc/configure --enable-shared --disable-nls
> --enable-threads=posix --enable-long-long
> --enable-languages=c,c++,f77,objc
> gcc version 3.1 20010324 (experimental)
>  /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/cpp0 -lang-c++
> -D_GNU_SOURCE -D__GNUG__=3 -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -v
> -D__GNUC__=3 -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix
> -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux
> -Asystem=posix -D__STDC_HOSTED__=1 -W -Wall -Acpu=i386 -Amachine=i386
> -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ ts1.C
> ts1.ii
> GNU CPP version 3.1 20010324 (experimental) (cpplib) (i386 Linux/ELF)
> #include "..." search starts here:
> #include <...> search starts here:
>  /usr/local/include/g++-v3
>  /usr/local/include/g++-v3/i686-pc-linux-gnu
>  /usr/local/include
>  /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/include
>  /usr/local/i686-pc-linux-gnu/include
>  /usr/include
> End of search list.
>  /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/cc1plus -fpreprocessed
> ts1.ii -quiet -dumpbase ts1.C -W -Wall -version -o ts1.s
> GNU CPP version 3.1 20010324 (experimental) (cpplib) (i386 Linux/ELF)
> GNU C++ version 3.1 20010324 (experimental) (i686-pc-linux-gnu)
>         compiled by GNU C version 3.1 20010324 (experimental).
> ts1.C: In function `int main()':
> ts1.C:12: no match for `std::istrstream >> char[20]' operator
> /usr/local/include/g++-v3/bits/istream.tcc:83: candidates are:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(std::basic_istream<_CharT,
>    _Traits>&(*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT =
> char,
>    _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:92:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(std::basic_ios<_CharT,
>    _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char,
> _Traits
>    = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:101:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(std::ios_base&(*)(std::ios_base&)) [with _CharT
> = char,
>    _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:110:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(bool&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:134:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(short int&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:158:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(short unsigned int&) [with _CharT = char,
> _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:182:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(int&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:206:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(unsigned int&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:230:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(long int&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:254:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(long unsigned int&) [with _CharT = char, _Traits
> =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:279:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(long long int&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:303:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(long long unsigned int&) [with _CharT = char,
> _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:328:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(float&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:352:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(double&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:376:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(long double&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:400:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(void*&) [with _CharT = char, _Traits =
>    std::char_traits<char>]
> /usr/local/include/g++-v3/bits/istream.tcc:424:
>    std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,
>    _Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with
> _CharT =
>    char, _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/std_istream.h:265:
>    std::basic_istream<char, _Traits>&
> std::operator>>(std::basic_istream<char,
>    _Traits>&, signed char*) [with _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/std_istream.h:260:
>    std::basic_istream<char, _Traits>&
> std::operator>>(std::basic_istream<char,
>    _Traits>&, unsigned char*) [with _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/std_istream.h:255:
>    std::basic_istream<_CharT, _Traits>&
>    std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT*) [with
> _CharT
>    = char, _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/std_istream.h:251:
>    std::basic_istream<char, _Traits>&
> std::operator>>(std::basic_istream<char,
>    _Traits>&, signed char&) [with _Traits = std::char_traits<char>]
> /usr/local/include/g++-v3/bits/std_istream.h:246:
>    std::basic_istream<char, _Traits>&
> std::operator>>(std::basic_istream<char,
>    _Traits>&, unsigned char&) [with _Traits = std::char_traits<char>]
> 
> #if 0
> g++ -v -o ts1 ts1.C -W -Wall
> Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/specs
> Configured with: ../gcc/configure --enable-shared --disable-nls
> --enable-threads=posix --enable-long-long
> --enable-languages=c,c++,f77,objc
> gcc version 3.1 20010324 (experimental)
>  /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/cc1plus -v -D__GNUC__=3
> -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux
> -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem=posix
> -D__STDC_HOSTED__=1 -W -Wall -Acpu=i386 -Amachine=i386 -Di386 -D__i386
> -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ ts1.C -D__GNUG__=3
> -D_GNU_SOURCE -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -quiet -dumpbase
> ts1.C -W -Wall -version -o /tmp/ccPvok4H.s
> GNU CPP version 3.1 20010324 (experimental) (cpplib) (i386 Linux/ELF)
> GNU C++ version 3.1 20010324 (experimental) (i686-pc-linux-gnu)
>         compiled by GNU C version 3.1 20010324 (experimental).
> #include "..." search starts here:
> #include <...> search starts here:
>  /usr/local/include/g++-v3
>  /usr/local/include/g++-v3/i686-pc-linux-gnu
>  /usr/local/include
>  /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/include
>  /usr/local/i686-pc-linux-gnu/include
>  /usr/include
> End of search list.
> 
> /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/../../../../i686-pc-linux-g
> nu/bin/as -V -Qy -o /tmp/cc7pdSOO.o /tmp/ccPvok4H.s
> GNU assembler version 2.11.90.0.1 (i686-pc-linux-gnu) using BFD version
> 2.11.90.0.1
>  /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/collect2 -m elf_i386
> -dynamic-linker /lib/ld-linux.so.2 -o ts1 /usr/lib/crt1.o
> /usr/lib/crti.o /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/crtbegin.o
> -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1
> -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/../../../../i686-pc-linux
> -gnu/lib -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/../../..
> /tmp/cc7pdSOO.o -lstdc++ -lm -lgcc_s -lc -lgcc_s
> /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/crtend.o /usr/lib/crtn.o
> 
> Bzip2 compressed and uuencode preprocessed source ts1.ii (#if 1)
> 
> >Fix:
> 
> >Release-Note:
> >Audit-Trail:
> >Unformatted:
> 
>                  Name: ts1.ii.bz2
>    ts1.ii.bz2    Type: unspecified type (application/octet-stream)
>              Encoding: x-uuencode



More information about the Gcc-bugs mailing list