2008-10-14  Farid Zaripov  <faridz@apache.org>

	Merged revs 687762, 694649, 694675, 694677, 697885, 700895,
	704366 from 4.2.x branch.


	2008-08-21  Farid Zaripov  <faridz@apache.org>
	STDCXX-976
	* include/rw/_specialized.h (uninitialized_copy) [!__HP_aCC]:
	Explicitly cast *__first into const reference to the
	iterator_traits<_InputIterator>::value_type type for accepting
	_InputIterator's with operator*() returning rvalue.


	2008-09-12  Farid Zaripov  <faridz@apache.org>
	* src/time_put.cpp (__rw_get_timepunct): Cast off to _RWSTD_UINT32_T
	to shut up conversion warnings on 64-bit MSVC.


	2008-09-12  Farid Zaripov  <faridz@apache.org>
	STDCXX-968
	STDCXX-1009
	* include/rw/_select.h: Use 1L for select discriminator to avoid
	64-bit migration warnings for converting the integer to pointer.


	2008-09-22  Farid Zaripov  <faridz@apache.org>
	STDCXX-976
	* include/rw/_specialized.h: Reverted r694675.
	(uninitialized_copy): Use ::new() instead of __rw::__rw_construct().


	2008-09-12  Farid Zaripov  <faridz@apache.org>
	STDCXX-976
	* include/rw/_specialized.h (uninitialized_copy): Reverted r687762.
	Added const _TypeU& overloads of the __rw_construct().


	2008-10-01  Farid Zaripov  <faridz@apache.org>
	* etc/config/xfail.txt: Removed lines, corresponding to
	recently resolved STDCXX-1009 issue.


	2008-10-14  Martin Sebor  <sebor@roguewave.com>
	* include/rw/_specialized.h (uninitialized_copy): avoid
	const-qualifying ptr to prevent an HP aCC 3 bug (see STDCXX-1021).


git-svn-id: https://svn.apache.org/repos/asf/stdcxx/trunk@704438 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/etc/config/xfail.txt b/etc/config/xfail.txt
index 13b6e8e..6845a0e 100644
--- a/etc/config/xfail.txt
+++ b/etc/config/xfail.txt
@@ -68,10 +68,8 @@
 2.smartptr.shared   hpux-*-*-acc-3.*-*              COMP      STDCXX-615
 19.exceptions.mt    aix-5.3-*-vacpp-9.0-{12,15}?    HUP       STDCXX-644
 21.string.assign.stdcxx-629    *-*-*-*-*            ABRT      STDCXX-629
-21.string.exceptions           *-*-*-*-*            COMP      STDCXX-1009
 21.string.insert.stdcxx-632    *-*-*-*-*            ABRT      STDCXX-632
 21.string.replace.stdcxx-170   *-*-*-*-*            ABRT      STDCXX-170
-21.string.stdcxx-1009          *-*-*-*-*            COMP      STDCXX-1009
 21.string.stdcxx-162  linux*-*-{amd64,em64t}-*-*-{12,15}{D,S} ABRT STDCXX-162
 23.vector.modifiers.stdcxx-495 *-*-*-*-*            ABRT      STDCXX-495
 25.uninitialized.copy.stdcxx-976 *-*-*-*-*          COMP      STDCXX-976
diff --git a/include/rw/_select.h b/include/rw/_select.h
index e682957..070660c 100644
--- a/include/rw/_select.h
+++ b/include/rw/_select.h
@@ -89,7 +89,7 @@
 
 #if !defined (__SUNPRO_CC) || __SUNPRO_CC > 0x530
 #  define _RWSTD_DISPATCH(iter)   \
-       (typename _RW::__rw_select_int< iter >::_SelectT (0))
+       (typename _RW::__rw_select_int< iter >::_SelectT (1L))
 
 #else
    // working around a SunPro 5.3 a prior bug (PR #28739)
diff --git a/include/rw/_specialized.h b/include/rw/_specialized.h
index f041f6b..b808a22 100644
--- a/include/rw/_specialized.h
+++ b/include/rw/_specialized.h
@@ -52,6 +52,11 @@
 #endif   // _RWSTD_RW_NEW_H_INCLUDED
 
 
