$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r57992 - in branches/release/boost/test: . detail impl output utils utils/basic_cstring utils/runtime utils/runtime/cla utils/runtime/cla/iface utils/runtime/env
From: gennadiy.rozental_at_[hidden]
Date: 2009-11-28 04:19:21
Author: rogeeff
Date: 2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
New Revision: 57992
URL: http://svn.boost.org/trac/boost/changeset/57992
Log:
merge into release
Text files modified: 
   branches/release/boost/test/detail/unit_test_parameters.hpp        |    39 +++++----                               
   branches/release/boost/test/execution_monitor.hpp                  |    19 +++-                                    
   branches/release/boost/test/floating_point_comparison.hpp          |     4                                         
   branches/release/boost/test/impl/compiler_log_formatter.ipp        |    32 +++++--                                 
   branches/release/boost/test/impl/debug.ipp                         |     4                                         
   branches/release/boost/test/impl/execution_monitor.ipp             |   164 ++++++++++++++++++++++++++++++++------- 
   branches/release/boost/test/impl/progress_monitor.ipp              |     4                                         
   branches/release/boost/test/impl/results_collector.ipp             |     6                                         
   branches/release/boost/test/impl/results_reporter.ipp              |     6                                         
   branches/release/boost/test/impl/unit_test_log.ipp                 |     9 -                                       
   branches/release/boost/test/impl/unit_test_parameters.ipp          |    49 +++++++++++                             
   branches/release/boost/test/impl/xml_log_formatter.ipp             |    24 +++-                                    
   branches/release/boost/test/output/compiler_log_formatter.hpp      |     2                                         
   branches/release/boost/test/output/xml_log_formatter.hpp           |     2                                         
   branches/release/boost/test/unit_test_log_formatter.hpp            |     9 +                                       
   branches/release/boost/test/unit_test_suite.hpp                    |    13 ++                                      
   branches/release/boost/test/utils/basic_cstring/basic_cstring.hpp  |     2                                         
   branches/release/boost/test/utils/runtime/argument.hpp             |    14 +-                                      
   branches/release/boost/test/utils/runtime/cla/argument_factory.hpp |    26 +++---                                  
   branches/release/boost/test/utils/runtime/cla/argv_traverser.hpp   |     2                                         
   branches/release/boost/test/utils/runtime/cla/id_policy.hpp        |     2                                         
   branches/release/boost/test/utils/runtime/cla/iface/id_policy.hpp  |     2                                         
   branches/release/boost/test/utils/runtime/cla/parser.hpp           |     6                                         
   branches/release/boost/test/utils/runtime/config.hpp               |     9 ++                                      
   branches/release/boost/test/utils/runtime/env/environment.ipp      |     8 +                                       
   branches/release/boost/test/utils/xml_printer.hpp                  |     9 -                                       
   26 files changed, 341 insertions(+), 125 deletions(-)
Modified: branches/release/boost/test/detail/unit_test_parameters.hpp
==============================================================================
--- branches/release/boost/test/detail/unit_test_parameters.hpp	(original)
+++ branches/release/boost/test/detail/unit_test_parameters.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -20,6 +20,9 @@
 
 #include <boost/test/detail/suppress_warnings.hpp>
 
+// STL
+#include <iosfwd>
+
 //____________________________________________________________________________//
 
 namespace boost {
@@ -32,24 +35,26 @@
 
 namespace runtime_config {
 
-void                    BOOST_TEST_DECL init( int& argc, char** argv );
+BOOST_TEST_DECL void                     init( int& argc, char** argv );
 
-unit_test::log_level    BOOST_TEST_DECL log_level();
-bool                    BOOST_TEST_DECL no_result_code();
-unit_test::report_level BOOST_TEST_DECL report_level();
-const_string            BOOST_TEST_DECL test_to_run();
-const_string            BOOST_TEST_DECL break_exec_path();
-bool                    BOOST_TEST_DECL save_pattern();
-bool                    BOOST_TEST_DECL show_build_info();
-bool                    BOOST_TEST_DECL show_progress();
-bool                    BOOST_TEST_DECL catch_sys_errors();
-bool                    BOOST_TEST_DECL auto_start_dbg();
-bool                    BOOST_TEST_DECL use_alt_stack();
-bool                    BOOST_TEST_DECL detect_fp_exceptions();
-output_format           BOOST_TEST_DECL report_format();
-output_format           BOOST_TEST_DECL log_format();
-long                    BOOST_TEST_DECL detect_memory_leaks();
-int                     BOOST_TEST_DECL random_seed();
+BOOST_TEST_DECL unit_test::log_level     log_level();
+BOOST_TEST_DECL bool                     no_result_code();
+BOOST_TEST_DECL unit_test::report_level  report_level();
+BOOST_TEST_DECL const_string             test_to_run();
+BOOST_TEST_DECL const_string             break_exec_path();
+BOOST_TEST_DECL bool                     save_pattern();
+BOOST_TEST_DECL bool                     show_build_info();
+BOOST_TEST_DECL bool                     show_progress();
+BOOST_TEST_DECL bool                     catch_sys_errors();
+BOOST_TEST_DECL bool                     auto_start_dbg();
+BOOST_TEST_DECL bool                     use_alt_stack();
+BOOST_TEST_DECL bool                     detect_fp_exceptions();
+BOOST_TEST_DECL output_format            report_format();
+BOOST_TEST_DECL output_format            log_format();
+BOOST_TEST_DECL std::ostream*            report_sink();
+BOOST_TEST_DECL std::ostream*            log_sink();
+BOOST_TEST_DECL long                     detect_memory_leaks();
+BOOST_TEST_DECL int                      random_seed();
 
 } // namespace runtime_config
 
Modified: branches/release/boost/test/execution_monitor.hpp
==============================================================================
--- branches/release/boost/test/execution_monitor.hpp	(original)
+++ branches/release/boost/test/execution_monitor.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -113,18 +113,27 @@
         //  is unreasonable to continue execution.
     };
     
