$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r62140 - in trunk: boost/config boost/config/compiler boost/config/platform boost/system libs/config/doc libs/system/test libs/system/test/system_msvc libs/system/test/system_msvc/error_code_test
From: bdawes_at_[hidden]
Date: 2010-05-22 08:12:03
Author: bemandawes
Date: 2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
New Revision: 62140
URL: http://svn.boost.org/trac/boost/changeset/62140
Log:
Major upgrade to Boost.Config symbol visibility macros for shared libraries, based on patches from Jürgen Hunold with mods by Beman Dawes.  Upgrade Boost.System to use the new visibility macros. Fixes #3697 and provides foundation for fixing 2114, 2309, etc.
Added:
   trunk/libs/system/test/dynamic_link_test.cpp   (contents, props changed)
   trunk/libs/system/test/throw_test.cpp   (contents, props changed)
Text files modified: 
   trunk/boost/config/compiler/borland.hpp                                   |     5 +                                       
   trunk/boost/config/compiler/clang.hpp                                     |     6 --                                      
   trunk/boost/config/compiler/codegear.hpp                                  |     5 +                                       
   trunk/boost/config/compiler/gcc.hpp                                       |    22 ++++++++                                
   trunk/boost/config/compiler/visualc.hpp                                   |     5 --                                      
   trunk/boost/config/platform/win32.hpp                                     |     9 +++                                     
   trunk/boost/config/suffix.hpp                                             |    13 +++++                                   
   trunk/boost/system/config.hpp                                             |    37 +++++---------                          
   trunk/boost/system/system_error.hpp                                       |     6 +                                       
   trunk/libs/config/doc/macro_reference.qbk                                 |   100 +++++++++++++++++++++++++++++++++++++-- 
   trunk/libs/system/test/Jamfile.v2                                         |    16 +++++-                                  
   trunk/libs/system/test/error_code_test.cpp                                |     6 ++                                      
   trunk/libs/system/test/error_code_user_test.cpp                           |    48 +++++++++---------                      
   trunk/libs/system/test/header_only_test.cpp                               |     5 -                                       
   trunk/libs/system/test/initialization_test.cpp                            |     4                                         
   trunk/libs/system/test/system_error_test.cpp                              |    10 ++--                                    
   trunk/libs/system/test/system_msvc/common.vsprops                         |     6 +-                                      
   trunk/libs/system/test/system_msvc/error_code_test/error_code_test.vcproj |     8 +-                                      
   trunk/libs/system/test/system_msvc/system_msvc.sln                        |    31 ++++++++++++                            
   19 files changed, 249 insertions(+), 93 deletions(-)
Modified: trunk/boost/config/compiler/borland.hpp
==============================================================================
--- trunk/boost/config/compiler/borland.hpp	(original)
+++ trunk/boost/config/compiler/borland.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -230,8 +230,9 @@
 //
 // all versions support __declspec:
 //
-#ifndef __STRICT_ANSI__
-#  define BOOST_HAS_DECLSPEC
+#if defined(__STRICT_ANSI__)
+// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined  
+#  define BOOST_SYMBOL_EXPORT
 #endif
 //
 // ABI fixing headers:
Modified: trunk/boost/config/compiler/clang.hpp
==============================================================================
--- trunk/boost/config/compiler/clang.hpp	(original)
+++ trunk/boost/config/compiler/clang.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -18,12 +18,6 @@
 #  define BOOST_NO_RTTI
 #endif
 
-#if defined(__int32)
-// HACK: Clang only defines the type __int32 in Microsoft-compatibility mode,
-// which means that declspecs are also available
-#  define BOOST_HAS_DECLSPEC
-#endif
-
 #if defined(__int64)
 #  define BOOST_HAS_MS_INT64
 #endif
Modified: trunk/boost/config/compiler/codegear.hpp
==============================================================================
--- trunk/boost/config/compiler/codegear.hpp	(original)
+++ trunk/boost/config/compiler/codegear.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -147,8 +147,9 @@
 //
 // all versions support __declspec:
 //
-#if !defined(__STRICT_ANSI__)
-#  define BOOST_HAS_DECLSPEC
+#if defined(__STRICT_ANSI__)
+// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined  
+#  define BOOST_SYMBOL_EXPORT
 #endif
 //
 // ABI fixing headers:
Modified: trunk/boost/config/compiler/gcc.hpp
==============================================================================
--- trunk/boost/config/compiler/gcc.hpp	(original)
+++ trunk/boost/config/compiler/gcc.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -108,6 +108,28 @@
 #if __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 )
 #define BOOST_HAS_NRVO
 #endif
