--- boost_1_38_0/boost/scope_exit.hpp	Wed Jan 21 20:33:17 2009
+++ boost_1_38_0/boost/scope_exit.hpp	Fri Feb 27 02:00:47 2009
@@ -140,15 +140,101 @@
     typedef void (*BOOST_SCOPE_EXIT_AUX_TAG(id,i))(int var);
 
 
+#if BOOST_WORKAROUND(BOOST_MSVC,>=1300)
+    // Boost.Typeof for VC71's typeid-based workaround does not work
+    // to determine the type of 'this' due to error C2355 being
+    // incorrectly reported (a compiler bug that's present in 8 and 9
+    // also).  The typical avoidance strategy to evade this error is
+    // to make an indirect compile-time constant by assignment through
+    // enum, then use that as a type-index.  This cannot happen with
+    // the typeid() approach, only with a sizeof() approach.
+    // 
+    // The implementation below is the more general, type-index
+    // sizeof()-based approach implemented in Boost.Typeof which
+    // appears to work fine for typeof(this) provided the reference to
+    // 'this' is not present in the template argument list (i.e. the
+    // type-index is captured into a local enumerator before being
+    // used as a template argument).
+    //
+    // Inline documentation is removed and conditional compilation
+    // applied.
+    //
+    namespace boost { namespace scope_exit { namespace msvc_typeof_this
+    {
+        template<int ID>
+        struct msvc_typeid_wrapper {
+            typedef typename boost::type_of::msvc_extract_type<mpl::int_<ID> >::id2type id2type;
+            typedef typename id2type::type type;
+        };
+        template<>
+        struct msvc_typeid_wrapper<4> {
+            typedef msvc_typeid_wrapper<4> type;
+        };
+        template<typename T>
+        struct encode_type
+        {
+            BOOST_STATIC_CONSTANT(unsigned,value=BOOST_TYPEOF_INDEX(T));
+            typedef typename boost::type_of::msvc_register_type<T,mpl::int_<value> >::id2type type;
+            BOOST_STATIC_CONSTANT(unsigned,next=value+1);
+            BOOST_TYPEOF_NEXT_INDEX(next);
+        };
+        template<class T>
+        struct sizer
+        {
+            typedef char(*type)[encode_type<T>::value];
+        };
+        template<typename T> typename disable_if<
+            typename is_function<T>::type,
+            typename sizer<T>::type>::type encode_start(T const&);
+        template<typename T> typename enable_if<
+            typename is_function<T>::type,
+            typename sizer<T>::type>::type encode_start(T&);
+        template<typename Organizer, typename T>
+        boost::type_of::msvc_register_type<T,Organizer> typeof_register_type(const T&,Organizer* =0);
+
+    }}}
+
+# define BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() \
+    enum { BOOST_PP_CAT(boost_se_thistype_index_,__LINE__) = sizeof(*boost::scope_exit::msvc_typeof_this::encode_start(this)) }; \
+    typedef boost::scope_exit::msvc_typeof_this::msvc_typeid_wrapper<BOOST_PP_CAT(boost_se_thistype_index_,__LINE__)>::type
+
+#else // other Boost.Typeof 'this' appear to be okay
+# define BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() typedef BOOST_TYPEOF(this)
+#endif
+
+
+// "this capture" function-macros for when (*this) is requested
+//
+#define BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_this(seq)         this BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq))
+#define BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_this(id,seq)     BOOST_PP_CAT(se_this_type,id) se_this BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq))
+#define BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_this(seq)         se_this(se_this) BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_this(id)           BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() BOOST_PP_CAT(se_this_type,id);
+#define BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_this(id)          BOOST_PP_CAT(se_this_type,id) se_this;
+#define BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_this(id) \
+        inline BOOST_PP_CAT(se_this_type,id) operator->() { return boost_se_params_->se_this; }
+
+// "this capture" function-macros for when (*this) is not requested
+//
+#define BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_nothis(seq)
+#define BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_nothis(id,seq)
+#define BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_nothis(seq)
+
+#define BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_nothis(id)
+#define BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_nothis(id)
+#define BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_nothis(id)
+
+
 #ifdef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
 
-#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq)
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this)
 
 #define BOOST_SCOPE_EXIT_AUX_PARAM_INIT(r, id, i, var) \
     BOOST_PP_COMMA_IF(i) { BOOST_SCOPE_EXIT_AUX_DEREF(id,i,var) }
 
-#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq) \
-    = { BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) };
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this) \
+    = { BOOST_PP_CAT(BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_,this)(seq) \
+        BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) };
 
 #else
 
@@ -158,16 +244,18 @@
 #define BOOST_SCOPE_EXIT_AUX_MEMBER_INIT(r, id, i, var) BOOST_PP_COMMA_IF(i) \
     BOOST_SCOPE_EXIT_AUX_PARAM(id,i,var) ( BOOST_PP_CAT(a,i) )
 
-#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq)                        \
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this)                  \
     BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)(                                     \
+        BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_,this)(id,seq)    \
         BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CTOR_ARG, id, seq ) ) \
-    : BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER_INIT, id, seq) {}
+    : BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_,this)(seq)          \
+      BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER_INIT, id, seq) {}
 
 #define BOOST_SCOPE_EXIT_AUX_PARAM_INIT(r, id, i, var) \
     BOOST_PP_COMMA_IF(i) BOOST_SCOPE_EXIT_AUX_DEREF(id,i,var)
 
