[v3] merge from cp-parser-branch
Phil Edwards
pedwards@disaster.jaj.com
Thu Jul 19 17:14:00 GMT 2001
Mark has discovered a few syntax bugs in libstdc++ while working on
the new C++ parser, and fixed them on that branch. Since we'd like for
the trunk to contain the one-and-only copy of libstdc++ with as little
divergence as possible, I will occasionally be merging from that branch
onto the mainline and the 3.0 branch (unless the change is large, or the
3.0 branch is frozen, etc).
This first patch is fairly straightforward. Tested on x86/linux, discussed
on the libstdc++ list, approved by Mark and Benjamin, applied to trunk
and branch.
2001-07-19 Phil Edwards <pme@sources.redhat.com>
Mark Mitchell <mark@codesourcery.com>
Merge from cp-parser-branch.
* include/bits/basic_string.h: Qualify symbols with 'template'.
* include/bits/basic_string.tcc: Likewise.
* include/bits/fstream.tcc: Likewise.
* include/bits/istream.tcc: Likewise.
* include/bits/sstream.tcc: Likewise.
* include/bits/std_istream.h: Likewise.
* include/bits/stl_iterator.h: Likewise.
* include/bits/streambuf.tcc: Likewise.
* src/gen-num-limits.cc: Add 'template<>' to specializations.
* src/locale.cc: Likewise.
Index: include/bits/basic_string.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/basic_string.h,v
retrieving revision 1.8
diff -u -3 -p -r1.8 basic_string.h
--- basic_string.h 2001/06/12 02:30:37 1.8
+++ basic_string.h 2001/07/19 21:49:36
@@ -118,7 +118,7 @@ namespace std
struct _Rep
{
// Types:
- typedef typename _Alloc::rebind<char>::other _Raw_bytes_alloc;
+ typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
// (Public) Data members:
Index: include/bits/basic_string.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/basic_string.tcc,v
retrieving revision 1.5
diff -u -3 -p -r1.5 basic_string.tcc
--- basic_string.tcc 2001/06/12 02:30:37 1.5
+++ basic_string.tcc 2001/07/19 21:49:37
@@ -354,7 +354,7 @@ namespace std
#endif
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::_Rep*
+ typename basic_string<_CharT, _Traits, _Alloc>::_Rep*
basic_string<_CharT, _Traits, _Alloc>::_Rep::
_S_create(size_t __capacity, const _Alloc& __alloc)
{
@@ -571,7 +571,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
copy(_CharT* __s, size_type __n, size_type __pos) const
{
@@ -587,7 +587,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find(const _CharT* __s, size_type __pos, size_type __n) const
{
@@ -601,7 +601,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find(_CharT __c, size_type __pos) const
{
@@ -620,7 +620,7 @@ namespace std
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
rfind(const _CharT* __s, size_type __pos, size_type __n) const
{
@@ -640,7 +640,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
rfind(_CharT __c, size_type __pos) const
{
@@ -659,7 +659,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
{
@@ -673,7 +673,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
{
@@ -693,7 +693,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
{
@@ -705,7 +705,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_first_not_of(_CharT __c, size_type __pos) const
{
@@ -717,7 +717,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
{
@@ -737,7 +737,7 @@ namespace std
}
template<typename _CharT, typename _Traits, typename _Alloc>
- basic_string<_CharT, _Traits, _Alloc>::size_type
+ typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_last_not_of(_CharT __c, size_type __pos) const
{
Index: include/bits/fstream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/fstream.tcc,v
retrieving revision 1.15
diff -u -3 -p -r1.15 fstream.tcc
--- fstream.tcc 2001/06/12 23:09:09 1.15
+++ fstream.tcc 2001/07/19 21:49:37
@@ -139,7 +139,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::__filebuf_type*
+ typename basic_filebuf<_CharT, _Traits>::__filebuf_type*
basic_filebuf<_CharT, _Traits>::
open(const char* __s, ios_base::openmode __mode)
{
@@ -166,7 +166,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::__filebuf_type*
+ typename basic_filebuf<_CharT, _Traits>::__filebuf_type*
basic_filebuf<_CharT, _Traits>::
close()
{
@@ -232,7 +232,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::int_type
+ typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::
underflow()
{
@@ -303,7 +303,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::int_type
+ typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::
pbackfail(int_type __i)
{
@@ -371,7 +371,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::int_type
+ typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::
overflow(int_type __c)
{
@@ -396,7 +396,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::int_type
+ typename basic_filebuf<_CharT, _Traits>::int_type
basic_filebuf<_CharT, _Traits>::
_M_really_overflow(int_type __c)
{
@@ -475,7 +475,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::__streambuf_type*
+ typename basic_filebuf<_CharT, _Traits>::__streambuf_type*
basic_filebuf<_CharT, _Traits>::
setbuf(char_type* __s, streamsize __n)
{
@@ -503,7 +503,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::pos_type
+ typename basic_filebuf<_CharT, _Traits>::pos_type
basic_filebuf<_CharT, _Traits>::
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
{
@@ -559,7 +559,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_filebuf<_CharT, _Traits>::pos_type
+ typename basic_filebuf<_CharT, _Traits>::pos_type
basic_filebuf<_CharT, _Traits>::
seekpos(pos_type __pos, ios_base::openmode __mode)
{
Index: include/bits/istream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/istream.tcc,v
retrieving revision 1.17
diff -u -3 -p -r1.17 istream.tcc
--- istream.tcc 2001/06/12 22:14:08 1.17
+++ istream.tcc 2001/07/19 21:49:37
@@ -465,7 +465,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_istream<_CharT, _Traits>::int_type
+ typename basic_istream<_CharT, _Traits>::int_type
basic_istream<_CharT, _Traits>::
get(void)
{
@@ -720,7 +720,7 @@ namespace std
}
template<typename _CharT, typename _Traits>
- basic_istream<_CharT, _Traits>::int_type
+ typename basic_istream<_CharT, _Traits>::int_type
basic_istream<_CharT, _Traits>::
peek(void)
{
Index: include/bits/sstream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/sstream.tcc,v
retrieving revision 1.2
diff -u -3 -p -r1.2 sstream.tcc
--- sstream.tcc 2001/03/04 21:34:00 1.2
+++ sstream.tcc 2001/07/19 21:49:37
@@ -40,7 +40,7 @@ namespace std
{
template <class _CharT, class _Traits, class _Alloc>
- basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
+ typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
basic_stringbuf<_CharT, _Traits, _Alloc>::
pbackfail(int_type __c)
{
@@ -74,7 +74,7 @@ namespace std
}
template <class _CharT, class _Traits, class _Alloc>
- basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
+ typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
basic_stringbuf<_CharT, _Traits, _Alloc>::
overflow(int_type __c)
{
@@ -114,7 +114,7 @@ namespace std
}
template <class _CharT, class _Traits, class _Alloc>
- basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
+ typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
basic_stringbuf<_CharT, _Traits, _Alloc>::
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
{
@@ -172,7 +172,7 @@ namespace std
}
template <class _CharT, class _Traits, class _Alloc>
- basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
+ typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
basic_stringbuf<_CharT, _Traits, _Alloc>::
seekpos(pos_type __sp, ios_base::openmode __mode)
{
Index: include/bits/std_istream.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/std_istream.h,v
retrieving revision 1.6
diff -u -3 -p -r1.6 std_istream.h
--- std_istream.h 2001/05/31 20:33:06 1.6
+++ std_istream.h 2001/07/19 21:49:37
@@ -217,7 +217,7 @@ namespace std
typedef _Traits traits_type;
typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
typedef basic_istream<_CharT, _Traits> __istream_type;
- typedef __istream_type::__ctype_type __ctype_type;
+ typedef typename __istream_type::__ctype_type __ctype_type;
typedef typename _Traits::int_type __int_type;
explicit
Index: include/bits/stl_iterator.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/stl_iterator.h,v
retrieving revision 1.12
diff -u -3 -p -r1.12 stl_iterator.h
--- stl_iterator.h 2001/07/09 21:47:36 1.12
+++ stl_iterator.h 2001/07/19 21:49:37
@@ -442,7 +442,7 @@ namespace std
template<typename _Iterator, typename _Container>
inline __normal_iterator<_Iterator, _Container>
- operator+(__normal_iterator<_Iterator, _Container>::difference_type __n,
+ operator+(typename __normal_iterator<_Iterator, _Container>::difference_type __n,
const __normal_iterator<_Iterator, _Container>& __i)
{ return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
} // namespace std
Index: include/bits/streambuf.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/streambuf.tcc,v
retrieving revision 1.7
diff -u -3 -p -r1.7 streambuf.tcc
--- streambuf.tcc 2001/06/27 01:07:28 1.7
+++ streambuf.tcc 2001/07/19 21:49:37
@@ -37,7 +37,7 @@
namespace std {
template<typename _CharT, typename _Traits>
- basic_streambuf<_CharT, _Traits>::int_type
+ typename basic_streambuf<_CharT, _Traits>::int_type
basic_streambuf<_CharT, _Traits>::
sbumpc()
{
@@ -54,7 +54,7 @@ namespace std {
}
template<typename _CharT, typename _Traits>
- basic_streambuf<_CharT, _Traits>::int_type
+ typename basic_streambuf<_CharT, _Traits>::int_type
basic_streambuf<_CharT, _Traits>::
sputbackc(char_type __c)
{
@@ -72,7 +72,7 @@ namespace std {
}
template<typename _CharT, typename _Traits>
- basic_streambuf<_CharT, _Traits>::int_type
+ typename basic_streambuf<_CharT, _Traits>::int_type
basic_streambuf<_CharT, _Traits>::
sungetc()
{
@@ -93,7 +93,7 @@ namespace std {
// buffers will still be valid. (This happens if setp is used to set
// the internal buffer to say some externally-allocated sequence.)
template<typename _CharT, typename _Traits>
- basic_streambuf<_CharT, _Traits>::int_type
+ typename basic_streambuf<_CharT, _Traits>::int_type
basic_streambuf<_CharT, _Traits>::
sputc(char_type __c)
{
Index: src/gen-num-limits.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/gen-num-limits.cc,v
retrieving revision 1.12
diff -u -3 -p -r1.12 gen-num-limits.cc
--- gen-num-limits.cc 2001/07/19 03:06:01 1.12
+++ gen-num-limits.cc 2001/07/19 21:49:37
@@ -206,7 +206,9 @@ template<typename T>
};
#define DEFINED_TYPE_NAME(T) \
+template<> \
const char type_name_trait< T >::type_name[] = #T; \
+template<> \
const char type_name_trait< T >::trait_name[] = "numeric_limits<" #T ">";
DEFINED_TYPE_NAME(bool);
@@ -279,7 +281,9 @@ template<typename T>
const bool predicate<T>::is_exact = true;
#define SPECIALIZE_EXACTNESS(T) \
+template<> \
const bool predicate< T >::is_integer = false; \
+template<> \
const bool predicate< T >::is_exact = false
SPECIALIZE_EXACTNESS(float);
@@ -311,6 +315,7 @@ template<typename T>
const bool predicate<T>::is_iec559 = false;
#define SPECIALIZE_IEC559(T) \
+template<> \
const bool predicate< T >::is_iec559 = true
SPECIALIZE_IEC559(bool);
@@ -349,7 +354,9 @@ template<typename T>
#define DEFINE_EXTREMA(T, m, M) DO_DEFINE_EXTREMA(T, m, M)
#define DO_DEFINE_EXTREMA(T, m, M) \
+template<> \
const char value< T >::min[] = #m; \
+template<> \
const char value< T >::max[] = #M
DEFINE_EXTREMA(bool, false, true);
@@ -386,8 +393,10 @@ const int value<T>::digits =
template<typename T>
const int value<T>::radix = 2;
-#define SPECIALIZE_DIGITS(T, D, D10) \
-const int value< T >::digits = D; \
+#define SPECIALIZE_DIGITS(T, D, D10) \
+template<> \
+const int value< T >::digits = D; \
+template<> \
const int value< T >::digits10 = D10
SPECIALIZE_DIGITS(float, FLT_MANT_DIG, FLT_DIG);
@@ -397,7 +406,9 @@ SPECIALIZE_DIGITS(long double, LDBL_MANT
#undef SPECIALIZE_DIGITS
-#define SPECIALIZE_RADIX(T, R) const int value< T >::radix = R
+#define SPECIALIZE_RADIX(T, R) \
+template<> \
+const int value< T >::radix = R
SPECIALIZE_RADIX(float, FLT_RADIX);
SPECIALIZE_RADIX(double, FLT_RADIX);
@@ -418,7 +429,9 @@ const char value<T>::epsilon[] = "0";
#endif
#define SPECIALIZE_EPSILON(T, E) DO_SPECIALIZE_EPSILON(T, E)
-#define DO_SPECIALIZE_EPSILON(T, E) const char value< T >::epsilon[] = #E
+#define DO_SPECIALIZE_EPSILON(T, E) \
+template<> \
+const char value< T >::epsilon[] = #E
// unsophisticated, gross method
#if 1
@@ -457,7 +470,9 @@ template<typename T>
const char value<T>::round_error[] = "0";
#endif
-#define SPECIALIZE_ROUND_ERROR(T, R) const char value< T >::round_error[] = #R
+#define SPECIALIZE_ROUND_ERROR(T, R) \
+template<> \
+const char value< T >::round_error[] = #R
// unsophisticated, gross method
#if 1
SPECIALIZE_ROUND_ERROR(bool, 0);
@@ -494,10 +509,14 @@ const int value<T>::max_exponent = 0;
template<typename T>
const int value<T>::max_exponent10 = 0;
-#define SPECIALIZE_EXPONENTS(T, m, m10, M, M10) \
-const int value< T >::min_exponent = m; \
-const int value< T >::min_exponent10 = m10; \
-const int value< T >::max_exponent = M; \
+#define SPECIALIZE_EXPONENTS(T, m, m10, M, M10) \
+template<> \
+const int value< T >::min_exponent = m; \
+template<> \
+const int value< T >::min_exponent10 = m10; \
+template<> \
+const int value< T >::max_exponent = M; \
+template<> \
const int value< T >::max_exponent10 = M10
SPECIALIZE_EXPONENTS(float, FLT_MIN_EXP, FLT_MIN_10_EXP,
Index: src/locale.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/locale.cc,v
retrieving revision 1.36
diff -u -3 -p -r1.36 locale.cc
--- locale.cc 2001/07/04 02:39:02 1.36
+++ locale.cc 2001/07/19 21:49:37
@@ -603,6 +603,7 @@ namespace std
return __hi;
}
+ template<>
ctype_byname<char>::ctype_byname(const char* /*__s*/, size_t __refs)
: ctype<char>(new mask[table_size], true, __refs)
{ }
@@ -1002,11 +1003,14 @@ namespace std
return __incl_prec;
}
+ template <>
collate<char>::collate(size_t __refs)
: locale::facet(__refs) { }
+ template<>
collate<char>::~collate() { }
+ template<>
int
collate<char>::do_compare(const char* __lo1, const char* __hi1,
const char* __lo2, const char* __hi2) const
@@ -1022,11 +1026,13 @@ namespace std
return 0;
}
+ template<>
string
collate<char>::
do_transform(const char* __lo, const char* __hi) const
{ return string(__lo, __hi - __lo); }
+ template<>
long
collate<char>::
do_hash(const char* __lo, const char* __hi) const
@@ -1037,18 +1043,22 @@ namespace std
(__val >> (numeric_limits<unsigned long>::digits - 1)));
return __val;
}
-
+
+ template<>
collate_byname<char>::collate_byname(const char* /*__s*/, size_t __refs)
: collate<char>(__refs) { }
+ template<>
moneypunct_byname<char, false>::moneypunct_byname(const char* /*__s*/,
size_t __refs)
: moneypunct<char, false>(__refs) { }
+ template<>
moneypunct_byname<char, true>::moneypunct_byname(const char* /*__s*/,
size_t __refs)
: moneypunct<char, true>(__refs) { }
+ template<>
messages_byname<char>::
messages_byname(const char* /*__s*/, size_t __refs)
: messages<char>(__refs) { }
@@ -1205,16 +1215,20 @@ namespace std
return __hi;
}
+ template<>
ctype_byname<wchar_t>::
ctype_byname(const char* /*__s*/, size_t __refs)
: ctype<wchar_t>(__refs) { }
+ template<>
collate<wchar_t>::
collate(size_t __refs): locale::facet(__refs) { }
+ template<>
collate<wchar_t>::
~collate() { }
+ template<>
int
collate<wchar_t>::
do_compare(const wchar_t* /*__lo1*/, const wchar_t* /*__hi1*/,
@@ -1222,23 +1236,27 @@ namespace std
{
return 0; // XXX not done
}
-
+
+ template<>
wstring collate<wchar_t>::
do_transform(const wchar_t* /*__lo*/, const wchar_t* /*__hi*/) const
{
return wstring(); // XXX not done
}
+ template<>
long collate<wchar_t>::
do_hash(const wchar_t* /*__lo*/, const wchar_t* /*__hi*/) const
{
return 0; // XXX not done
}
+ template<>
collate_byname<wchar_t>::
collate_byname(const char* /*__s*/, size_t __refs)
: collate<wchar_t> (__refs) { }
+ template<>
messages_byname<wchar_t>::
messages_byname(const char* /*__s*/, size_t __refs)
: messages<wchar_t> (__refs) { }
More information about the Gcc-patches
mailing list