+    struct BOOST_TEST_DECL location {
+        explicit    location( char const* file_name = 0, size_t line_num = 0, char const* func = 0 );
+
+        const_string    m_file_name;
+        size_t          m_line_num;
+        const_string    m_function;
+    };
+
     // Constructor
-    execution_exception( error_code ec_, const_string what_msg_ ) // max length 256 inc '\0'
-    : m_error_code( ec_ ), m_what( what_msg_ ) {}
+    execution_exception( error_code ec_, const_string what_msg_, location const& location_ ); // max length 256 inc '\0'
 
-    // access methods
-    error_code      code() const { return m_error_code; }
-    const_string    what() const { return m_what; }
+    // Access methods
+    error_code      code() const    { return m_error_code; }
+    const_string    what() const    { return m_what; }
+    location const& where() const   { return m_location; }
 
 private:
     // Data members
     error_code      m_error_code;
     const_string    m_what;
+    location        m_location;
 }; // execution_exception
 
 // ************************************************************************** //
Modified: branches/release/boost/test/floating_point_comparison.hpp
==============================================================================
--- branches/release/boost/test/floating_point_comparison.hpp	(original)
+++ branches/release/boost/test/floating_point_comparison.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -54,9 +54,9 @@
 // FPT is Floating-Point Type: float, double, long double or User-Defined.
 template<typename FPT>
 inline FPT
-fpt_abs( FPT arg ) 
+fpt_abs( FPT fpv ) 
 {
-    return arg < static_cast<FPT>(0) ? -arg : arg;
+    return fpv < static_cast<FPT>(0) ? -fpv : fpv;
 }
 
 //____________________________________________________________________________//
Modified: branches/release/boost/test/impl/compiler_log_formatter.ipp
==============================================================================
--- branches/release/boost/test/impl/compiler_log_formatter.ipp	(original)
+++ branches/release/boost/test/impl/compiler_log_formatter.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -42,6 +42,20 @@
 // **************            compiler_log_formatter            ************** //
 // ************************************************************************** //
 
+namespace {
+
+const_string
+test_phase_identifier()
+{
+    return framework::is_initialized() 
+            ? const_string( framework::current_test_case().p_name.get() )
+            : BOOST_TEST_L( "Test setup" );
+}
+
+} // local namespace
+
+//____________________________________________________________________________//
+
 void
 compiler_log_formatter::log_start( std::ostream& output, counter_t test_cases_amount )
 {
@@ -108,16 +122,14 @@
 //____________________________________________________________________________//
 
 void
-compiler_log_formatter::log_exception( std::ostream& output, log_checkpoint_data const& checkpoint_data, const_string explanation )
+compiler_log_formatter::log_exception( std::ostream& output, log_checkpoint_data const& checkpoint_data, execution_exception const& ex )
 {
-    print_prefix( output, BOOST_TEST_L( "unknown location" ), 0 );
-    output << "fatal error in \"" << framework::current_test_case().p_name << "\": ";
+    execution_exception::location const& loc = ex.where();
+    print_prefix( output, loc.m_file_name, loc.m_line_num );
 
-    if( !explanation.is_empty() )
-        output << explanation;
-    else
-        output << "uncaught exception, system error or abort requested";
+    output << "fatal error in \"" << (loc.m_function.is_empty() ? test_phase_identifier() : loc.m_function ) << "\": ";
 
+    output << ex.what();
 
     if( !checkpoint_data.m_file_name.is_empty() ) {
         output << '\n';
@@ -144,15 +156,15 @@
             break;
         case BOOST_UTL_ET_WARNING:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
-            output << "warning in \"" << framework::current_test_case().p_name << "\": ";
+            output << "warning in \"" << test_phase_identifier() << "\": ";
             break;
         case BOOST_UTL_ET_ERROR:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
-            output << "error in \"" << framework::current_test_case().p_name << "\": ";
+            output << "error in \"" << test_phase_identifier() << "\": ";
             break;
         case BOOST_UTL_ET_FATAL_ERROR:
             print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
-            output << "fatal error in \"" << framework::current_test_case().p_name << "\": ";
+            output << "fatal error in \"" << test_phase_identifier() << "\": ";
             break;
     }
 }
Modified: branches/release/boost/test/impl/debug.ipp
==============================================================================
--- branches/release/boost/test/impl/debug.ipp	(original)
+++ branches/release/boost/test/impl/debug.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -23,7 +23,7 @@
 #include <boost/test/debug.hpp>
 #include <boost/test/debug_config.hpp>
 
-// Implementation in windows
+// Implementation on Windows
 #if defined(_WIN32) && !defined(UNDER_CE) && !defined(BOOST_DISABLE_WIN32) // ******* WIN32
 
 #  define BOOST_WIN32_BASED_DEBUG
@@ -653,7 +653,7 @@
         if( dbg_list.find( pi.binary_name() ) != const_string::npos )
             return true;
 
-        pid = pi.parent_pid();
+        pid = (pi.parent_pid() == pid ? 0 : pi.parent_pid());
     }
 
     return false;
Modified: branches/release/boost/test/impl/execution_monitor.ipp
==============================================================================
--- branches/release/boost/test/impl/execution_monitor.ipp	(original)
+++ branches/release/boost/test/impl/execution_monitor.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -33,6 +33,8 @@
 // Boost
 #include <boost/cstdlib.hpp>    // for exit codes
 #include <boost/config.hpp>     // for workarounds