-#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq) \
-    ( BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) );
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this) \
+    ( BOOST_PP_CAT(BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_,this)(seq) BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) );
 
 #endif
 
@@ -206,14 +294,16 @@
         BOOST_SCOPE_EXIT_AUX_PARAM_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var);
 
 
-#define BOOST_SCOPE_EXIT_AUX_IMPL(id, seq, ty)                                 \
+#define BOOST_SCOPE_EXIT_AUX_IMPL(id, seq, ty, this) \
     BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_TAG_DECL, id, seq)            \
-    BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL, (id,ty), seq)  \
-    struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) {                                 \
-        BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_DECL, (id,ty), seq)\
+    BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL, (id,ty), seq)   \
+    BOOST_PP_CAT(BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_,this)(id)                  \
+    struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) {                                 \
+        BOOST_PP_CAT(BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_,this)(id)             \
+        BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_DECL, (id,ty), seq) \
         BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER, id, seq)          \
-        BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq)                            \
-    } BOOST_SCOPE_EXIT_AUX_PARAMS(id) BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq)\
+        BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this)                      \
+    } BOOST_SCOPE_EXIT_AUX_PARAMS(id) BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this)\
     boost::scope_exit::aux::declare<sizeof(boost_scope_exit_args)>             \
         ::apply<0> boost_scope_exit_args;                                      \
     boost_scope_exit_args.value = &BOOST_SCOPE_EXIT_AUX_PARAMS(id);            \
@@ -223,18 +313,26 @@
             : boost_se_params_(                                                \
                   (BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)*)boost_se_params)         \
         {}                                                                     \
+        BOOST_PP_CAT(BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_,this)(id)          \
         ~BOOST_SCOPE_EXIT_AUX_GUARD_T(id)() { boost_se_body(                   \
             BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_ARG, id, seq) ); }    \
-        static void boost_se_body(BOOST_PP_SEQ_FOR_EACH_I(                     \
+        void boost_se_body(BOOST_PP_SEQ_FOR_EACH_I(                            \
             BOOST_SCOPE_EXIT_AUX_ARG_DECL, (id,ty), seq) )
 
 #if defined(BOOST_MSVC)
 
+#ifndef BOOST_SCOPE_EXIT_DONT_DISABLE_C4003
+#pragma warning(disable:4003)
+#endif
+
 #define BOOST_SCOPE_EXIT_END } BOOST_SCOPE_EXIT_AUX_GUARD(__COUNTER__) ( \
     boost_scope_exit_args.value);
 
 #define BOOST_SCOPE_EXIT(seq) \
-    BOOST_SCOPE_EXIT_AUX_IMPL(__COUNTER__, seq, BOOST_PP_EMPTY())
+    BOOST_SCOPE_EXIT_AUX_IMPL(__COUNTER__, seq, BOOST_PP_EMPTY(), nothis)
+
+#define BOOST_SCOPE_EXIT_THIS(seq) \
+    BOOST_SCOPE_EXIT_AUX_IMPL(__COUNTER__, seq, BOOST_PP_EMPTY(), this)
 
 #else
 
@@ -242,15 +340,21 @@
     boost_scope_exit_args.value);
 
 #define BOOST_SCOPE_EXIT(seq) \
-    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY())
+    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY(), nothis)
+
+#define BOOST_SCOPE_EXIT_THIS(seq) \
+    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY(), this)
 
 #endif
 
 #ifdef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
 #define BOOST_SCOPE_EXIT_TPL(seq) \
-    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, typename)
+    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, typename, nothis)
+#define BOOST_SCOPE_EXIT_THIS_TPL(seq) \
+    BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, typename, this)
 #else
-#define BOOST_SCOPE_EXIT_TPL(seq) BOOST_SCOPE_EXIT(seq)
+#define BOOST_SCOPE_EXIT_TPL(seq)      BOOST_SCOPE_EXIT(seq)
+#define BOOST_SCOPE_EXIT_THIS_TPL(seq) BOOST_SCOPE_EXIT_THIS(seq)
 #endif
 
 #endif // #ifndef FILE_boost_scope_exit_hpp_INCLUDED
--- boost_1_38_0/boost/typeof/msvc/typeof_impl.hpp	Fri Feb 27 08:06:09 2009
+++ boost_1_38_0/boost/typeof/msvc/typeof_impl.hpp	Fri Feb 27 08:06:51 2009
@@ -70,7 +70,7 @@
             }
         };
 
-# define BOOST_TYPEOF_INDEX(T) (encode_counter<T>::count)
+# define BOOST_TYPEOF_INDEX(T) (boost::type_of::encode_counter<T>::count)
 # define BOOST_TYPEOF_NEXT_INDEX(next)
 # else
         template<int N> struct encode_counter : encode_counter<N - 1> {};
@@ -80,7 +80,7 @@
         char (*encode_index(...))[5];
 
 # define BOOST_TYPEOF_INDEX(T) (sizeof(*boost::type_of::encode_index((boost::type_of::encode_counter<1005>*)0)))
-# define BOOST_TYPEOF_NEXT_INDEX(next) friend char (*encode_index(encode_counter<next>*))[next];
+# define BOOST_TYPEOF_NEXT_INDEX(next) friend char (*boost::type_of::encode_index(encode_counter<next>*))[next];
 # endif
 
         //Typeof code