+#ifndef _RWSTD_RW_ITERBASE_H_INCLUDED
+#  include <rw/_iterbase.h>
+#endif   // _RWSTD_RW_ITERBASE_H_INCLUDED
+
+
 _RWSTD_NAMESPACE (__rw) { 
 
 
@@ -162,10 +167,15 @@
                     _ForwardIterator __res)
 {
     const _ForwardIterator __start = __res;
+    typedef typename iterator_traits<_ForwardIterator>::value_type _TypeT;
 
     _TRY {
-        for (; __first != __last; ++__first, ++__res)
-            _RW::__rw_construct (&*__res, *__first);
+        for (; __first != __last; ++__first, ++__res) {
+            // avoid const-qualifying ptr to prevent an HP aCC 3 bug
+            volatile void* /* const */ __ptr =
+                _RWSTD_STATIC_CAST (volatile void*, &*__res);
+            ::new (_RWSTD_CONST_CAST (void*, __ptr)) _TypeT (*__first);
+        }
     }
     _CATCH (...) {
         _RW::__rw_destroy (__start, __res);
diff --git a/src/time_put.cpp b/src/time_put.cpp
index 5366996..245a9b6 100644
--- a/src/time_put.cpp
+++ b/src/time_put.cpp
@@ -706,12 +706,14 @@
 
         len = strftime (pbuf + off, bufsize - off, "%a", &t);
 
-        pun->abday_off [0][t.tm_wday]  = off;
+        pun->abday_off [0][t.tm_wday]  =
+            _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                           += len + 1;
 
         len = strftime (pbuf + off, bufsize - off, "%A", &t);
 
-        pun->day_off [0][t.tm_wday]  = off;
+        pun->day_off [0][t.tm_wday]  =
+            _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                         += len + 1;
 
 #  ifndef _RWSTD_NO_WCHAR_T
@@ -726,13 +728,14 @@
         wchar_t *pwbuf = _RWSTD_REINTERPRET_CAST (wchar_t*, pbuf + off);
         len = wcsftime (pwbuf, (bufsize - off) / sizeof (*pwbuf), L"%a", &t);
 
-        pun->abday_off [1][t.tm_wday]  = off;
+        pun->abday_off [1][t.tm_wday]  =
+            _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                           += (len + 1) * sizeof (wchar_t);
 
         pwbuf = _RWSTD_REINTERPRET_CAST (wchar_t*, pbuf + off);
         len   = wcsftime (pwbuf, (bufsize - off) / sizeof (*pwbuf), L"%A", &t);
 
-        pun->day_off [1][t.tm_wday]  = off;
+        pun->day_off [1][t.tm_wday] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                         += (len + 1) * sizeof (wchar_t);
 
 #    else   // if defined (_RWSTD_NO_WCSFTIME)
@@ -786,12 +789,13 @@
 
         len = strftime (pbuf + off, bufsize - off, "%b", &t);
 
-        pun->abmon_off [0][t.tm_mon]  = off;
+        pun->abmon_off [0][t.tm_mon]  = 
+            _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                          += len + 1;
 
         len = strftime (pbuf + off, bufsize - off, "%B", &t);
 
-        pun->mon_off [0][t.tm_mon]  = off;
+        pun->mon_off [0][t.tm_mon]  = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                        += len + 1;
 
 #  ifndef _RWSTD_NO_WCHAR_T
@@ -806,13 +810,14 @@
         wchar_t *pwbuf = _RWSTD_REINTERPRET_CAST (wchar_t*, pbuf + off);
         len = wcsftime (pwbuf, (bufsize - off) / sizeof (*pwbuf), L"%b", &t);
 
-        pun->abmon_off [1][t.tm_mon]  = off;
+        pun->abmon_off [1][t.tm_mon]  =
+            _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                          += (len + 1) * sizeof (wchar_t);
 
         pwbuf = _RWSTD_REINTERPRET_CAST (wchar_t*, pbuf + off);
         len   = wcsftime (pwbuf, (bufsize - off) / sizeof (*pwbuf), L"%B", &t);
 
-        pun->mon_off [1][t.tm_mon]  = off;
+        pun->mon_off [1][t.tm_mon]  = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
         off                        += (len + 1) * sizeof (wchar_t);
 
 #    else   // if defined (_RWSTD_NO_WCSFTIME)
@@ -863,22 +868,22 @@
     // copy AM/PM designations
     t.tm_hour = 1;
     len = strftime (pbuf + off, bufsize - off, "%p", &t);
-    pun->am_pm_off [0][0] = off;
+    pun->am_pm_off [0][0] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off += len + 1;
     
     t.tm_hour = 13;
     len = strftime (pbuf + off, bufsize - off, "%p", &t);
-    pun->am_pm_off [0][1] = off;
+    pun->am_pm_off [0][1] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off += len + 1;
 
     // determine the locale's "%x" format (date representation)
     len                 = __rw_get_date_fmat (pbuf + off);
-    pun->d_fmt_off [0]  = off;
+    pun->d_fmt_off [0]  = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                += len + 1;
     
     // determine the locale's "%X" format (time representation)
     len                 = __rw_get_time_fmat (pbuf + off);
-    pun->t_fmt_off [0]  = off;
+    pun->t_fmt_off [0]  = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                += len + 1;
 
     // FIXME: determine "%r" at runtime (just like "%x" and "%X")
@@ -889,7 +894,7 @@
 
     len = sizeof t_fmt_ampm_fmat;
     memcpy (pbuf + off, t_fmt_ampm_fmat, len);
-    pun->t_fmt_ampm_off [0]  = off;
+    pun->t_fmt_ampm_off [0]  = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                     += len;
 
     // FIXME: determine "%c" at runtime (just like "%x" and "%X"),
@@ -899,14 +904,14 @@
     static const char d_t_fmat[] = "%a %b %e %H:%M:%S %Y";
     len                  = sizeof d_t_fmat;
     memcpy (pbuf + off, d_t_fmat, len);
-    pun->d_t_fmt_off [0]  = off;
+    pun->d_t_fmt_off [0]  = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                  += len;
 
     // FIXME: determine "%Ec", "%EX", "%Ex"
     pbuf [off]               = '\0';
-    pun->era_d_t_fmt_off [0] = off;
-    pun->era_d_fmt_off [0]   = off;
-    pun->era_t_fmt_off [0]   = off;
+    pun->era_d_t_fmt_off [0] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
+    pun->era_d_fmt_off [0]   = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
+    pun->era_t_fmt_off [0]   = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                     += 1;
 
 #  ifndef _RWSTD_NO_WCHAR_T
@@ -924,13 +929,13 @@
     t.tm_hour = 1;
     pwbuf     = _RWSTD_REINTERPRET_CAST (wchar_t*, pbuf + off);
     len       = wcsftime (pwbuf, (bufsize - off) / sizeof (*pwbuf), L"%p", &t);
-    pun->am_pm_off [1][0] = off;
+    pun->am_pm_off [1][0] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off += (len + 1) * sizeof (wchar_t);
     
     t.tm_hour = 13;
     pwbuf     = _RWSTD_REINTERPRET_CAST (wchar_t*, pbuf + off);
     len       = wcsftime (pwbuf, (bufsize - off) / sizeof (*pwbuf), L"%p", &t);
-    pun->am_pm_off [1][1] = off;
+    pun->am_pm_off [1][1] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off += (len + 1) * sizeof (wchar_t);
 
 #    else   // if defined (_RWSTD_NO_WCSFTIME)
@@ -986,7 +991,7 @@
         size += 1;
     }
 
-    pun->d_fmt_off [1] = off;
+    pun->d_fmt_off [1] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off               += size * sizeof (wchar_t);
     
     // convert "%X" to its wide equivalent
@@ -1004,7 +1009,7 @@
         size += 1;
     }
 
-    pun->t_fmt_off [1] = off;
+    pun->t_fmt_off [1] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off               += size * sizeof (wchar_t);
 
     // convert "%c" to its wide equivalent
@@ -1022,7 +1027,7 @@
         size += 1;
     }
 
-    pun->d_t_fmt_off [1] = off;
+    pun->d_t_fmt_off [1] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                 += size * sizeof (wchar_t);
 
     // convert "%r" to its wide equivalent
@@ -1040,7 +1045,7 @@
         size += 1;
     }
 
-    pun->t_fmt_ampm_off [1] = off;
+    pun->t_fmt_ampm_off [1] = _RWSTD_STATIC_CAST (_RWSTD_UINT32_T, off);
     off                    += size * sizeof (wchar_t);
 
 #  endif   // _RWSTD_NO_WCHAR_T