+#include <boost/exception/get_error_info.hpp> // for get_error_info
+#include <boost/exception/current_exception_cast.hpp> // for current_exception_cast
 
 // STL
 #include <string>               // for std::string
@@ -218,21 +220,56 @@
 #  define BOOST_TEST_VSNPRINTF( a1, a2, a3, a4 ) vsnprintf( (a1), (a2), (a3), (a4) )
 #endif
 
+template <typename ErrorInfo>
+typename ErrorInfo::value_type
+extract( boost::exception const* ex )
+{
+    if( !ex )
+        return 0;
+
+    typename ErrorInfo::value_type const * val = boost::get_error_info<ErrorInfo>( *ex );
+
+    return val ? *val : 0;
+}
+
+//____________________________________________________________________________//
+
 static void
-report_error( execution_exception::error_code ec, char const* format, ... )
+report_error( execution_exception::error_code ec, boost::exception const* be, char const* format, va_list* args )
 {
     static const int REPORT_ERROR_BUFFER_SIZE = 512;
     static char buf[REPORT_ERROR_BUFFER_SIZE];
 
+    BOOST_TEST_VSNPRINTF( buf, sizeof(buf)-1, format, *args ); 
+    buf[sizeof(buf)-1] = 0;
+
+    va_end( *args );
+
+    throw execution_exception( ec, buf, execution_exception::location( extract<throw_file>( be ), 
+                                                                       extract<throw_line>( be ),
+                                                                       extract<throw_function>( be ) ) );
+}
+
+//____________________________________________________________________________//
+
+static void
+report_error( execution_exception::error_code ec, char const* format, ... )
+{
     va_list args;
     va_start( args, format );
 
-    BOOST_TEST_VSNPRINTF( buf, sizeof(buf)-1, format, args ); 
-    buf[sizeof(buf)-1] = 0;
+    report_error( ec, 0, format, &args );
+}
 
-    va_end( args );
+//____________________________________________________________________________//
 
-    throw execution_exception( ec, buf );
+static void
+report_error( execution_exception::error_code ec, boost::exception const* be, char const* format, ... )
+{
+    va_list args;
+    va_start( args, format );
+
+    report_error( ec, be, format, &args );
 }
 
 //____________________________________________________________________________//
@@ -751,7 +788,14 @@
         ::alarm( 0 );
 
 #ifdef BOOST_TEST_USE_ALT_STACK
-    stack_t sigstk = {};
+#ifdef __GNUC__
+    // We shouldn't need to explicitly initialize all the members here,
+    // but gcc warns if we don't, so add initializers for each of the
+    // members specified in the POSIX std:
+    stack_t sigstk = { 0, 0, 0 };
+#else
+    stack_t sigstk = { };
+#endif
 
     sigstk.ss_size  = MINSIGSTKSZ;
     sigstk.ss_flags = SS_DISABLE;
@@ -1090,7 +1134,7 @@
 execution_monitor::catch_signals( unit_test::callback0<int> const& F )
 {
     _invalid_parameter_handler old_iph = _invalid_parameter_handler();
-    BOOST_TEST_CRT_HOOK_TYPE old_crt_hook;
+    BOOST_TEST_CRT_HOOK_TYPE old_crt_hook = 0;
 
     if( !p_catch_system_errors )
         _set_se_translator( &detail::seh_catch_preventer );
@@ -1173,60 +1217,105 @@
     //  easier than answering questions about non-const usage.
 
     catch( char const* ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "C string: %s", ex ); }
