This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
ostringstream long long problem on Alpha/Tru64 with latest gcc3.2.1
- From: Karel Gardas <kgardas at objectsecurity dot com>
- To: GCC Mailing List <gcc at gcc dot gnu dot org>
- Date: Mon, 18 Nov 2002 10:11:29 +0100 (CET)
- Subject: ostringstream long long problem on Alpha/Tru64 with latest gcc3.2.1
Hello,
I've found some problem with using ostringstream class on Alpha/Tru64
machine with latest gcc 3.2.1 (20021117).
Following code fails to compile with this compiler:
#include <sstream>
#include <iostream>
using namespace std;
int
main()
{
ostringstream str;
long long i = 9223372036854775807;
#ifdef LONG_CAST
#warning "casting long long to long"
str << (long)i;
#else // LONG_CAST
str << i;
#endif // LONG_CAST
string s1 = str.str();
cout << s1 << endl;
return 0;
}
The only solution which I've found is to explicitly cast to long (i.e. use
-DLONG_CAST during compilation) otherwise gcc will throw error messages
which are below.
I've tried this code with HP/Compaq's CXX compiler too, and it's perfectly
ok with the code above - the only one problem was that I need to define
__USE_STD_IOSTREAM symbol. All compiled binaries (cxx, cxx
-DLONG_CAST, gcc -DLONG_CAST) produces the same output.
bash-2.04$ cxx -D__USE_STD_IOSTREAM -DLONG_CAST test.cc -o testcxx-cast
cxx: Warning: test.cc, line 12: unrecognized preprocessing directive
#warning "casting long long to long"
-^
bash-2.04$ cxx -D__USE_STD_IOSTREAM test.cc -o testcxx
bash-2.04$ c++ -DLONG_CAST test.cc -o testgcc
test.cc:12:2: warning: #warning "casting long long to long"
bash-2.04$ ./testcxx
9223372036854775807
bash-2.04$ ./testcxx-cast
9223372036854775807
bash-2.04$ ./testgcc
9223372036854775807
bash-2.04$
My gcc was configured with:
bash-2.04$ c++ -v
Reading specs from
/house/kgardas/usr/local/alpha-osf1/bin/../lib/gcc-lib/alphaev68-dec-osf5.1/3.2.1/specs
Configured with: ../gcc3.2/configure --prefix=/house/kgardas/usr/local/alpha-osf1/ --enable-shared --enable-threads --enable-languages=c++
Thread model: single
gcc version 3.2.1 20021117 (prerelease)
bash-2.04$
and compiled with:
make CFLAGS='-O' LIBCFLAGS='-g -O2' LIBCXXFLAGS='-g -O2 -fno-implicit-templates' bootstrap-lean
Is this real problem in gcc/libstdc++ or is this some problem in my code?
Thanks,
Karel
PS: compilation with gcc w/o explicit long cast fails with:
bash-2.04$ c++ test.cc
test.cc: In function `int main()':
test.cc:15: ambiguous overload for `std::ostringstream& << long long int&'
operator
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:55:
candidates
are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(std::basic_ostream<_CharT,
_Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT =
char,
_Traits = std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:77:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(std::basic_ios<_CharT,
_Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char,
_Traits
= std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:99:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT =
char,
_Traits = std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:171:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(long int) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:208:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:146:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(bool) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:104:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(short int) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:115:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:119:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(int) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:130:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(unsigned int) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:298:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(double) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:145:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(float) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:323:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(long double) [with _CharT = char, _Traits =
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:348:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(const void*) [with _CharT = char, _Traits =
std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:120:
std::basic_ostream<_CharT, _Traits>&
std::basic_ostream<_CharT,
_Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with
_CharT =
char, _Traits = std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:211:
std::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with
_CharT =
char, _Traits = std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:500:
std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, char) [with _Traits
=
std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:222:
std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, signed char) [with
_Traits = std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:227:
std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char)
[with
_Traits = std::char_traits<char>]
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:572:
std::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*)
[with
_CharT = char, _Traits = std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/bits/ostream.tcc:622:
std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, const char*) [with
_Traits = std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:246:
std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*)
[with _Traits = std::char_traits<char>] <near match>
/house/kgardas/usr/local/alpha-osf1/include/c++/3.2.1/ostream:251:
std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned
char*)
[with _Traits = std::char_traits<char>] <near match>
--
Karel Gardas kgardas@objectsecurity.com
ObjectSecurity Ltd. http://www.objectsecurity.com