libstdc++-v3:

2013-06-14  Joern Rennecke <joern.renne...@embecosm.com>

        * include/bits/locale_facets_nonio.h (__tm_small_int): typedef/define.
        (_M_extract_num): Templatize base type of __member argument.
        (_M_extract_name): Change type of __member argument to __tm_small_int&.
        * include/bits/locale_facets_nonio.tcc (_M_extract_via_format) <Z>:
        Change type of __tmp to __tm_small_int.
        (_M_extract_num): Templatize base type of __member argument.
        (_M_extract_name): Change type of __member argument to __tm_small_int&.

Index: include/bits/locale_facets_nonio.h
===================================================================
--- include/bits/locale_facets_nonio.h  (revision 216243)
+++ include/bits/locale_facets_nonio.h  (working copy)
@@ -42,6 +42,15 @@ namespace std _GLIBCXX_VISIBILITY(defaul
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
+#ifdef __AVR__
+/* The struct tm defined in avr-libc/include/time.h uses int8_t for a number
+   of fields.  To allow overload resolution to succeed, we need to adjust
+   some data structures and functions to match.  */
+typedef typeof (((tm*)0)->tm_sec) __tm_small_int;
+#else /* For 100% mangling compatibility, use int directly.  */
+#define __tm_small_int int
+#endif
+
   /**
    *  @brief  Time format ordering data.
    *  @ingroup locales
@@ -654,14 +663,16 @@ namespace std _GLIBCXX_VISIBILITY(defaul
                  ios_base::iostate& __err, tm* __tm) const;
 
       // Extract numeric component of length __len.
+      template <typename _Member_t>
       iter_type
-      _M_extract_num(iter_type __beg, iter_type __end, int& __member,
+      _M_extract_num(iter_type __beg, iter_type __end, _Member_t& __member,
                     int __min, int __max, size_t __len,
                     ios_base& __io, ios_base::iostate& __err) const;
 
       // Extract any unique array of string literals in a const _CharT* array.
       iter_type
-      _M_extract_name(iter_type __beg, iter_type __end, int& __member,
+      _M_extract_name(iter_type __beg, iter_type __end,
+                     __tm_small_int& __member,
                      const _CharT** __names, size_t __indexlen,
                      ios_base& __io, ios_base::iostate& __err) const;
 
Index: include/bits/locale_facets_nonio.tcc
===================================================================
--- include/bits/locale_facets_nonio.tcc        (revision 216243)
+++ include/bits/locale_facets_nonio.tcc        (working copy)
@@ -796,7 +796,7 @@ namespace std _GLIBCXX_VISIBILITY(defaul
                  // Timezone info.
                  if (__ctype.is(ctype_base::upper, *__beg))
                    {
-                     int __tmp;
+                     __tm_small_int __tmp;
                      __beg = _M_extract_name(__beg, __end, __tmp,
                                       __timepunct_cache<_CharT>::_S_timezones,
                                              14, __io, __tmperr);
@@ -837,9 +837,10 @@ namespace std _GLIBCXX_VISIBILITY(defaul
     }
 
   template<typename _CharT, typename _InIter>
+  template<typename _Member_t>
     _InIter
     time_get<_CharT, _InIter>::
-    _M_extract_num(iter_type __beg, iter_type __end, int& __member,
+    _M_extract_num(iter_type __beg, iter_type __end, _Member_t& __member,
                   int __min, int __max, size_t __len,
                   ios_base& __io, ios_base::iostate& __err) const
     {
@@ -882,7 +883,7 @@ namespace std _GLIBCXX_VISIBILITY(defaul
   template<typename _CharT, typename _InIter>
     _InIter
     time_get<_CharT, _InIter>::
-    _M_extract_name(iter_type __beg, iter_type __end, int& __member,
+    _M_extract_name(iter_type __beg, iter_type __end, __tm_small_int& __member,
                    const _CharT** __names, size_t __indexlen,
                    ios_base& __io, ios_base::iostate& __err) const
     {

Reply via email to