--- stdcxx-4.2.1/include/loc/_codecvt.h	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_codecvt.h	2011-06-23 11:56:07.510860582 -0700
@@ -48,9 +48,12 @@
 
 // 22.2.1.5 - Template class codecvt
 
-struct codecvt_base
+class codecvt_base
 {
+public:
     enum result { ok, partial, error, noconv };
+
+    virtual ~codecvt_base () { }
 };
 
 
@@ -73,6 +76,8 @@
 
 protected:
 
+    virtual ~codecvt ();
+
     // extension: where reasonable, the default behavior of the primary
     // template is the same as that of codecvt<char, char, mbstate_t> if
     // sizeof (intern_type) == sizeof (extern_type) to allow iostream
@@ -188,8 +193,6 @@
 
     _EXPLICIT codecvt (_RWSTD_SIZE_T = 0);
 
-    virtual ~codecvt ();
-
     result out (state_type &__state,
                 const intern_type *__from, const intern_type* __from_end,
                 const intern_type *&__from_next,
@@ -234,6 +237,8 @@
 
 protected:
 
+    virtual ~codecvt ();
+
     virtual result
     do_out (state_type&,
             const intern_type*, const intern_type*, const intern_type*&,
@@ -303,6 +308,8 @@
 
 protected:
 
+    virtual ~codecvt ();
+
     virtual result
     do_out (state_type&, const intern_type*, const intern_type*,
             const intern_type*&,
@@ -398,6 +405,11 @@
         : codecvt <_InternT, _ExternT, _StateT> (__ref) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+
+    virtual ~codecvt_byname () { }
+
 };
 
 
@@ -417,6 +429,8 @@
 
 protected:
 
+    virtual ~codecvt_byname () { }
+
     virtual codecvt_base::result
     do_out (state_type&,
             const intern_type*, const intern_type*, const intern_type*&,
#===========================================================================#

--- stdcxx-4.2.1/include/loc/_collate.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_collate.h	2011-01-07 18:26:19.591751655 -0500
@@ -86,6 +86,8 @@
 
 protected:
 
+    virtual ~collate () { }
+
     // protected virtual members are not defined
     virtual int
     do_compare (const char_type*, const char_type*,
@@ -133,6 +135,8 @@
 
 protected:
 
+    virtual ~collate () { }
+
     virtual int
     do_compare (const char_type*, const char_type*,
                 const char_type*, const char_type*) const;
@@ -179,6 +183,7 @@
 
 protected:
 
+    virtual ~collate () { }
     virtual int
     do_compare (const char_type*, const char_type*,
                 const char_type*, const char_type*) const;
@@ -204,6 +209,10 @@
         : collate<_CharT>(__ref) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+
+    virtual collate_byname () { }
 };
 
 
@@ -220,6 +229,8 @@
 
 protected:
 
+    virtual ~collate_byname() { }
+
     virtual int
     do_compare (const char_type*, const char_type*,
                 const char_type*, const char_type*) const;
@@ -244,6 +255,8 @@
 
 protected:
 
+    virtual ~collate_byname () { }
+
     virtual int
     do_compare (const char_type*, const char_type*,
                 const char_type*, const char_type*) const;
@@ -263,3 +276,4 @@
 
 
 #endif   // _RWSTD_LOC_COLLATE_H_INCLUDED
+

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_ctype.h	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_ctype.h	2011-06-23 12:55:19.000540849 -0700
@@ -64,11 +64,12 @@
 
 _RWSTD_NAMESPACE (std) { 
 
-struct _RWSTD_CLASS_EXPORT locale;
+class _RWSTD_CLASS_EXPORT locale;
 
 // 22.2.1
-struct _RWSTD_EXPORT ctype_base
+class _RWSTD_EXPORT ctype_base
 {
+public:
     // 22.2.1, p1 - mask is a bitmask type (see 17.3.3.1.2)
     typedef _RWSTD_BITMASK_ENUM (_RW::__rw_ctype_mask) mask;
 
@@ -83,6 +84,8 @@
     _RWSTD_STATIC_CONST (mask, xdigit = _RW::__rw_xdigit);
     _RWSTD_STATIC_CONST (mask, alnum  = _RW::__rw_alnum);
     _RWSTD_STATIC_CONST (mask, graph  = _RW::__rw_graph);
+
+    virtual ~ctype_base () { }
 };
 
 
@@ -103,7 +106,8 @@
     typedef _CharT char_type;
 
     _EXPLICIT ctype (_RWSTD_SIZE_T __ref = 0)
-        : _RW::__rw_facet (__ref) { }
+        : _RW::__rw_facet (__ref),
+   		ctype_base () 	{ }
 
 
     // 22.2.1.1.1, p1
@@ -171,6 +175,8 @@
 
 protected:
 
+    virtual ~ctype() { }
+
     // 22.2.1.1.2, p1
     virtual bool do_is (mask, char_type) const {
         return false;
@@ -286,14 +292,14 @@
 
 protected:
 
+    virtual ~ctype ();
+
     const mask* table () const _THROWS (()) {
         return _C_mask_tab;
     }
 
     static const mask* classic_table () _THROWS (());
 
-    virtual ~ctype ();
-
     virtual const char_type*
     do_toupper (char_type*, const char_type*) const;
 
@@ -394,6 +400,10 @@
         : ctype<_CharT>(__ref) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+
+    virtual ~ctype_byname () { }
 };
 
 
@@ -405,6 +415,10 @@
 public:
 
     _EXPLICIT ctype_byname (const char*, _RWSTD_SIZE_T = 0);
+
+protected:
+
+    virtual ~ctype_byname () { }
 };
 
 
@@ -653,3 +667,4 @@
 
 
 #endif   // _RWSTD_LOC_CTYPE_H_INCLUDED
+
#===========================================================================#

--- stdcxx-4.2.1/include/loc/_facet.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_facet.h	2011-01-07 14:25:25.827689177 -0500
@@ -39,19 +39,20 @@
 
 _RWSTD_NAMESPACE (std) { 
 
-struct _RWSTD_CLASS_EXPORT locale;
+class _RWSTD_CLASS_EXPORT locale;
 
 }   // namespace std
 
 
 _RWSTD_NAMESPACE (__rw) { 
 
-class _RWSTD_EXPORT __rw_locale;
+class _RWSTD_CLASS_EXPORT __rw_locale;
 
 struct __rw_access;
 
-struct _RWSTD_EXPORT __rw_facet: __rw_synchronized
+class _RWSTD_CLASS_EXPORT __rw_facet : public __rw_synchronized
 {
+public:
     // the type of a "constructor" function used to create facet objects
     // of standard types by the library
     typedef __rw_facet* (_C_ctor_t)(_RWSTD_SIZE_T, const char*);
@@ -225,15 +226,16 @@
     static __rw_facet*
     _C_manage (__rw_facet*, _C_facet_type, const char*, _C_ctor_t*);
 
-    friend struct _STD::locale;
+    friend class _STD::locale;
     friend class __rw_locale;
     friend struct __rw_facet_id;
     friend struct __rw_access;
 };
 
 
-struct _RWSTD_EXPORT __rw_facet_id
+class _RWSTD_EXPORT __rw_facet_id
 {
+public:
 #ifdef _RWSTD_NO_SPECIALIZED_FACET_ID
 
     __rw_facet_id () {

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_locale.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_locale.h	2011-01-07 14:37:52.736687266 -0500
@@ -119,36 +119,37 @@
 class ctype;
 
 _EXPORT template <class _CharT, class _Iter>
-struct money_get;
+class money_get;
 
 _EXPORT template <class _CharT, class _Iter>
-struct money_put;
+class money_put;
 
 _EXPORT template <class _CharT, bool _Intl>
-struct moneypunct;
+class moneypunct;
 
 _EXPORT template <class _CharT, class _Iter>
-struct num_get;
+class num_get;
 
 _EXPORT template <class _CharT, class _Iter>
-struct num_put;
+class num_put;
 
 _EXPORT template <class _CharT>
-struct numpunct;
+class numpunct;
 
 _EXPORT template <class _CharT, class _Iter>
 class time_get;
 
 _EXPORT template <class _CharT, class _Iter>
-struct time_put;
+class time_put;
 
 _EXPORT template <class _CharT>
 class messages;
 
  
 // 22.1.1
-struct _RWSTD_CLASS_EXPORT locale
+class _RWSTD_CLASS_EXPORT locale
 {
+public:
     // 22.1.1.1.1, p1
     typedef int category;
 
@@ -251,12 +252,11 @@
 
 #endif   // _RWSTD_NO_MEMBER_TEMPLATES
 
-
     // 22.1.1.2, p14
     _RWSTD_MEMBER_EXPORT locale (const locale&, const locale&, category);
 
     // 22.1.1.2, p16
-    _RWSTD_MEMBER_EXPORT ~locale() _THROWS (());
+    _RWSTD_MEMBER_EXPORT virtual ~locale() _THROWS (());
 
     // 22.1.1.2, p4
     _RWSTD_MEMBER_EXPORT const locale& operator= (const locale&) _THROWS (());

#===========================================================================#
--- stdcxx-4.2.1/include/loc/_messages.h	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_messages.h	2011-06-16 10:59:37.994304507 -0700
@@ -63,9 +63,12 @@
 _RWSTD_NAMESPACE (std) { 
 
 
-struct _RWSTD_EXPORT messages_base
+class _RWSTD_EXPORT messages_base
 {
+public:
     typedef int catalog;
+
+    virtual ~messages_base () { }
 };
 
 
@@ -102,6 +105,8 @@
 
 protected:
 
+    virtual ~messages () { }
+
     virtual catalog do_open (const string&, const locale&) const;
 
     virtual string_type do_get (catalog, int, int, const string_type&) const;
@@ -128,6 +133,7 @@
 template <class _CharT>
 class messages_byname: public messages<_CharT>
 {
+public:
     char _C_namebuf [32];
 
 public:
@@ -136,6 +142,10 @@
         : messages<_CharT>(__refs) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+
+    virtual ~messages_byname () { }
 };
 
 }   // namespace std
#===========================================================================#

--- stdcxx-4.2.1/include/loc/_money_get.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_money_get.h	2011-01-07 18:30:40.252939791 -0500
@@ -50,8 +50,9 @@
 
 _EXPORT
 template <class _CharT, class _InputIter = istreambuf_iterator<_CharT> >
-struct money_get: _RW::__rw_facet
+class money_get : public _RW::__rw_facet
 {
+public:
     typedef _CharT     char_type;
     typedef _InputIter iter_type;
     typedef
@@ -95,6 +96,8 @@
 
 #endif   // _RWSTD_NO_LONG_DOUBLE
 
+	virtual ~money_get () { }
+
     virtual iter_type
     do_get (iter_type __it, iter_type __end, bool __intl, ios_base &__fl,
             _RWSTD_IOSTATE &__err, string_type &__str) const {
@@ -134,13 +137,13 @@
 
 #if _RWSTD_INSTANTIATE (_MONEY_GET, _CHAR)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT money_get<char>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT money_get<char>);
 
 #endif   // _RWSTD_INSTANTIATE (_MONEY_GET, _CHAR)
 
 #if _RWSTD_INSTANTIATE (_MONEY_GET, _WCHAR_T)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT money_get<wchar_t>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT money_get<wchar_t>);
 
 #endif   // _RWSTD_INSTANTIATE (_MONEY_GET, _WCHAR_T)
 
@@ -153,3 +156,4 @@
 
 
 #endif   // _RWSTD_LOC_MONEY_GET_H_INCLUDED
+

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_moneypunct.h	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_moneypunct.h	2011-06-16 11:01:58.479524965 -0700
@@ -46,27 +46,31 @@
 
 _RWSTD_NAMESPACE (std) { 
 
-
 // 22.2.6.3
-struct money_base
+class money_base
 {
+public:
     enum part { none, space, symbol, sign, value };
     struct pattern { char field [4]; };
+
+    virtual ~money_base () { }
 };
 
 
 // 22.2.6.3
 _EXPORT
 template <class _CharT, bool _Intl = false>
-struct moneypunct: _RW::__rw_facet, public money_base
+class moneypunct : public _RW::__rw_facet, public money_base
 {
+public:
     typedef _CharT char_type;
     typedef
     basic_string<char_type, char_traits<char_type>, allocator<char_type> >
     string_type;
 
     _EXPLICIT moneypunct (_RWSTD_SIZE_T __refs = 0)
-        : _RW::__rw_facet (__refs) { }
+        : _RW::__rw_facet (__refs),
+		money_base () { }
 
     char_type decimal_point () const {
         return do_decimal_point ();
@@ -110,6 +114,8 @@
 
 protected:
 
+    virtual ~moneypunct () { }
+
     // 22.2.6.3.1, p1
     virtual char_type do_decimal_point () const {
         return *_C_get (this, _RW::__rw_dp);
@@ -211,6 +217,10 @@
         : moneypunct<_CharT, _Intl>(__ref) {
             this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
         }
+
+protected:
+
+    virtual ~moneypunct_byname () { }
 };
 
 
@@ -226,15 +236,15 @@
 
 #if _RWSTD_INSTANTIATE (_MONEYPUNCT, _CHAR)
 
-_RWSTD_INSTANTIATE_2 (struct _RWSTD_TI_EXPORT moneypunct<char, true>);
-_RWSTD_INSTANTIATE_2 (struct _RWSTD_TI_EXPORT moneypunct<char, false>);
+_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT moneypunct<char, true>);
+_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT moneypunct<char, false>);
 
 #endif   // _RWSTD_INSTANTIATE (_MONEYPUNCT, _CHAR)
 
 #if _RWSTD_INSTANTIATE (_MONEYPUNCT, _WCHAR_T)
 
-_RWSTD_INSTANTIATE_2 (struct _RWSTD_TI_EXPORT moneypunct<wchar_t, true>);
-_RWSTD_INSTANTIATE_2 (struct _RWSTD_TI_EXPORT moneypunct<wchar_t, false>);
+_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT moneypunct<wchar_t, true>);
+_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT moneypunct<wchar_t, false>);
 
 #endif   // _RWSTD_INSTANTIATE (_MONEYPUNCT, _WCHAR_T)
 
@@ -247,3 +257,4 @@
 
 
 #endif   // _RWSTD_LOC_MONEYPUNCT_H_INCLUDED
+
#===========================================================================#

--- stdcxx-4.2.1/include/loc/_money_put.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_money_put.h	2011-01-07 18:31:43.278708402 -0500
@@ -51,8 +51,10 @@
 // 22.2.6.2
 _EXPORT
 template <class _CharT, class _OutputIter = ostreambuf_iterator<_CharT> >
-struct money_put: _RW::__rw_facet
+class money_put : public _RW::__rw_facet
 {
+public:
+
     typedef _CharT      char_type;
     typedef _OutputIter iter_type;
 
@@ -78,6 +80,8 @@
 
 protected:
 
+    virtual ~money_put () { }
+
     // 22.2.6.2.2, p1
     virtual iter_type
     do_put (iter_type, bool, ios_base&, char_type, long double) const;

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_num_get.h	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_num_get.h	2011-06-23 11:45:25.850740566 -0700
@@ -51,8 +51,9 @@
 // 22.2.2.1
 _EXPORT
 template <class _CharT, class _InputIter = istreambuf_iterator<_CharT> >
-struct num_get: _RW::__rw_facet
+class num_get : public _RW::__rw_facet
 {
+public:
     typedef _CharT     char_type;
     typedef _InputIter iter_type;
 
@@ -157,6 +158,8 @@
 
 protected:
 
+    virtual ~num_get() { }
+
 #ifndef _RWSTD_NO_NATIVE_BOOL
 
     virtual iter_type
@@ -357,13 +360,13 @@
 
 #if _RWSTD_INSTANTIATE (_NUM_GET, _CHAR)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT num_get<char>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT num_get<char>);
 
 #endif   // _RWSTD_INSTANTIATE (_NUM_GET, _CHAR)
 
 #if _RWSTD_INSTANTIATE (_NUM_GET, _WCHAR_T)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT num_get<wchar_t>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT num_get<wchar_t>);
 
 #endif   // _RWSTD_INSTANTIATE (_NUM_GET, _WCHAR_T)

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_numpunct.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_numpunct.h	2011-01-07 18:35:01.795823207 -0500
@@ -53,8 +53,9 @@
 // 22.2.3.1
 _EXPORT
 template <class _CharT>
-struct numpunct: _RW::__rw_facet
+class numpunct : public _RW::__rw_facet
 {
+public:
     typedef _CharT char_type;
     typedef
     basic_string<char_type, char_traits<char_type>, allocator<char_type> >
@@ -63,8 +64,6 @@
     _EXPLICIT numpunct (_RWSTD_SIZE_T __ref = 0)
         : _RW::__rw_facet (__ref), _C_flags (0) { }
 
-    virtual ~numpunct ();
-
     // 22.2.3.1.1, p1
     char_type decimal_point () const;
 
@@ -84,6 +83,8 @@
 
 protected:
 
+    virtual ~numpunct () { }
+
     // 22.2.3.1.2, p1
     virtual char_type do_decimal_point () const {
         return *_RW::__rw_get_punct (this, _RW::__rw_dp, char_type ());
@@ -238,6 +239,10 @@
         : numpunct<_CharT>(__refs) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+
+    virtual ~numpunct_byname () { }
 };
 
 }   // namespace std
@@ -252,13 +257,13 @@
 
 #if _RWSTD_INSTANTIATE (_NUMPUNCT, _CHAR)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT numpunct<char>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT numpunct<char>);
 
 #endif   // _RWSTD_INSTANTIATE (_NUMPUNCT, _CHAR)
 
 #if _RWSTD_INSTANTIATE (_NUMPUNCT, _WCHAR_T)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT numpunct<wchar_t>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT numpunct<wchar_t>);
 
 #endif   // _RWSTD_INSTANTIATE (_NUMPUNCT, _WCHAR_T)
 

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_num_put.cc	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_num_put.cc	2011-01-07 18:34:22.399689475 -0500
@@ -63,7 +63,7 @@
 
 
 template <class _CharT, class _OutputIter /* = ostreambuf_iterator<_CharT> */>
-/* virtual */ num_put<_CharT, _OutputIter>::~num_put ()
+/* virtual */ num_put<_CharT, _OutputIter>::~num_put ()
 {
     // no-op
 }

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_num_put.h	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_num_put.h	2011-06-23 11:45:54.213483922 -0700
@@ -51,16 +51,15 @@
 // 22.2.2.2
 _EXPORT
 template <class _CharT, class _OutputIter = ostreambuf_iterator<_CharT> >
-struct num_put: _RW::__rw_facet
+class num_put : public _RW::__rw_facet
 {
+public:
     typedef _CharT      char_type;
     typedef _OutputIter iter_type;
 
     _EXPLICIT num_put (_RWSTD_SIZE_T __refs = 0)
         : _RW::__rw_facet (__refs) { }
 
-    virtual ~num_put ();
-
 #ifndef _RWSTD_NO_BOOL
 
     iter_type put (iter_type __it, ios_base& __flags, char_type __fill,
@@ -122,6 +121,8 @@
 
 protected:
 
+    virtual ~num_put ();
+
 #ifndef _RWSTD_NO_BOOL
 
     virtual iter_type
@@ -218,13 +219,13 @@
 
 #if _RWSTD_INSTANTIATE (_NUM_PUT, _CHAR)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT num_put<char>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT num_put<char>);
 
 #endif   // _RWSTD_INSTANTIATE (_NUM_PUT, _CHAR)
 
 #if _RWSTD_INSTANTIATE (_NUM_PUT, _WCHAR_T)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT num_put<wchar_t>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT num_put<wchar_t>);
 
 #endif   // _RWSTD_INSTANTIATE (_NUM_PUT, _WCHAR_T)
 
#===========================================================================#

--- stdcxx-4.2.1/include/loc/_time_get.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_time_get.h	2011-01-07 17:52:39.964752529 -0500
@@ -57,23 +57,29 @@
 
 
 // 22.2.5.1
-struct _RWSTD_EXPORT time_base
+class _RWSTD_EXPORT time_base
 {
+public:
    enum dateorder { no_order, dmy, mdy, ymd, ydm };
+
+   time_base() { }
+   virtual ~time_base() { }
 };
 
 
 // 22.2.5.1
 _EXPORT
 template <class _CharT, class _InputIter = istreambuf_iterator<_CharT> >
-class time_get: public _RW::__rw_facet, public time_base
+class time_get : public _RW::__rw_facet,
+				 public time_base
 {
 public:
     typedef _CharT                         char_type;
     typedef _InputIter                     iter_type;
 
     _EXPLICIT time_get (_RWSTD_SIZE_T __ref = 0)
-        : _RW::__rw_facet (__ref) { }
+        : _RW::__rw_facet (__ref),
+   		time_base () { }
 
     dateorder date_order() const { 
         return do_date_order(); 
@@ -134,6 +140,8 @@
 
 protected:
 
+    virtual ~time_get () { }
+
     virtual dateorder do_date_order()  const {
         return dateorder ();
     }
@@ -207,6 +215,9 @@
         : time_get<_CharT, _InputIter>(__ref) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+    virtual ~time_get_byname () { }
 };
 
 }   // namespace std

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_time_put.h	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_time_put.h	2011-01-07 18:36:06.500939415 -0500
@@ -53,8 +53,9 @@
 // 22.2.5.3
 _EXPORT
 template <class _CharT, class _OutputIter = ostreambuf_iterator<_CharT> >
-struct time_put: _RW::__rw_facet
+class time_put : public _RW::__rw_facet
 {
+public:
     typedef _CharT      char_type;
     typedef _OutputIter iter_type;
 
@@ -74,6 +75,9 @@
 
 protected:
 
+    // 22.2.5.3
+    virtual ~time_put() { }
+
     // 22.2.5.3.2, p1
     virtual iter_type
     do_put (iter_type, ios_base&, char_type, const tm*, char, char) const;
@@ -101,11 +105,14 @@
     char _C_namebuf [32];
 
 public:
-
+    //22.2.5.4
     _EXPLICIT time_put_byname (const char *__name, _RWSTD_SIZE_T __ref = 0)
         : time_put<_CharT, _OutputIter>(__ref) {
         this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
     }
+
+protected:
+    virtual ~time_put_byname() { }
 };
 
 }   // namespace std
@@ -120,13 +127,13 @@
 
 #if _RWSTD_INSTANTIATE (_TIME_PUT, _CHAR)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT time_put<char>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT time_put<char>);
 
 #endif   // _RWSTD_INSTANTIATE (_TIME_PUT, _CHAR)
 
 #if _RWSTD_INSTANTIATE (_TIME_PUT, _WCHAR_T)
 
-_RWSTD_INSTANTIATE_1 (struct _RWSTD_TI_EXPORT time_put<wchar_t>);
+_RWSTD_INSTANTIATE_1 (class _RWSTD_TI_EXPORT time_put<wchar_t>);
 
 #endif   // _RWSTD_INSTANTIATE (_TIME_PUT, _WCHAR_T)
 
@@ -139,3 +146,4 @@
 
 
 #endif   // _RWSTD_LOC_TIME_PUT_H_INCLUDED
+

#===========================================================================#

--- stdcxx-4.2.1/src/codecvt.cpp	2008-04-24 20:25:19.000000000 -0400
+++ stdcxx-4.2.1/src/codecvt.cpp	2011-01-07 18:25:48.692939914 -0500
@@ -105,7 +105,8 @@
 }
 
 
-/* virtual */ codecvt<char, char, _RWSTD_MBSTATE_T>::~codecvt ()
+/* virtual */
+codecvt<char, char, _RWSTD_MBSTATE_T>::~codecvt ()
 {
     // no-op
 }
@@ -264,6 +265,12 @@
     return 1;   // 22.2.1.5.2, p11
 }
 
+/* virtual */
+codecvt<wchar_t, char, _RWSTD_MBSTATE_T>::~codecvt ()
+{
+	// no-op
+}
+
 
 }   // namespace std
 
@@ -272,3 +279,4 @@
 _RWSTD_DEFINE_FACET_FACTORY (static, codecvt, TARGS_C, codecvt);
 _RWSTD_SPECIALIZE_USE_FACET (codecvt);
 
+

#===========================================================================#

--- stdcxx-4.2.1/src/ctype.cpp	2011-01-04 06:08:35.707605814 -0500
+++ stdcxx-4.2.1/src/ctype.cpp	2011-01-07 18:27:32.253787318 -0500
@@ -693,7 +693,7 @@
 }
 
 
-ctype<char>::~ctype ()
+ctype<char>::~ctype ()
 {
     if (_C_delete_it) {
         delete[] _RWSTD_CONST_CAST (mask*, _C_mask_tab);

#===========================================================================#

--- stdcxx-4.2.1/src/wctype.cpp	2008-04-24 20:25:19.000000000 -0400
+++ stdcxx-4.2.1/src/wctype.cpp	2011-01-07 18:38:16.685689748 -0500
@@ -442,7 +442,7 @@
 }
 
 
-ctype<wchar_t>::~ctype ()
+ctype<wchar_t>::~ctype ()
 {
     if (_C_delete_it) {
         delete[] _RWSTD_CONST_CAST (mask*, _C_mask_tab);
@@ -759,8 +759,7 @@
 }
 
 
-ctype_byname<wchar_t>::
-~ctype_byname ()
+ctype_byname<wchar_t>::~ctype_byname ()
 {
     // Release the codecvt database at this level
     if (_C_cvtimpl != 0 && _C_cvtsize != 0)

#===========================================================================#

--- stdcxx-4.2.1/tests/localization/22.locale.numpunct.cpp	2011-01-04 06:08:35.659216745 -0500
+++ stdcxx-4.2.1/tests/localization/22.locale.numpunct.cpp	2011-01-07 21:12:45.448937997 -0500
@@ -252,6 +252,19 @@
     return true;
 }
 
+template <class charT>
+class test_numpunct : public std::numpunct<charT>
+{
+public:
+
+	typedef std::basic_string<charT> string_type;
+
+	explicit test_numpunct(size_t refs = 0)
+	: std::numpunct<charT> (refs) { }
+
+	virtual ~test_numpunct () { }
+};
+
 /**************************************************************************/
 
 template <class charT>
@@ -259,11 +272,11 @@
                           const char        *tname,
                           const std::locale *loc)
 {
-    typedef std::numpunct<charT>    Punct;
+    typedef test_numpunct<charT>    Punct;
     typedef std::char_traits<charT> Traits;
 
     const charT c = loc ?
-          _STD_USE_FACET (Punct, *loc).decimal_point ()
+          _STD_USE_FACET (std::numpunct<charT>, *loc).decimal_point ()
         : Punct ().decimal_point ();
 
 
@@ -279,11 +292,11 @@
                           const char        *tname,
                           const std::locale *loc)
 {
-    typedef std::numpunct<charT>    Punct;
+    typedef test_numpunct<charT>    Punct;
     typedef std::char_traits<charT> Traits;
 
     const charT c = loc ?
-          _STD_USE_FACET (Punct, *loc).thousands_sep ()
+          _STD_USE_FACET (std::numpunct<charT>, *loc).thousands_sep ()
         : Punct ().thousands_sep ();
 
     rw_assert (Traits::eq (c, expect), 0, __LINE__,
@@ -299,10 +312,10 @@
                      const std::string &expect,
                      const std::locale *loc)
 {
-    typedef std::numpunct<charT> Punct;
+    typedef test_numpunct<charT> Punct;
 
     const std::string s = loc ?
-          _STD_USE_FACET (Punct, *loc).grouping ()
+          _STD_USE_FACET (std::numpunct<charT>, *loc).grouping ()
         : Punct ().grouping ();
 
     if (   s != expect
@@ -338,10 +351,10 @@
                       const char                     *tname,
                       const std::locale              *loc)
 {
-    typedef std::numpunct<charT> Punct;
+    typedef test_numpunct<charT> Punct;
 
     const std::basic_string<charT> s = loc ?
-          _STD_USE_FACET (Punct, *loc).falsename ()
+          _STD_USE_FACET (std::numpunct<charT>, *loc).falsename ()
         : Punct ().falsename ();
 
     const int char_size = int (sizeof (charT));
@@ -358,10 +371,10 @@
                      const char                     *tname,
                      const std::locale              *loc)
 {
-    typedef std::numpunct<charT> Punct;
+    typedef test_numpunct<charT> Punct;
 
     const std::basic_string<charT> s = loc ?
-          _STD_USE_FACET (Punct, *loc).truename ()
+          _STD_USE_FACET (std::numpunct<charT>, *loc).truename ()
         : Punct ().truename ();
 
     const int char_size = int (sizeof (charT));

--- stdcxx-4.2.1/src/locale_body.cpp	2011-01-12 23:02:08.654127020 -0500
+++ stdcxx-4.2.1/src/locale_body.cpp	2011-01-13 10:07:31.079752886 -0500
@@ -859,6 +859,22 @@
         return tmp;
     }
 
+	if (plocale && (plocale == classic)) {
+		// optimize the "destruction" of the classic C locale
+		// the object is never destroyed and its reference count
+		// never drops to 0
+		_RWSTD_ASSERT (__rw_is_C (locname));
+		_RWSTD_ASSERT (__rw_is_C (plocale->_C_name));
+
+		const size_t ref =
+			_RWSTD_ATOMIC_PREDECREMENT (plocale->_C_ref, false);
+
+		_RWSTD_ASSERT (ref + 1U != 0);
+		_RWSTD_UNUSED (ref);
+
+		return 0;
+	}
+
 
     // re-entrant to protect static local data structures
     // (not the locales themselves)
@@ -1079,24 +1095,33 @@
             return false;
         }
 
+		_RWSTD_ASSERT (0 == _C_usr_facets);
+
+		if ((_C_all == _C_std_facet_bits) && (0 == _C_byname_facet_bits)) {
+			// optimized for the C locale
+			_RWSTD_ASSERT (__rw_is_C (_C_name));
+
+			return true;
+		}
+
         // unless all facets in the same category come either from
         // the C locale or from some named locale the locale object
         // containing the facets is not managed (this test doesn't
         // detect categores of all byname facets not all of which
         // belong to the same named locale)
         if (   (_C_std_facet_bits & _C_all) != _C_all
-            || (_C_byname_facet_bits & _C_collate)
-            && (_C_byname_facet_bits & _C_collate)  != _C_collate
-            || (_C_byname_facet_bits & _C_ctype)
-            && (_C_byname_facet_bits & _C_ctype)    != _C_ctype
-            || (_C_byname_facet_bits & _C_monetary)
-            && (_C_byname_facet_bits & _C_monetary) != _C_monetary
-            || (_C_byname_facet_bits & _C_numeric)
-            && (_C_byname_facet_bits & _C_numeric)  != _C_numeric
-            || (_C_byname_facet_bits & _C_time)
-            && (_C_byname_facet_bits & _C_time)     != _C_time
-            || (_C_byname_facet_bits & _C_messages)
-            && (_C_byname_facet_bits & _C_messages) != _C_messages)
+            || ((_C_byname_facet_bits & _C_collate)
+            && (_C_byname_facet_bits & _C_collate)  != _C_collate)
+            || ((_C_byname_facet_bits & _C_ctype)
+            && (_C_byname_facet_bits & _C_ctype)    != _C_ctype)
+            || ((_C_byname_facet_bits & _C_monetary)
+            && (_C_byname_facet_bits & _C_monetary) != _C_monetary)
+            || ((_C_byname_facet_bits & _C_numeric)
+            && (_C_byname_facet_bits & _C_numeric)  != _C_numeric)
+            || ((_C_byname_facet_bits & _C_time)
+            && (_C_byname_facet_bits & _C_time)     != _C_time)
+            || ((_C_byname_facet_bits & _C_messages)
+            && (_C_byname_facet_bits & _C_messages) != _C_messages))
             return false;
 
         // check whether all _byname facets in each category belong

#===========================================================================#

--- stdcxx-4.2.1/src/locale_combine.cpp	2008-04-24 20:25:19.000000000 -0400
+++ stdcxx-4.2.1/src/locale_combine.cpp	2011-01-13 11:28:33.684689143 -0500
@@ -235,11 +235,11 @@
     // compute and assign facet bitmaps
     const int bits = _C_LC2facet_bits (cat);
 
-    _C_std_facet_bits    =   one._C_std_facet_bits & ~bits
-                           | other._C_std_facet_bits & bits;
+    _C_std_facet_bits    =   (one._C_std_facet_bits & ~bits)
+                           | (other._C_std_facet_bits & bits);
 
-    _C_byname_facet_bits =   one._C_byname_facet_bits & ~bits
-                           | other._C_byname_facet_bits & bits;
+    _C_byname_facet_bits =   (one._C_byname_facet_bits & ~bits)
+                           | (other._C_byname_facet_bits & bits);
 
     for (_RWSTD_SIZE_T i = 0; i != _C_n_std_facets; ++i) {
 
@@ -502,15 +502,12 @@
         const char *pcatnames [__rw_n_cats] = { 0 };
 
         // try the libc "native" separator first, semicolon next
-        const char *sep = strchr (locname, *_RWSTD_CAT_SEP);
-        if (!sep)
-            sep = ";";
-
-        for (const char *s = locname; *s; ) {
-
-            const char *next = strchr (s, *sep);
-            if (!next)
-                next = s + strlen (s);
+	const char* const psep = strchr (locname, *_RWSTD_CAT_SEP);
+        const char sep = psep ? *psep : ';';
+
+		// redundant check for s being non-null shuts up a bogus
+		// cadvise null pointer derefence warning
+        for (const char *s = locname; s && *s; ) {
 
             const char* const endcat = strchr (s, '=');
             if (!endcat)
@@ -530,7 +527,9 @@
                 }
             }
 
-            s = *next ? next + 1 : next;
+			// advance just past the next separator if one exists
+			const char* const next = strchr (s, sep);
+			s = next ? next + 1 : s + strlen (s);
         }
 
         // compose a normalized locale name out of category names
@@ -542,7 +541,7 @@
                 pcatnames [i] = "C";
             }
 
-            const char *endcat = strchr (pcatnames [i], *sep);
+            const char *endcat = strchr (pcatnames [i], sep);
 
             if (!endcat)
                 endcat = pcatnames [i] + strlen (pcatnames [i]);

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_num_get.cc	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_num_get.cc	2011-02-18 10:59:44.609114465 -0500
@@ -190,15 +190,26 @@
         _RWSTD_USE_FACET (numpunct<char_type>, __loc);
 
     // 22.2.2.1.2, p8: Stage 2
+#if defined(_STDCXX_SIZEOF_NUM_GET_BUFFER)
+    // size of allocated buffer
+    _RWSTD_SIZE_T __bufsize =
+        static_cast<_RWSTD_SIZE_T>(_STDCXX_SIZEOF_NUM_GET_BUFFER);
+    // dynamically allocated buffer
+    char* __buf = new (nothrow) char[__bufsize];
+	 if (!__buf) {
+        __err |= _RW::__rw_failbit;
+		 return __begin;
+	 }
+#else
+    // default statically-alocated buffer (1024 bits + 2)
+    char __buf [1024 + 2];                    // default buffer (1024 bits + 2)
+    _RWSTD_SIZE_T __bufsize = sizeof __buf;   // size of allocated buffer
+#endif
 
-    char __buf [128 + 2];                     // default buffer (128 bits + 2)
     char *__pbuf            = __buf;          // pointer to allocated buffer
     char *__pcur            = __buf;          // currently processed digit
-    _RWSTD_SIZE_T __bufsize = sizeof __buf;   // size of allocated buffer
 
-    _RWSTD_UNUSED (__bufsize);
-
-    const ctype<char_type> &__ctp = _RWSTD_USE_FACET (ctype<char_type>, __loc);
+    const ctype<char_type> &__ctp = _RWSTD_USE_FACET (std::ctype<char_type>, __loc);
 
     const _CharT __decimal_point = __pun.decimal_point ();
     const _CharT __thousands_sep = __pun.thousands_sep ();
@@ -210,7 +221,15 @@
 
     // buffer containing the sizes of thousands_sep-separated
     // groups of digits and a pointer to the next grouping
+#if defined(_STDCXX_SIZEOF_NUM_GET_BUFFER)
+    char* __grpbuf = new (nothrow) char[__bufsize];
+	 if (!__grpbuf) { 
+        __err |= _RW::__rw_failbit;
+		return __begin;
+	 }
+#else
     char __grpbuf [sizeof __buf];
+#endif
     char *__pgrp = __grpbuf;
 
     const char *__grpbeg = 0;   // the beginning of the last group
@@ -252,7 +271,7 @@
             break;
         }
 
-        if (__pcur == __buf + sizeof __buf - 1) {
+        if (__pcur == (__buf + __bufsize - 1)) {
             // FIXME: handle long strings of digits
             __err |= _RW::__rw_failbit;
             break;
@@ -293,6 +312,10 @@
                 // fatal error: thousands_sep characters must be separated
                 // by groups of one or more digits
                 __err |= _RW::__rw_failbit;                
+#if defined(_STDCXX_SIZEOF_NUM_GET_BUFFER)
+                delete[] __buf;
+                delete[] __grpbuf;
+#endif
                 return __begin;
             }
 
@@ -456,6 +479,10 @@
             if (   'e' == __pcur [-1]
                 || '-' == __pcur [-1] || '+' == __pcur [-1]) {
                 __err |= _RW::__rw_failbit;
+#if defined(_STDCXX_SIZEOF_NUM_GET_BUFFER)
+                delete[] __buf;
+                delete[] __grpbuf;
+#endif
                 return __begin;
             }
 
@@ -474,6 +501,10 @@
             // or more digits (i.e., valid input cannot start or end with
             // a thousands_sep); this needs to be clarified in the text
             __err |= _RW::__rw_failbit;
+#if defined(_STDCXX_SIZEOF_NUM_GET_BUFFER)
+            delete[] __buf;
+            delete[] __grpbuf;
+#endif
             return __begin;
         }
 
@@ -484,15 +515,15 @@
     *__pcur = '\0';
 
     // verify that the buffers haven't overflowed
-    _RWSTD_ASSERT (__pgrp < __grpbuf + sizeof __grpbuf);
+    _RWSTD_ASSERT (__pgrp < __grpbuf + __bufsize);
     _RWSTD_ASSERT (__pcur < __pbuf + __bufsize);
 
     // set the base determined above
-    const unsigned __fl2 =
-          __fl & ~_RWSTD_IOS_BASEFIELD
-        & ~(   _RWSTD_STATIC_CAST (unsigned, _RWSTD_IOS_BASEMASK)
-            << _RWSTD_IOS_BASEOFF)
-        | __base << _RWSTD_IOS_BASEOFF;
+    const unsigned int __fl2 =
+          (__fl & ~_RWSTD_IOS_BASEFIELD)
+        & ~((   _RWSTD_STATIC_CAST (unsigned int, _RWSTD_IOS_BASEMASK)
+            << _RWSTD_IOS_BASEOFF))
+        | (__base << _RWSTD_IOS_BASEOFF);
 
     // 22.2.2.1.2, p11: Stage 3
     const int __errtmp =
@@ -502,6 +533,11 @@
 
     __err |= _RWSTD_IOSTATE (__errtmp);
 
+#if defined(_STDCXX_SIZEOF_NUM_GET_BUFFER)
+    delete[] __buf;
+    delete[] __grpbuf;
+#endif
+
     return __begin;
 }

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_time_get.cc	2008-04-24 17:23:39.000000000 -0700
+++ stdcxx-4.2.1/include/loc/_time_get.cc	2011-03-22 15:24:06.922851958 -0700
@@ -127,10 +127,13 @@
         _RWSTD_IOSTATE &__err, tm *__tmb,
         char __fmt, char __modifier /* = '\0' */) const
 {
-    // enough pointers for 100 alternative numeric symbols and their sizes
-    const char_type* __names [100];
+    // enough pointers for 128 alternative numeric symbols and their sizes
+    const char_type* __names [128];
     _RWSTD_SIZE_T    __sizes [sizeof __names / sizeof *__names];
 
+    (void) memset(__names, '\0', sizeof(__names));
+    (void) memset(__sizes, '\0', sizeof(__sizes));
+
     const void** __pv =
         _RWSTD_REINTERPRET_CAST (const void**, __names);
 
@@ -138,7 +141,9 @@
 
     int *__pmem = 0;   // pointer to std::tm member
 
-    _RWSTD_SIZE_T __dup;   // number of allowed duplicates
+    _RWSTD_SIZE_T __dup = 0;   // number of allowed duplicates
+
+    _RWSTD_SIZE_T __nread = 0; // parse numeric input
 
     const ctype<char_type> &__ctp =
         _RWSTD_USE_FACET (ctype<char_type>, __fl.getloc ());
@@ -151,6 +156,21 @@
         __dup = 2;
         break;
 
+    case 'e': {
+        while (__ctp.is (ctype_base::space, *__it)) {
+	    ++__it;
+	    ++__nread;
+	}
+
+	if (__it == __end) {
+	    __err |= _RW::__rw_eofbit;
+	    break;
+	}
+
+	__dup = 1;
+	break;
+    }
+
     case 'n': case 't': {   // any whitespace
         
         for ( ; ; ++__it) {
@@ -279,10 +299,6 @@
     }
     else if (__pmem) {
 
-        // parse numeric input
-
-        _RWSTD_SIZE_T __nread = 0;
-
         int __mem = 0;
 
         for ( ; ; ++__it, ++__nread) {

#===========================================================================#

--- stdcxx-4.2.1/include/loc/_money_get.cc	2008-04-24 20:23:39.000000000 -0400
+++ stdcxx-4.2.1/include/loc/_money_get.cc	2011-01-13 15:21:44.879687845 -0500
@@ -83,7 +83,7 @@
     const ctype<_CharT> &__ctp = 
         _RWSTD_USE_FACET (ctype<_CharT>, __flags.getloc ());
 
-    char __buf [304];
+    char __buf [1024];
     char *__pcur = __buf;
 
     typedef _TYPENAME string_type::traits_type _Traits;
@@ -93,6 +93,8 @@
     const char *__grpstart = 0;      // the start of the last group
     const char *__grpend   = 0;      // the end of the last group
 
+	(void) memset(__buf, '\0', sizeof(__buf));
+	(void) memset(__grpbuf, '\0', sizeof(__grpbuf));
 
     int __sign = 0;    // the sign of the result if detected (-1, 0, or +1)
 
@@ -100,7 +102,7 @@
     // use a '+' and overwrite it with a '-' if necessary
     *__pcur++ = '+';
 
-    const int __fl = __flags.flags ();
+    const unsigned int __fl = __flags.flags ();
 
     typedef _RWSTD_SIZE_T _SizeT;
 
@@ -144,11 +146,11 @@
             // it is consumed only if it is followed by characters
             // required to complete the pattern (see example in
             // 22.2.6.1.2, p3)
-            if (   __fl & _RW::__rw_showbase
-                || __i < 2
-                || 2 == __i && (money_base::none != __pat.field [3])
-                || __sign < 0 && __ns.size () > 1
-                || __sign > 0 && __ps.size () > 1) {
+            if (   (__fl & _RW::__rw_showbase)
+                || (__i < 2)
+                || ((2 == __i) && (money_base::none != __pat.field [3]))
+                || ((__sign < 0) && (__ns.size () > 1))
+                || ((__sign > 0) && (__ps.size () > 1)) ) {
 
                 for (_SizeT __nc = 0; __nc != __cs.size ();
                      ++__nc, ++__it) {
@@ -156,7 +158,7 @@
 
                         // 22.2.6.1.2, p2: unless showbase is set,
                         //                 curr_symbol is optional
-                        if (__nc || __fl & _RW::__rw_showbase)
+                        if (__nc || (__fl & _RW::__rw_showbase))
                             __ebits |= _RW::__rw_failbit;
                         break;
                     }

#===========================================================================#

--- stdcxx-4.2.1/include/rw/_rawiter.h	2008-04-24 17:23:43.000000000 -0700
+++ stdcxx-4.2.1/include/rw/_rawiter.h	2011-03-17 18:50:56.176110516 -0700
@@ -133,7 +133,7 @@
 inline pair<_TypeT*, _Distance>
 get_temporary_buffer (_Distance __nelems, _TypeT*)
 {
-    pair<_TypeT*, _Distance> __res (0, 0);
+    pair<_TypeT*, _Distance> __res (0UL, 0);
 
 #if __GNUG__ >= 4
 
@@ -148,7 +148,7 @@
 
     __res.second =
         _RW::__rw_tmpbuf (_RWSTD_REINTERPRET_CAST (_VoidPtrT*, &__res.first),
-                          __nelems < 0 ? 0 : __nelems, sizeof (_TypeT));
+		((__nelems < 0) ? 0 : __nelems), sizeof (_TypeT));
 
     return __res;
 }