+
+//
+// Dynamic shared object (DSO) and dynamic-link library (DLL) support
+//
+#if __GNUC__ >= 4
+#  if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+     // All Win32 development environments, including 64-bit Windows and MinGW, define 
+     // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment,
+     // so does not define _WIN32 or its variants.
+#    define BOOST_HAS_DECLSPEC
+#    define BOOST_SYMBOL_EXPORT __attribute__((dllexport))
+#    define BOOST_SYMBOL_IMPORT __attribute__((dllimport))
+#  else
+#    define BOOST_SYMBOL_EXPORT __attribute__((visibility("default")))
+#    define BOOST_SYMBOL_IMPORT
+#  endif
+#  define BOOST_SYMBOL_VISIBLE __attribute__((visibility("default")))
+#else
+// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined  
+#  define BOOST_SYMBOL_EXPORT
+#endif
+
 //
 // RTTI and typeinfo detection is possible post gcc-4.3:
 //
Modified: trunk/boost/config/compiler/visualc.hpp
==============================================================================
--- trunk/boost/config/compiler/visualc.hpp	(original)
+++ trunk/boost/config/compiler/visualc.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -164,11 +164,6 @@
 #endif
 
 //
-// all versions support __declspec:
-//
-#define BOOST_HAS_DECLSPEC
-
-//
 // C++0x features
 //
 //   See above for BOOST_NO_LONG_LONG
Modified: trunk/boost/config/platform/win32.hpp
==============================================================================
--- trunk/boost/config/platform/win32.hpp	(original)
+++ trunk/boost/config/platform/win32.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -21,10 +21,17 @@
 #  define BOOST_NO_SWPRINTF
 #endif
 
-#if !defined(__GNUC__) && !defined(BOOST_HAS_DECLSPEC)
+//  Default defines for BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT
+//  If a compiler doesn't support __declspec(dllexport)/__declspec(dllimport),
+//  its boost/config/compiler/ file must define BOOST_SYMBOL_EXPORT and
+//  BOOST_SYMBOL_IMPORT
+#ifndef BOOST_SYMBOL_EXPORT
 #  define BOOST_HAS_DECLSPEC
+#  define BOOST_SYMBOL_EXPORT __declspec(dllexport)
+#  define BOOST_SYMBOL_IMPORT __declspec(dllimport)
 #endif
 
+
 #if defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 2) || ((__MINGW32_MAJOR_VERSION == 2) && (__MINGW32_MINOR_VERSION >= 0)))
 #  define BOOST_HAS_STDINT_H
 #  define __STDC_LIMIT_MACROS
Modified: trunk/boost/config/suffix.hpp
==============================================================================
--- trunk/boost/config/suffix.hpp	(original)
+++ trunk/boost/config/suffix.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -26,6 +26,19 @@
 #define BOOST_CONFIG_SUFFIX_HPP
 
 //
+// ensure that visibility macros are always defined, thus symplifying use
+//
+#ifndef BOOST_SYMBOL_EXPORT
+# define BOOST_SYMBOL_EXPORT
+#endif
+#ifndef BOOST_SYMBOL_IMPORT
+# define BOOST_SYMBOL_IMPORT
+#endif
+#ifndef BOOST_SYMBOL_VISIBLE
+# define BOOST_SYMBOL_VISIBLE
+#endif
+
+//
 // look for long long by looking for the appropriate macros in <limits.h>.
 // Note that we use limits.h rather than climits for maximal portability,
 // remember that since these just declare a bunch of macros, there should be
Modified: trunk/boost/system/config.hpp
==============================================================================
--- trunk/boost/system/config.hpp	(original)
+++ trunk/boost/system/config.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -1,4 +1,4 @@
-//  boost/system/config.hpp  -------------------------------------------------//
+//  boost/system/config.hpp  -----------------------------------------------------------//
 
 //  Copyright Beman Dawes 2003, 2006
 
@@ -18,40 +18,29 @@
 # if defined( BOOST_WINDOWS_API ) && defined( BOOST_POSIX_API )
 #   error both BOOST_WINDOWS_API and BOOST_POSIX_API are defined
 # elif !defined( BOOST_WINDOWS_API ) && !defined( BOOST_POSIX_API )
-#   if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)
+#   if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+      // All Win32 development environments, including 64-bit Windows and MinGW, define 
+      // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment,
+      // so does not define _WIN32 or its variants.
 #     define BOOST_WINDOWS_API
 #   else
 #     define BOOST_POSIX_API 
 #   endif
 # endif
 