+      { detail::report_error( execution_exception::cpp_exception_error,
+                              "C string: %s", ex ); }
     catch( std::string const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::string: %s", ex.c_str() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              "std::string: %s", ex.c_str() ); }
 
     //  std:: exceptions
 
     catch( std::bad_alloc const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::bad_alloc: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::bad_alloc: %s", ex.what() ); }
 
 #if BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
     catch( std::bad_cast const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::bad_cast" ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::bad_cast" ); }
     catch( std::bad_typeid const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::bad_typeid" ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::bad_typeid" ); }
 #else
     catch( std::bad_cast const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::bad_cast: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::bad_cast: %s", ex.what() ); }
     catch( std::bad_typeid const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::bad_typeid: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::bad_typeid: %s", ex.what() ); }
 #endif
 
     catch( std::bad_exception const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::bad_exception: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::bad_exception: %s", ex.what() ); }
     catch( std::domain_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::domain_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::domain_error: %s", ex.what() ); }
     catch( std::invalid_argument const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::invalid_argument: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::invalid_argument: %s", ex.what() ); }
     catch( std::length_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::length_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::length_error: %s", ex.what() ); }
     catch( std::out_of_range const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::out_of_range: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::out_of_range: %s", ex.what() ); }
     catch( std::range_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::range_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::range_error: %s", ex.what() ); }
     catch( std::overflow_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::overflow_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::overflow_error: %s", ex.what() ); }
     catch( std::underflow_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::underflow_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::underflow_error: %s", ex.what() ); }
     catch( std::logic_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::logic_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::logic_error: %s", ex.what() ); }
     catch( std::runtime_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::runtime_error: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::runtime_error: %s", ex.what() ); }
     catch( std::exception const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "std::exception: %s", ex.what() ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              current_exception_cast<boost::exception const>(),
+                              "std::exception: %s", ex.what() ); }
+
+    catch( boost::exception const& ex )
+    { detail::report_error( execution_exception::cpp_exception_error, 
+                            &ex,
+                            "unknown boost::exception" ); }
+
+    // system errors
     catch( system_error const& ex )
-      { detail::report_error( execution_exception::cpp_exception_error, "system_error produced by: %s: %s", 
-                              ex.p_failed_exp.get(), 
-                              std::strerror( ex.p_errno ) ); }
+      { detail::report_error( execution_exception::cpp_exception_error, 
+                              "system_error produced by: %s: %s", ex.p_failed_exp.get(), std::strerror( ex.p_errno ) ); }
     catch( detail::system_signal_exception const& ex )
       { ex.report(); }
+
+    // not an error
     catch( execution_aborted const& )
       { return 0; }
+
+    // just forward
     catch( execution_exception const& )
       { throw; }
 
+    // unknown error
     catch( ... )
       { detail::report_error( execution_exception::cpp_exception_error, "unknown type" ); }
 
@@ -1248,13 +1337,30 @@
 , p_failed_exp( exp )
 {}
 
+//____________________________________________________________________________//
+
+// ************************************************************************** //
+// **************              execution_exception             ************** //
+// ************************************************************************** //
+
+execution_exception::execution_exception( error_code ec_, const_string what_msg_, location const& location_ )
+: m_error_code( ec_ )
+, m_what( what_msg_.empty() ? BOOST_TEST_L( "uncaught exception, system error or abort requested" ) : what_msg_ )
+, m_location( location_ )
+{}
 
 //____________________________________________________________________________//
 
-} // namespace boost
+execution_exception::location::location( char const* file_name, size_t line_num, char const* func )
+: m_file_name( file_name ? file_name : "unknown location" )
+, m_line_num( line_num )
+, m_function( func )
+{}
 
 //____________________________________________________________________________//
 
+} // namespace boost
+
 #include <boost/test/detail/enable_warnings.hpp>
 
 #endif // BOOST_TEST_EXECUTION_MONITOR_IPP_012205GER
Modified: branches/release/boost/test/impl/progress_monitor.ipp
==============================================================================
--- branches/release/boost/test/impl/progress_monitor.ipp	(original)
+++ branches/release/boost/test/impl/progress_monitor.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -19,6 +19,8 @@
 #include <boost/test/progress_monitor.hpp>
 #include <boost/test/unit_test_suite_impl.hpp>
 
+#include <boost/test/detail/unit_test_parameters.hpp>
+
 // Boost
 #include <boost/progress.hpp>
 #include <boost/scoped_ptr.hpp>
@@ -40,7 +42,7 @@
 struct progress_monitor_impl {
     // Constructor
     progress_monitor_impl()
-    : m_stream( &std::cout )
+        : m_stream( runtime_config::log_sink() )
     {}
 
     std::ostream*                m_stream;
Modified: branches/release/boost/test/impl/results_collector.ipp
==============================================================================
--- branches/release/boost/test/impl/results_collector.ipp	(original)
+++ branches/release/boost/test/impl/results_collector.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -215,9 +215,9 @@
         if( !num_failures_match )
             BOOST_TEST_MESSAGE( "Test case " << tu.p_name << " has fewer failures than expected" );
 
-        bool run_any_assertions = tr.p_aborted || (tr.p_assertions_failed != 0) || (tr.p_assertions_passed != 0);
-        if( !run_any_assertions )
-            BOOST_TEST_MESSAGE( "Test case " << tu.p_name << " did not run any assertions" );
+        bool check_any_assertions = tr.p_aborted || (tr.p_assertions_failed != 0) || (tr.p_assertions_passed != 0);
+        if( !check_any_assertions )
+            BOOST_TEST_MESSAGE( "Test case " << tu.p_name << " did not check any assertions" );
     }
 }
 
Modified: branches/release/boost/test/impl/results_reporter.ipp
==============================================================================
--- branches/release/boost/test/impl/results_reporter.ipp	(original)
+++ branches/release/boost/test/impl/results_reporter.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -23,6 +23,8 @@
 #include <boost/test/output/plain_report_formatter.hpp>
 #include <boost/test/output/xml_report_formatter.hpp>
 
+#include <boost/test/detail/unit_test_parameters.hpp>
+
 // Boost
 #include <boost/scoped_ptr.hpp>
 #include <boost/io/ios_state.hpp>
@@ -50,8 +52,8 @@
 struct results_reporter_impl : test_tree_visitor {
     // Constructor
     results_reporter_impl()
-    : m_output( &std::cerr )
-    , m_stream_state_saver( new io_saver_type( std::cerr ) )
+    : m_output( runtime_config::report_sink() )
+    , m_stream_state_saver( new io_saver_type( *m_output ) )
     , m_report_level( CONFIRMATION_REPORT )
     , m_formatter( new output::plain_report_formatter )
     {}
Modified: branches/release/boost/test/impl/unit_test_log.ipp
==============================================================================
--- branches/release/boost/test/impl/unit_test_log.ipp	(original)
+++ branches/release/boost/test/impl/unit_test_log.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -33,9 +33,6 @@
 #include <boost/io/ios_state.hpp>
 typedef ::boost::io::ios_base_all_saver io_saver_type;
 
-// STL
-#include <iostream>
-
 #include <boost/test/detail/suppress_warnings.hpp>
 
 //____________________________________________________________________________//
@@ -89,8 +86,8 @@
 struct unit_test_log_impl {
     // Constructor
     unit_test_log_impl()
-    : m_stream( &std::cout )
-    , m_stream_state_saver( new io_saver_type( std::cout ) )
+    : m_stream( runtime_config::log_sink() )
+    , m_stream_state_saver( new io_saver_type( *m_stream ) )
     , m_threshold_level( log_all_errors )
     , m_log_formatter( new output::compiler_log_formatter )
     {
@@ -238,7 +235,7 @@
         if( s_log_impl().m_entry_in_progress )
             *this << log::end();
 
-        s_log_impl().m_log_formatter->log_exception( s_log_impl().stream(), s_log_impl().m_checkpoint_data, ex.what() );
+        s_log_impl().m_log_formatter->log_exception( s_log_impl().stream(), s_log_impl().m_checkpoint_data, ex );
     }
 }
 
Modified: branches/release/boost/test/impl/unit_test_parameters.ipp
==============================================================================
--- branches/release/boost/test/impl/unit_test_parameters.ipp	(original)
+++ branches/release/boost/test/impl/unit_test_parameters.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -52,6 +52,7 @@
 #include <map>
 #include <cstdlib>
 #include <iostream>
+#include <fstream>
 
 #include <boost/test/detail/suppress_warnings.hpp>
 
@@ -161,10 +162,12 @@
 std::string DETECT_MEM_LEAKS  = "detect_memory_leaks";
 std::string LOG_FORMAT        = "log_format";
 std::string LOG_LEVEL         = "log_level";
+std::string LOG_SINK          = "log_sink";
 std::string OUTPUT_FORMAT     = "output_format";
 std::string RANDOM_SEED       = "random";
 std::string REPORT_FORMAT     = "report_format";
 std::string REPORT_LEVEL      = "report_level";
+std::string REPORT_SINK       = "report_sink";
 std::string RESULT_CODE       = "result_code";
 std::string TESTS_TO_RUN      = "run_test";
 std::string SAVE_TEST_PATTERN = "save_pattern";
@@ -180,10 +183,12 @@
     DETECT_MEM_LEAKS  , "BOOST_TEST_DETECT_MEMORY_LEAK",
     LOG_FORMAT        , "BOOST_TEST_LOG_FORMAT",
     LOG_LEVEL         , "BOOST_TEST_LOG_LEVEL",
+    LOG_SINK          , "BOOST_TEST_LOG_SINK",
     OUTPUT_FORMAT     , "BOOST_TEST_OUTPUT_FORMAT",
     RANDOM_SEED       , "BOOST_TEST_RANDOM",
     REPORT_FORMAT     , "BOOST_TEST_REPORT_FORMAT",
     REPORT_LEVEL      , "BOOST_TEST_REPORT_LEVEL",
+    REPORT_SINK       , "BOOST_TEST_REPORT_SINK",
     RESULT_CODE       , "BOOST_TEST_RESULT_CODE",
     TESTS_TO_RUN      , "BOOST_TESTS_TO_RUN",
     SAVE_TEST_PATTERN , "BOOST_TEST_SAVE_PATTERN",
@@ -216,9 +221,9 @@
 
         optional<T> val = s_cla_parser.get<optional<T> >( parameter_name );
         if( val )
-	    return *val;
+	        return *val;
         else
-	    return optional_value;
+	        return optional_value;
     }
 
     boost::optional<T> v;
@@ -268,6 +273,9 @@
           << cla::dual_name_parameter<unit_test::log_level>( LOG_LEVEL + "|l" )
             - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
                cla::description = "Specifies log level")
+          << cla::dual_name_parameter<std::string>( LOG_SINK + "|k" )
+            - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
+               cla::description = "Specifies log sink:stdout(default),stderr or file name")
           << cla::dual_name_parameter<unit_test::output_format>( OUTPUT_FORMAT + "|o" )
             - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
                cla::description = "Specifies output format (both log and report)")
@@ -281,6 +289,9 @@
           << cla::dual_name_parameter<unit_test::report_level>(REPORT_LEVEL + "|r")
             - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
                cla::description = "Specifies report level")
+          << cla::dual_name_parameter<std::string>( REPORT_SINK + "|e" )
+            - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
+               cla::description = "Specifies report sink:stderr(default),stdout or file name")
           << cla::dual_name_parameter<bool>( RESULT_CODE + "|c" )
             - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
                cla::description = "Allows to disable test modules's result code generation")
@@ -453,6 +464,40 @@
 
 //____________________________________________________________________________//
 
+std::ostream*
+report_sink()
+{
+    std::string sink_name = retrieve_parameter( REPORT_SINK, s_cla_parser, s_empty );
+
+    if( sink_name.empty() || sink_name == "stderr" )
+        return &std::cerr;    
+    
+    if( sink_name == "stdout" )
+        return &std::cout;
+
+    static std::ofstream log_file( sink_name.c_str() );
+    return &log_file;
+}
+
+//____________________________________________________________________________//
+
+std::ostream*
+log_sink()
+{
+    std::string sink_name = retrieve_parameter( LOG_SINK, s_cla_parser, s_empty );
+
+    if( sink_name.empty() || sink_name == "stdout" )
+        return &std::cout;    
+
+    if( sink_name == "stderr" )
+        return &std::cerr;    
+
+    static std::ofstream report_file( sink_name.c_str() );
+    return &report_file;
+}
+
+//____________________________________________________________________________//
+
 long
 detect_memory_leaks()
 {
Modified: branches/release/boost/test/impl/xml_log_formatter.ipp
==============================================================================
--- branches/release/boost/test/impl/xml_log_formatter.ipp	(original)
+++ branches/release/boost/test/impl/xml_log_formatter.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -110,15 +110,23 @@
 //____________________________________________________________________________//
 
 void
-xml_log_formatter::log_exception( std::ostream& ostr, log_checkpoint_data const& checkpoint_data, const_string explanation )
+xml_log_formatter::log_exception( std::ostream& ostr, log_checkpoint_data const& checkpoint_data, execution_exception const& ex )
 {
-    ostr << "<Exception>" << pcdata() << explanation;
+    execution_exception::location const& loc = ex.where();
+
+    ostr << "<Exception file" << attr_value() << loc.m_file_name
+         << " line"           << attr_value() << loc.m_line_num;
+
+    if( !loc.m_function.is_empty() )
+        ostr << " function"   << attr_value() << loc.m_function;
+
+    ostr << ">" << cdata() << ex.what();
 
     if( !checkpoint_data.m_file_name.is_empty() ) {
         ostr << "<LastCheckpoint file" << attr_value() << checkpoint_data.m_file_name
              << " line"                << attr_value() << checkpoint_data.m_line_num
              << ">"
-             << pcdata() << checkpoint_data.m_message
+             << cdata() << checkpoint_data.m_message
              << "</LastCheckpoint>";
     }
 
@@ -134,9 +142,9 @@
 
     m_curr_tag = xml_tags[let];
     ostr << '<' << m_curr_tag
-         << " file" << attr_value() << entry_data.m_file_name
-         << " line" << attr_value() << entry_data.m_line_num
-         << ">";
+         << BOOST_TEST_L( " file" ) << attr_value() << entry_data.m_file_name
+         << BOOST_TEST_L( " line" ) << attr_value() << entry_data.m_line_num
+         << BOOST_TEST_L( "><![CDATA[" );
 }
 
 //____________________________________________________________________________//
@@ -144,7 +152,7 @@
 void
 xml_log_formatter::log_entry_value( std::ostream& ostr, const_string value )
 {
-    ostr << pcdata() << value;
+    ostr << value;
 }
 
 //____________________________________________________________________________//
@@ -152,7 +160,7 @@
 void
 xml_log_formatter::log_entry_finish( std::ostream& ostr )
 {
-    ostr << "</" << m_curr_tag << ">";
+    ostr << BOOST_TEST_L( "]]></" ) << m_curr_tag << BOOST_TEST_L( ">" );
 
     m_curr_tag.clear();
 }
Modified: branches/release/boost/test/output/compiler_log_formatter.hpp
==============================================================================
--- branches/release/boost/test/output/compiler_log_formatter.hpp	(original)
+++ branches/release/boost/test/output/compiler_log_formatter.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -44,7 +44,7 @@
     void    test_unit_finish( std::ostream&, test_unit const& tu, unsigned long elapsed );
     void    test_unit_skipped( std::ostream&, test_unit const& tu );
 
-    void    log_exception( std::ostream&, log_checkpoint_data const&, const_string explanation );
+    void    log_exception( std::ostream&, log_checkpoint_data const&, execution_exception const& ex );
 
     void    log_entry_start( std::ostream&, log_entry_data const&, log_entry_types let );
     void    log_entry_value( std::ostream&, const_string value );
Modified: branches/release/boost/test/output/xml_log_formatter.hpp
==============================================================================
--- branches/release/boost/test/output/xml_log_formatter.hpp	(original)
+++ branches/release/boost/test/output/xml_log_formatter.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -47,7 +47,7 @@
     void    test_unit_finish( std::ostream&, test_unit const& tu, unsigned long elapsed );
     void    test_unit_skipped( std::ostream&, test_unit const& tu );
 
-    void    log_exception( std::ostream&, log_checkpoint_data const&, const_string explanation );
+    void    log_exception( std::ostream&, log_checkpoint_data const&, execution_exception const& ex );
 
     void    log_entry_start( std::ostream&, log_entry_data const&, log_entry_types let );
     using   unit_test_log_formatter::log_entry_value; // bring base class functions into overload set
Modified: branches/release/boost/test/unit_test_log_formatter.hpp
==============================================================================
--- branches/release/boost/test/unit_test_log_formatter.hpp	(original)
+++ branches/release/boost/test/unit_test_log_formatter.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -20,6 +20,8 @@
 #include <boost/test/detail/log_level.hpp>
 #include <boost/test/detail/fwd_decl.hpp>
 
+#include <boost/test/execution_monitor.hpp>
+
 // STL
 #include <iosfwd>
 #include <string> // for std::string
@@ -96,7 +98,12 @@
     virtual void        test_unit_finish( std::ostream&, test_unit const& tu, unsigned long elapsed ) = 0;
     virtual void        test_unit_skipped( std::ostream&, test_unit const& ) = 0;
 
-    virtual void        log_exception( std::ostream&, log_checkpoint_data const&, const_string explanation ) = 0;
+    virtual void        log_exception( std::ostream& os, log_checkpoint_data const& cd, execution_exception const& ex )
+    {
+        // for backward compatibility
+        log_exception( os, cd, ex.what() );
+    }
+    virtual void        log_exception( std::ostream&, log_checkpoint_data const&, const_string /* explanation */ ) {}
 
     virtual void        log_entry_start( std::ostream&, log_entry_data const&, log_entry_types let ) = 0;
     virtual void        log_entry_value( std::ostream&, const_string value ) = 0;
Modified: branches/release/boost/test/unit_test_suite.hpp
==============================================================================
--- branches/release/boost/test/unit_test_suite.hpp	(original)
+++ branches/release/boost/test/unit_test_suite.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -116,12 +116,12 @@
 /**/
 
 // ************************************************************************** //
-// **************        BOOST_AUTO_TEST_CASE_TEMPLATE         ************** //
+// **************       BOOST_FIXTURE_TEST_CASE_TEMPLATE       ************** //
 // ************************************************************************** //
 
-#define BOOST_AUTO_TEST_CASE_TEMPLATE( test_name, type_name, TL )       \
+#define BOOST_FIXTURE_TEST_CASE_TEMPLATE( test_name, type_name, TL, F ) \
 template<typename type_name>                                            \
-struct test_name : public BOOST_AUTO_TEST_CASE_FIXTURE                  \
+struct test_name : public F                                             \
 { void test_method(); };                                                \
                                                                         \
 struct BOOST_AUTO_TC_INVOKER( test_name ) {                             \
@@ -143,6 +143,13 @@
 /**/
 
 // ************************************************************************** //
+// **************        BOOST_AUTO_TEST_CASE_TEMPLATE         ************** //
+// ************************************************************************** //
+
+#define BOOST_AUTO_TEST_CASE_TEMPLATE( test_name, type_name, TL )       \
+BOOST_FIXTURE_TEST_CASE_TEMPLATE( test_name, type_name, TL, BOOST_AUTO_TEST_CASE_FIXTURE )
+
+// ************************************************************************** //
 // **************           BOOST_TEST_CASE_TEMPLATE           ************** //
 // ************************************************************************** //
 
Modified: branches/release/boost/test/utils/basic_cstring/basic_cstring.hpp
==============================================================================
--- branches/release/boost/test/utils/basic_cstring/basic_cstring.hpp	(original)
+++ branches/release/boost/test/utils/basic_cstring/basic_cstring.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -548,7 +548,7 @@
         --it;
     }
 
-    return it == last ? npos : it - begin();
+    return it == last ? static_cast<size_type>(npos) : static_cast<size_type>(it - begin());
 }
 
 //____________________________________________________________________________//
Modified: branches/release/boost/test/utils/runtime/argument.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/argument.hpp	(original)
+++ branches/release/boost/test/utils/runtime/argument.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -43,7 +43,7 @@
 class argument {
 public:
     // Constructor
-    argument( parameter const& p, call_traits<rtti::id_t>::param_type value_type )
+    argument( parameter const& p, rtti::id_t value_type )
     : p_formal_parameter( p )
     , p_value_type( value_type )
     {}
@@ -81,22 +81,22 @@
 
 template<typename T>
 inline T const&
-arg_value( argument const& arg )
+arg_value( argument const& arg_ )
 {
-    assert( arg.p_value_type == rtti::type_id<T>() ); // detect logic error
+    assert( arg_.p_value_type == rtti::type_id<T>() ); // detect logic error
 
-    return static_cast<typed_argument<T> const&>( arg ).p_value.value;
+    return static_cast<typed_argument<T> const&>( arg_ ).p_value.value;
 }
 
 //____________________________________________________________________________//
 
 template<typename T>
 inline T&
-arg_value( argument& arg )
+arg_value( argument& arg_ )
 {
-    assert( arg.p_value_type == rtti::type_id<T>() ); // detect logic error
+    assert( arg_.p_value_type == rtti::type_id<T>() ); // detect logic error
 
-    return static_cast<typed_argument<T>&>( arg ).p_value.value;
+    return static_cast<typed_argument<T>&>( arg_ ).p_value.value;
 }
 
 #ifdef BOOST_MSVC
Modified: branches/release/boost/test/utils/runtime/cla/argument_factory.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/cla/argument_factory.hpp	(original)
+++ branches/release/boost/test/utils/runtime/cla/argument_factory.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -135,42 +135,42 @@
             throw;
     }
 
-    argument_ptr arg = p.actual_argument();
+    argument_ptr actual_arg = p.actual_argument();
 
     BOOST_RT_CLA_VALIDATE_INPUT( !!value || p.p_optional_value, tr, 
         BOOST_RT_PARAM_LITERAL( "Argument value missing for parameter " ) << p.id_2_report() );
 
-    BOOST_RT_CLA_VALIDATE_INPUT( !arg || p.p_multiplicable, tr, 
+    BOOST_RT_CLA_VALIDATE_INPUT( !actual_arg || p.p_multiplicable, tr, 
         BOOST_RT_PARAM_LITERAL( "Unexpected repetition of the parameter " ) << p.id_2_report() );
 
     if( !!value && !!m_value_handler )
         m_value_handler( p, *value );
 
     if( !p.p_multiplicable )
-        arg.reset( p.p_optional_value && (rtti::type_id<T>() != rtti::type_id<bool>())
+        actual_arg.reset( p.p_optional_value && (rtti::type_id<T>() != rtti::type_id<bool>())
             ? static_cast<argument*>(new typed_argument<boost::optional<T> >( p, value ))
             : static_cast<argument*>(new typed_argument<T>( p, *value )) );
     else {
         typedef std::list<boost::optional<T> > optional_list;
 
-        if( !arg )
-            arg.reset( p.p_optional_value 
+        if( !actual_arg )
+            actual_arg.reset( p.p_optional_value 
                 ? static_cast<argument*>(new typed_argument<optional_list>( p ))
                 : static_cast<argument*>(new typed_argument<std::list<T> >( p )) );
 
         if( p.p_optional_value ) {
-            optional_list& values = arg_value<optional_list>( *arg );
+            optional_list& values = arg_value<optional_list>( *actual_arg );
 
             values.push_back( value );
         }
         else {
-            std::list<T>& values = arg_value<std::list<T> >( *arg );
+            std::list<T>& values = arg_value<std::list<T> >( *actual_arg );
             
             values.push_back( *value );
         }
     }
 
-    return arg;
+    return actual_arg;
 }
 
 //____________________________________________________________________________//
@@ -179,23 +179,23 @@
 inline argument_ptr 
 typed_argument_factory<T>::produce_using( parameter& p, parser const& pa )
 {
-    argument_ptr arg;
+    argument_ptr actual_arg;
 
     if( !m_value_generator )
-        return arg;
+        return actual_arg;
 
     boost::optional<T> value;
     m_value_generator( pa, value );
 
     if( !value )
-        return arg;
+        return actual_arg;
 
     if( !!m_value_handler )
         m_value_handler( p, *value );
 
-    arg.reset( new typed_argument<T>( p, *value ) );
+    actual_arg.reset( new typed_argument<T>( p, *value ) );
 
-    return arg;
+    return actual_arg;
 }
 
 //____________________________________________________________________________//
Modified: branches/release/boost/test/utils/runtime/cla/argv_traverser.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/cla/argv_traverser.hpp	(original)
+++ branches/release/boost/test/utils/runtime/cla/argv_traverser.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -72,7 +72,7 @@
 
 private:
     // Data members
-    dstring              m_buffer;
+    dstring                 m_buffer;
     cstring                 m_work_buffer;
 
     cstring                 m_token;
Modified: branches/release/boost/test/utils/runtime/cla/id_policy.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/cla/id_policy.hpp	(original)
+++ branches/release/boost/test/utils/runtime/cla/id_policy.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -62,7 +62,7 @@
     }
 
 protected:
-    explicit basic_naming_policy( call_traits<rtti::id_t>::param_type dyn_type )
+    explicit basic_naming_policy( rtti::id_t dyn_type )
     : identification_policy( dyn_type )
     {}
     BOOST_RT_PARAM_UNNEEDED_VIRTUAL ~basic_naming_policy() {}
Modified: branches/release/boost/test/utils/runtime/cla/iface/id_policy.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/cla/iface/id_policy.hpp	(original)
+++ branches/release/boost/test/utils/runtime/cla/iface/id_policy.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -54,7 +54,7 @@
 
 protected:
     // Constructor
-    explicit        identification_policy( call_traits<rtti::id_t>::param_type dyn_type )
+    explicit        identification_policy( rtti::id_t dyn_type )
     : p_type_id( dyn_type )
     {}
     BOOST_TEST_PROTECTED_VIRTUAL ~identification_policy() {}
Modified: branches/release/boost/test/utils/runtime/cla/parser.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/cla/parser.hpp	(original)
+++ branches/release/boost/test/utils/runtime/cla/parser.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -114,10 +114,10 @@
     template<typename T>
     void                get( cstring string_id, boost::optional<T>& res ) const
     {
-        const_argument_ptr arg = (*this)[string_id];
+        const_argument_ptr actual_arg = (*this)[string_id];
 
-        if( arg )
-            res = arg_value<T>( *arg );
+        if( actual_arg )
+            res = arg_value<T>( *actual_arg );
         else
             res.reset();
     }
Modified: branches/release/boost/test/utils/runtime/config.hpp
==============================================================================
--- branches/release/boost/test/utils/runtime/config.hpp	(original)
+++ branches/release/boost/test/utils/runtime/config.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -67,6 +67,11 @@
 typedef std::basic_ostream<char_type>                           out_stream;
 #endif
 
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4996) // putenv
+#endif
+
 #ifndef UNDER_CE
 #if defined(__COMO__) && 0
 inline void
@@ -92,6 +97,10 @@
 #endif
 #endif
 
+#ifdef BOOST_MSVC 
+#pragma warning(pop) 
+#endif 
+
 #define BOOST_RT_PARAM_LITERAL( l ) l
 #define BOOST_RT_PARAM_CSTRING_LITERAL( l ) cstring( l, sizeof( l ) - 1 )
 #define BOOST_RT_PARAM_GETENV getenv
Modified: branches/release/boost/test/utils/runtime/env/environment.ipp
==============================================================================
--- branches/release/boost/test/utils/runtime/env/environment.ipp	(original)
+++ branches/release/boost/test/utils/runtime/env/environment.ipp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -75,6 +75,11 @@
 
 //____________________________________________________________________________//
 
+#ifdef BOOST_MSVC 
+#pragma warning(push) 
+#pragma warning(disable:4996) // getenv
+#endif
+
 BOOST_RT_PARAM_INLINE cstring
 sys_read_var( cstring var_name )
 {
@@ -82,6 +87,9 @@
     return BOOST_RT_PARAM_GETENV( var_name.begin() );
 }
 
+#ifdef BOOST_MSVC 
+#pragma warning(pop) 
+#endif
 //____________________________________________________________________________//
 
 BOOST_RT_PARAM_INLINE void
Modified: branches/release/boost/test/utils/xml_printer.hpp
==============================================================================
--- branches/release/boost/test/utils/xml_printer.hpp	(original)
+++ branches/release/boost/test/utils/xml_printer.hpp	2009-11-28 04:19:18 EST (Sat, 28 Nov 2009)
@@ -20,6 +20,7 @@
 #include <boost/test/utils/fixed_mapping.hpp>
 #include <boost/test/utils/custom_manip.hpp>
 #include <boost/test/utils/foreach.hpp>
+#include <boost/test/utils/basic_cstring/io.hpp>
 
 // Boost
 #include <boost/config.hpp>
@@ -96,14 +97,12 @@
 
 //____________________________________________________________________________//
 
-typedef custom_manip<struct pcdata_t> pcdata;
+typedef custom_manip<struct cdata_t> cdata;
 
 inline std::ostream&
-operator<<( custom_printer<pcdata> const& p, const_string value )
+operator<<( custom_printer<cdata> const& p, const_string value )
 {
-    print_escaped( *p, value );
-
-    return *p;
+    return *p << BOOST_TEST_L( "<![CDATA[" ) << value << BOOST_TEST_L( "]]>" );
 }
 
 //____________________________________________________________________________//