-//  enable dynamic linking on Windows  ---------------------------------------//
+//  enable dynamic or static linking as requested --------------------------------------//
 
-//#  if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SYSTEM_DYN_LINK)) && defined(__BORLANDC__) && defined(__WIN32__)
-//#    error Dynamic linking Boost.System does not work for Borland; use static linking instead
-//#  endif
-
-#ifdef BOOST_HAS_DECLSPEC // defined in config system
-// we need to import/export our code only if the user has specifically
-// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
-// libraries to be dynamically linked, or BOOST_SYSTEM_DYN_LINK
-// if they want just this one to be dynamically liked:
 #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SYSTEM_DYN_LINK)
-// export if this is our own source, otherwise import:
-#ifdef BOOST_SYSTEM_SOURCE
-# define BOOST_SYSTEM_DECL __declspec(dllexport)
+# if defined(BOOST_SYSTEM_SOURCE)
+#   define BOOST_SYSTEM_DECL BOOST_SYMBOL_EXPORT
+# else 
+#   define BOOST_SYSTEM_DECL BOOST_SYMBOL_IMPORT
+# endif
 #else
-# define BOOST_SYSTEM_DECL __declspec(dllimport)
-#endif  // BOOST_SYSTEM_SOURCE
-#endif  // DYN_LINK
-#endif  // BOOST_HAS_DECLSPEC
-//
-// if BOOST_SYSTEM_DECL isn't defined yet define it now:
-#ifndef BOOST_SYSTEM_DECL
-#define BOOST_SYSTEM_DECL
+# define BOOST_SYSTEM_DECL
 #endif
 
-//  enable automatic library variant selection  ------------------------------// 
+//  enable automatic library variant selection  ----------------------------------------// 
 
 #if !defined(BOOST_SYSTEM_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SYSTEM_NO_LIB)
 //
Modified: trunk/boost/system/system_error.hpp
==============================================================================
--- trunk/boost/system/system_error.hpp	(original)
+++ trunk/boost/system/system_error.hpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -17,9 +17,11 @@
 {
   namespace system
   {
-    //  class system_error  --------------------------------------------------//
+    //  class system_error  ------------------------------------------------------------//
 
-    class system_error : public std::runtime_error
+    class BOOST_SYMBOL_VISIBLE system_error : public std::runtime_error
+    // BOOST_SYMBOL_VISIBLE is needed by GCC to ensure system_error thrown from a shared
+    // library can be caught. See svn.boost.org/trac/boost/ticket/3697 
     {
     public:
       system_error( error_code ec )
Modified: trunk/libs/config/doc/macro_reference.qbk
==============================================================================
--- trunk/libs/config/doc/macro_reference.qbk	(original)
+++ trunk/libs/config/doc/macro_reference.qbk	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -317,6 +317,7 @@
 
 [#config_features]
 
+
 [section Macros that describe optional features]
 
 The following macros describe features that are not required by the C++
@@ -332,10 +333,6 @@
 [[`BOOST_HAS_CLOCK_GETTIME`][Platform][
 The platform has the POSIX API `clock_gettime`.
 ]]
-[[`BOOST_HAS_DECLSPEC`][Compiler][
-The compiler uses `__declspec(dllexport)` and `__declspec(dllimport)` to
-export/import symbols from dll's.
-]]
 [[`BOOST_HAS_DIRENT_H`][Platform][
 The platform has the POSIX header `<dirent.h>`.
 ]]
@@ -868,9 +865,98 @@
 [section Macros for libraries with separate source code]
 
 The following macros and helper headers are of use to authors whose libraries
-include separate source code, and are intended to address two issues: fixing
-the ABI of the compiled library, and selecting which compiled library to link
-against based upon the compilers settings.
+include separate source code, and are intended to address several issues:
+
+* Controlling shared library symbol visibility
+* Fixing the ABI of the compiled library
+* Selecting which compiled library to link against based upon the compilers settings
+
+See [@http://svn.boost.org/trac/boost/wiki/Guidelines/Separate Guidelines for Authors of Boost Libraries Containing Separate Source] 
+
+[section Macros controlling shared library symbol visibility]
+
+Some compilers support C++ extensions that control which symbols 
+will be exported from shared libraries such as dynamic shared objects (DSO's) on Unix-like
+systems or dynamic-link libraries (DLL's) on Windows.
+
+The Microsoft VC++ compiler has long supplied 
+`__declspec(dllexport)` and `__declspec(dllimport)` extensions for this purpose,
+as do virtually all other compilers targeting the Windows platform.
+ 
+Modern versions of the GNU GCC compiler provide the `__attribute__((visibility("default")))` 
+extension to indicate that a symbol should be exported. All other symbols may be hidden by using the
+`-fvisibility-hidden` or `-fvisibility-ms-compat` compiler switches.
+
+Boost supplies several macros to make it easier to manage symbol visibility in a way that
+is portable between compilers and operating systems.
+
+[table
+[[Macro       ][Description       ]]
+[[`BOOST_SYMBOL_EXPORT`][
+Defines the syntax of a C++ language extension that indicates a symbol is to be exported from a shared library.
+If the compiler has no such extension, the macro is defined with no replacement text. 
+]]
+[[`BOOST_SYMBOL_IMPORT`][
+Defines the syntax of a C++ language extension that indicates a symbol is to be imported from a shared library.
+If the compiler has no such extension, the macro is defined with no replacement text. 
+]]
+[[`BOOST_SYMBOL_VISIBLE`][
+Defines the syntax of a C++ language extension that indicates a symbol is to be globally visible.
+If the compiler has no such extension, the macro is defined with no replacement text. 
+Needed for classes that are not otherwise exported, but are used by RTTI. Examples include
+class for objects that will be thrown as exceptions or used in dynamic_casts,
+across shared library boundaries. For example, a header-only exception class might look like this:
+``
+  class BOOST_SYMBOL_VISIBLE my_exception : public std::runtime_error { ... };
+`` 
+Without BOOST_SYMBOL_VISIBLE, it would be impossible to catch my_exception thrown from a shared library
+compiled by GCC with the -fvisibility=hidden option.
+]]
+[[`BOOST_HAS_DECLSPEC`][
+The compiler has C++ extensions `__declspec(dllexport)` and `__declspec(dllimport)` to control
+export/import of symbols from shared libraries.
+['Deprecated. This macro is no longer necessary since BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT
+are now supplied. It is provided to support legacy code.]
+]]
+]
+
+Typical usage:
+
+[*boost/foo/config.hpp]
+
+    ...
+    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FOO_DYN_LINK)
+    # if defined(BOOST_FOO_SOURCE)
+    #   define BOOST_FOO_DECL BOOST_SYMBOL_EXPORT
+    # else 
+    #   define BOOST_FOO_DECL BOOST_SYMBOL_IMPORT
+    # endif
+    #else
+    # define BOOST_FOO_DECL
+    #endif
+    ...
+ 
+[*boost/foo/foo.hpp] 
+  
+    #include <boost/foo/config.hpp>
+    ...
+    class BOOST_FOO_DECL bar { ... };
+    ...
+    void BOOST_FOO_DECL f();
+    ...
+
+[*boost/libs/foo/src/foo.cpp] 
+   
+    #define BOOST_FOO_SOURCE
+    #include <boost/foo/foo.hpp>    
+    ...
+    void BOOST_FOO_DECL f()
+    {
+      ...
+    }
+    ...
+     
+[endsect]
 
 [section ABI Fixing]
 
Modified: trunk/libs/system/test/Jamfile.v2
==============================================================================
--- trunk/libs/system/test/Jamfile.v2	(original)
+++ trunk/libs/system/test/Jamfile.v2	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -12,6 +12,12 @@
       <library>/boost/system//boost_system
       <toolset>msvc:<asynch-exceptions>on
     ;
+    
+   lib throw_test
+     : throw_test.cpp
+     : <link>shared:<define>BOOST_SYSTEM_DYN_LINK=1
+     ;
+   
 
    test-suite "system"
        : [ run error_code_test.cpp
@@ -21,21 +27,25 @@
                    <link>static
          ]
          [ run error_code_test.cpp
-           :  :  :  : error_code_test_dll
+           :  :  : <link>shared : error_code_test_shared
          ]
          [ run error_code_user_test.cpp
            :  :  : <link>static
          ]
          [ run error_code_user_test.cpp
-           :  :  :  : error_code_user_test_dll
+           :  :  : <link>shared : error_code_user_test_shared
          ]
          [ run system_error_test.cpp
            :  :  : <link>static
          ]
          [ run system_error_test.cpp
-            :  :  :  : system_error_test_dll
+            :  :  : <link>shared : system_error_test_shared
+         ]
+         [ run dynamic_link_test.cpp throw_test
+           :  :  : <link>shared : throw_test_shared
          ]
          [ run initialization_test.cpp
+            :  :  : <link>shared : initialization_test_shared
          ]
          [ run header_only_test.cpp
            :  :  : <link>static
Added: trunk/libs/system/test/dynamic_link_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/system/test/dynamic_link_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -0,0 +1,55 @@
+//  dynamic_link_test.cpp  -------------------------------------------------------------//
+
+//  Copyright Beman Dawes 2010
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See www.boost.org/LICENSE_1_0.txt
+
+//  Library home page is www.boost.org/libs/system
+
+//--------------------------------------------------------------------------------------// 
+
+//  Dynamic link libraries (DLL's), also know as dynamic shared objects (DSO's),
+//  can cause symbol visability problems unless carefully configured. One of the
+//  manifestations, particularly with GCC, is that a system_error exception thrown from
+//  a DLL or DSO is not caught.
+//
+//  The purpose of this program is to test for that error.
+
+//--------------------------------------------------------------------------------------// 
+
+#include <boost/system/system_error.hpp>
+
+#include <iostream>
+
+namespace boost
+{
+  namespace system
+  {
+    BOOST_SYSTEM_DECL void throw_test();
+  }
+}
+
+int main()
+{
+  try
+  {
+    boost::system::throw_test();
+  }
+  catch (const boost::system::system_error& ex)
+  {
+    std::cout << "  caught boost::system::system_error as expected\n";
+    std::cout << "  what() reports " << ex.what() << '\n';
+    return 0;
+  }
+
+  catch (const std::runtime_error& ex)
+  {
+    std::cout << "  error: caught std::runtime_error instead of boost::system::system_error\n";
+    std::cout << "  what() reports " << ex.what() << '\n';
+    return 1;
+  }
+
+  std::cout << "  error: failed to catch boost::system::system_error\n";
+  return 1;
+}
\ No newline at end of file
Modified: trunk/libs/system/test/error_code_test.cpp
==============================================================================
--- trunk/libs/system/test/error_code_test.cpp	(original)
+++ trunk/libs/system/test/error_code_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -59,6 +59,12 @@
 int main( int, char ** )
 {
 
+  std::cout << "Conversion use cases...\n";
+  error_condition x1( errc::file_exists );
+  //error_code x2( errc::file_exists ); // should fail to compile
+  make_error_code(errc::file_exists);
+  make_error_condition(errc::file_exists);
+
   std::cout << "General tests...\n";
   // unit tests:
 
Modified: trunk/libs/system/test/error_code_user_test.cpp
==============================================================================
--- trunk/libs/system/test/error_code_user_test.cpp	(original)
+++ trunk/libs/system/test/error_code_user_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -18,7 +18,7 @@
 #include <boost/cerrno.hpp>
 #include <string>
 #include <cstdio>
-#include <boost/test/minimal.hpp>
+#include <boost/detail/lightweight_test.hpp>
 
 #ifdef BOOST_POSIX_API
 # include <sys/stat.h>
@@ -264,7 +264,7 @@
 //
 //  void check_success(const boost::system::error_code& ec, bool expect)
 //  {
-//    BOOST_CHECK( (ec == boost::system::posix::success) == expect );
+//    BOOST_TEST( (ec == boost::system::posix::success) == expect );
 //    if (ec == boost::system::posix::success)
 //      std::cout << "yes... " << (expect ? "ok" : "fail") << '\n';
 //    else
@@ -273,7 +273,7 @@
 //
 //  void check_permission_denied(const boost::system::error_code& ec, bool expect)
 //  {
-//    BOOST_CHECK( (ec == boost::system::posix::permission_denied) == expect );
+//    BOOST_TEST( (ec == boost::system::posix::permission_denied) == expect );
 //    if (ec ==  boost::system::posix::permission_denied)
 //      std::cout << "yes... " << (expect ? "ok" : "fail") << '\n';
 //    else
@@ -282,7 +282,7 @@
 //
 //  void check_out_of_memory(const boost::system::error_code& ec, bool expect)
 //  {
-//    BOOST_CHECK( (ec == boost::system::posix::not_enough_memory) == expect );
+//    BOOST_TEST( (ec == boost::system::posix::not_enough_memory) == expect );
 //    if (ec ==  boost::system::posix::not_enough_memory)
 //      std::cout << "yes... " << (expect ? "ok" : "fail") << '\n';
 //    else
@@ -337,7 +337,7 @@
 
 //  ------------------------------------------------------------------------  //
 
-int test_main( int, char *[] )
+int main( int, char *[] )
 {
   boost::system::error_code ec;
 
@@ -346,35 +346,35 @@
   ec = my_mkdir( "/no-such-file-or-directory/will-not-succeed" );
   std::cout << "ec.value() is " << ec.value() << '\n';
 
-  BOOST_CHECK( ec );
-  BOOST_CHECK( ec == boost::system::posix::no_such_file_or_directory );
-  BOOST_CHECK( ec.category() == boost::system::system_category );
+  BOOST_TEST( ec );
+  BOOST_TEST( ec == boost::system::posix::no_such_file_or_directory );
+  BOOST_TEST( ec.category() == boost::system::system_category );
 
   // Library 2 tests:
 
   ec = my_remove( "/no-such-file-or-directory" );
   std::cout << "ec.value() is " << ec.value() << '\n';
 
-  BOOST_CHECK( ec );
-  BOOST_CHECK( ec == boost::system::posix::no_such_file_or_directory );
-  BOOST_CHECK( ec.category() == boost::system::posix_category );
+  BOOST_TEST( ec );
+  BOOST_TEST( ec == boost::system::posix::no_such_file_or_directory );
+  BOOST_TEST( ec.category() == boost::system::posix_category );
 
   // Library 3 tests:
 
   ec = boost::lib3::boo_boo;
   std::cout << "ec.value() is " << ec.value() << '\n';
 
-  BOOST_CHECK( ec );
-  BOOST_CHECK( ec == boost::lib3::boo_boo );
-  BOOST_CHECK( ec.value() == boost::lib3::boo_boo );
-  BOOST_CHECK( ec.category() == boost::lib3::lib3_error_category );
+  BOOST_TEST( ec );
+  BOOST_TEST( ec == boost::lib3::boo_boo );
+  BOOST_TEST( ec.value() == boost::lib3::boo_boo );
+  BOOST_TEST( ec.category() == boost::lib3::lib3_error_category );
 
-  BOOST_CHECK( ec == boost::system::posix::io_error );
+  BOOST_TEST( ec == boost::system::posix::io_error );
 
   boost::system::error_code ec3( boost::lib3::boo_boo+100,
     boost::lib3::lib3_error_category );
-  BOOST_CHECK( ec3.category() == boost::lib3::lib3_error_category );
-  BOOST_CHECK( ec3.default_error_condition().category()
+  BOOST_TEST( ec3.category() == boost::lib3::lib3_error_category );
+  BOOST_TEST( ec3.default_error_condition().category()
     == boost::lib3::lib3_error_category );
 
   // Library 4 tests:
@@ -382,16 +382,16 @@
   ec = lib4::boo_boo;
   std::cout << "ec.value() is " << ec.value() << '\n';
 
-  BOOST_CHECK( ec );
-  BOOST_CHECK( ec == lib4::boo_boo );
-  BOOST_CHECK( ec.value() == lib4::boo_boo.value() );
-  BOOST_CHECK( ec.category() == lib4::lib4_error_category );
+  BOOST_TEST( ec );
+  BOOST_TEST( ec == lib4::boo_boo );
+  BOOST_TEST( ec.value() == lib4::boo_boo.value() );
+  BOOST_TEST( ec.category() == lib4::lib4_error_category );
 
-  BOOST_CHECK( ec == boost::system::posix::io_error );
+  BOOST_TEST( ec == boost::system::posix::io_error );
 
   boost::system::error_code ec4( lib4::boo_boo.value()+100,
     lib4::lib4_error_category );
-  BOOST_CHECK( ec4.default_error_condition().category()
+  BOOST_TEST( ec4.default_error_condition().category()
     == lib4::lib4_error_category );
 
   // Test 3
Modified: trunk/libs/system/test/header_only_test.cpp
==============================================================================
--- trunk/libs/system/test/header_only_test.cpp	(original)
+++ trunk/libs/system/test/header_only_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -13,11 +13,10 @@
 
 #define BOOST_ERROR_CODE_HEADER_ONLY
 
-#include <boost/test/minimal.hpp>
-
+#include <boost/detail/lightweight_test.hpp>
 #include <boost/system/error_code.hpp>
 
-int test_main( int, char*[] )
+int main( int, char*[] )
 {
   boost::system::error_code ec( 0, boost::system::system_category );
   return 0;
Modified: trunk/libs/system/test/initialization_test.cpp
==============================================================================
--- trunk/libs/system/test/initialization_test.cpp	(original)
+++ trunk/libs/system/test/initialization_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -10,7 +10,7 @@
 //  This test verifiies that the error_category vtable does not suffer from
 //  order-of-initialization problems.
 
-#include <boost/test/minimal.hpp>
+#include <boost/detail/lightweight_test.hpp>
 #include <boost/system/error_code.hpp>
 
 struct foo
@@ -22,7 +22,7 @@
   }
 } f;
 
-int test_main( int, char ** )
+int main( int, char ** )
 {
        return 0;
 }
Modified: trunk/libs/system/test/system_error_test.cpp
==============================================================================
--- trunk/libs/system/test/system_error_test.cpp	(original)
+++ trunk/libs/system/test/system_error_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -14,7 +14,7 @@
 
 #include <boost/config/warning_disable.hpp>
 
-#include <boost/test/minimal.hpp>
+#include <boost/detail/lightweight_test.hpp>
 #include <boost/system/system_error.hpp>
 #include <iostream>
 #include <string>
@@ -36,8 +36,8 @@
     int v, const char * str )
   {
     std::cout << "test " << desc << "\n what() returns \"" << ex.what() << "\"\n";
-    BOOST_CHECK( ex.code().value() == v );
-    BOOST_CHECK( ex.code().category() == system_category );
+    BOOST_TEST( ex.code().value() == v );
+    BOOST_TEST( ex.code().category() == system_category );
 # ifdef BOOST_WINDOWS_API
     LANGID language_id;
 #   if !defined(__MINGW32__) && !defined(__CYGWIN__)
@@ -48,7 +48,7 @@
     // std::cout << "GetUserDefaultUILanguage() returns " << language_id << '\n';
     if ( language_id == 0x0409 )  // English (United States)
     {
-      BOOST_CHECK( std::string( ex.what() ) == str );
+      BOOST_TEST( std::string( ex.what() ) == str );
       if ( std::string( ex.what() ) != str )
         std::cout << "expected \"" << str << "\", but what() returned \""
           << ex.what() << "\"\n";
@@ -59,7 +59,7 @@
   const boost::uint_least32_t uvalue = 2u;
 }
 
-int test_main( int, char *[] )
+int main( int, char *[] )
 {
   // all constructors, in the same order as they appear in the header:
 
Modified: trunk/libs/system/test/system_msvc/common.vsprops
==============================================================================
--- trunk/libs/system/test/system_msvc/common.vsprops	(original)
+++ trunk/libs/system/test/system_msvc/common.vsprops	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -7,13 +7,13 @@
         <Tool
                 Name="VCCLCompilerTool"
                 AdditionalIncludeDirectories="../../../../.."
-		PreprocessorDefinitions="BOOST_ALL_NO_LIB"
+		PreprocessorDefinitions="BOOST_ALL_NO_LIB;BOOST_ALL_DYN_LINK"
                 ExceptionHandling="2"
                 WarningLevel="4"
         />
         <Tool
                 Name="VCPostBuildEventTool"
-		Description="Executing test $(TargetName).exe..."
-		CommandLine=""$(TargetDir)\$(TargetName).exe" --result_code=no --report_level=no"
+		Description=""
+		CommandLine=""
         />
 </VisualStudioPropertySheet>
Modified: trunk/libs/system/test/system_msvc/error_code_test/error_code_test.vcproj
==============================================================================
--- trunk/libs/system/test/system_msvc/error_code_test/error_code_test.vcproj	(original)
+++ trunk/libs/system/test/system_msvc/error_code_test/error_code_test.vcproj	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -86,6 +86,8 @@
                         />
                         <Tool
                                 Name="VCPostBuildEventTool"
+				Description="Executing test $(TargetName).exe..."
+				CommandLine=""$(TargetDir)\$(TargetName).exe" --result_code=no --report_level=no"
                         />
                 </Configuration>
                 <Configuration
@@ -161,6 +163,8 @@
                         />
                         <Tool
                                 Name="VCPostBuildEventTool"
+				Description="Executing test $(TargetName).exe..."
+				CommandLine=""$(TargetDir)\$(TargetName).exe" --result_code=no --report_level=no"
                         />
                 </Configuration>
         </Configurations>
@@ -173,10 +177,6 @@
                         UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
 			>
                         <File
-				RelativePath="..\..\..\src\error_code.cpp"
-				>
-			</File>
-			<File
                                 RelativePath="..\..\error_code_test.cpp"
 				>
                         </File>
Modified: trunk/libs/system/test/system_msvc/system_msvc.sln
==============================================================================
--- trunk/libs/system/test/system_msvc/system_msvc.sln	(original)
+++ trunk/libs/system/test/system_msvc/system_msvc.sln	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -2,8 +2,27 @@
 Microsoft Visual Studio Solution File, Format Version 10.00
 # Visual C++ Express 2008
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "error_code_test", "error_code_test\error_code_test.vcproj", "{81960557-E9A9-4E81-AC96-9E11C33CB058}"
+	ProjectSection(ProjectDependencies) = postProject
+		{22892211-A1F3-435B-8B97-A12E8772599E} = {22892211-A1F3-435B-8B97-A12E8772599E}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "system_error_test", "system_error_test\system_error_test.vcproj", "{CBD12E59-99E5-4F35-9B66-0554D0FBDB76}"
+	ProjectSection(ProjectDependencies) = postProject
+		{22892211-A1F3-435B-8B97-A12E8772599E} = {22892211-A1F3-435B-8B97-A12E8772599E}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dynamic_link_test", "dynamic_link_test\dynamic_link_test.vcproj", "{AD186B11-9132-48A9-9F24-3522C2310B0D}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F6D9B408-84A3-405A-93ED-DE5AA8CF84D7} = {F6D9B408-84A3-405A-93ED-DE5AA8CF84D7}
+		{22892211-A1F3-435B-8B97-A12E8772599E} = {22892211-A1F3-435B-8B97-A12E8772599E}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "system_dll", "system_dll\system_dll.vcproj", "{22892211-A1F3-435B-8B97-A12E8772599E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "throw_test_dll", "throw_test_dll\throw_test_dll.vcproj", "{F6D9B408-84A3-405A-93ED-DE5AA8CF84D7}"
+	ProjectSection(ProjectDependencies) = postProject
+		{22892211-A1F3-435B-8B97-A12E8772599E} = {22892211-A1F3-435B-8B97-A12E8772599E}
+	EndProjectSection
 EndProject
 Global
         GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -19,6 +38,18 @@
                 {CBD12E59-99E5-4F35-9B66-0554D0FBDB76}.Debug|Win32.Build.0 = Debug|Win32
                 {CBD12E59-99E5-4F35-9B66-0554D0FBDB76}.Release|Win32.ActiveCfg = Release|Win32
                 {CBD12E59-99E5-4F35-9B66-0554D0FBDB76}.Release|Win32.Build.0 = Release|Win32
+		{AD186B11-9132-48A9-9F24-3522C2310B0D}.Debug|Win32.ActiveCfg = Debug|Win32
+		{AD186B11-9132-48A9-9F24-3522C2310B0D}.Debug|Win32.Build.0 = Debug|Win32
+		{AD186B11-9132-48A9-9F24-3522C2310B0D}.Release|Win32.ActiveCfg = Release|Win32
+		{AD186B11-9132-48A9-9F24-3522C2310B0D}.Release|Win32.Build.0 = Release|Win32
+		{22892211-A1F3-435B-8B97-A12E8772599E}.Debug|Win32.ActiveCfg = Debug|Win32
+		{22892211-A1F3-435B-8B97-A12E8772599E}.Debug|Win32.Build.0 = Debug|Win32
+		{22892211-A1F3-435B-8B97-A12E8772599E}.Release|Win32.ActiveCfg = Release|Win32
+		{22892211-A1F3-435B-8B97-A12E8772599E}.Release|Win32.Build.0 = Release|Win32
+		{F6D9B408-84A3-405A-93ED-DE5AA8CF84D7}.Debug|Win32.ActiveCfg = Debug|Win32
+		{F6D9B408-84A3-405A-93ED-DE5AA8CF84D7}.Debug|Win32.Build.0 = Debug|Win32
+		{F6D9B408-84A3-405A-93ED-DE5AA8CF84D7}.Release|Win32.ActiveCfg = Release|Win32
+		{F6D9B408-84A3-405A-93ED-DE5AA8CF84D7}.Release|Win32.Build.0 = Release|Win32
         EndGlobalSection
         GlobalSection(SolutionProperties) = preSolution
                 HideSolutionNode = FALSE
Added: trunk/libs/system/test/throw_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/system/test/throw_test.cpp	2010-05-22 08:12:00 EDT (Sat, 22 May 2010)
@@ -0,0 +1,31 @@
+//  throw_test.cpp  --------------------------------------------------------===========-//
+
+//  Copyright Beman Dawes 2010
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See www.boost.org/LICENSE_1_0.txt
+
+//  Library home page is www.boost.org/libs/system
+
+//--------------------------------------------------------------------------------------// 
+
+//  See dynamic_link_test.cpp comments for use case.
+
+//--------------------------------------------------------------------------------------// 
+
+// define BOOST_SYSTEM_SOURCE so that <boost/system/config.hpp> knows
+// the library is being built (possibly exporting rather than importing code)
+#define BOOST_SYSTEM_SOURCE 
+
+#include <boost/system/system_error.hpp>
+
+namespace boost
+{
+  namespace system
+  {
+    BOOST_SYSTEM_DECL void throw_test()
+    {
+      throw system_error(9999, get_system_category(), "boo boo");
+    }
+  }
+}