$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78000 - in trunk: boost/filesystem libs/filesystem/doc libs/filesystem/src libs/filesystem/test
From: bdawes_at_[hidden]
Date: 2012-04-15 16:34:19
Author: bemandawes
Date: 2012-04-15 16:34:19 EDT (Sun, 15 Apr 2012)
New Revision: 78000
URL: http://svn.boost.org/trac/boost/changeset/78000
Log:
Fix #6690 and #6737, resolving static linking related problems with VC++ 8 through 11. Note that this fix may reintroduce codecvt thread safety problems #4889, #6320, for these compilers if static linking is used.
Text files modified: 
   trunk/boost/filesystem/path.hpp                |     7 ---                                     
   trunk/libs/filesystem/doc/release_history.html |    14 +++++++-                                
   trunk/libs/filesystem/src/path.cpp             |    62 ++++++++++++++++++++++++++++++++++----- 
   trunk/libs/filesystem/test/path_test.cpp       |     3 +                                       
   4 files changed, 70 insertions(+), 16 deletions(-)
Modified: trunk/boost/filesystem/path.hpp
==============================================================================
--- trunk/boost/filesystem/path.hpp	(original)
+++ trunk/boost/filesystem/path.hpp	2012-04-15 16:34:19 EDT (Sun, 15 Apr 2012)
@@ -418,10 +418,7 @@
     //  -----  static member functions  -----
 
     static std::locale  imbue(const std::locale& loc);
-    static const        codecvt_type& codecvt()
-    {
-      return *wchar_t_codecvt_facet();
-    }
+    static const        codecvt_type& codecvt();
 
     //  -----  deprecated functions  -----
 
@@ -502,8 +499,6 @@
     static void m_path_iterator_increment(path::iterator & it);
     static void m_path_iterator_decrement(path::iterator & it);
 
-    static const codecvt_type *&  wchar_t_codecvt_facet();
-
   };  // class path
 
   namespace detail
Modified: trunk/libs/filesystem/doc/release_history.html
==============================================================================
--- trunk/libs/filesystem/doc/release_history.html	(original)
+++ trunk/libs/filesystem/doc/release_history.html	2012-04-15 16:34:19 EDT (Sun, 15 Apr 2012)
@@ -49,7 +49,7 @@
   The behavior for simple cases has been reverted to the Version 2 behavior, but 
   with corrections so that complex replacements now work. Two test cases from 
   #5118 have been added.</li>
-  <li>Fix #3737, 
+  <li>Fix #3737, 
   Boost.Filesystem does not compile on Windows Mobile. On Windows, <sys/stat.h> 
   is no longer included.</li>
   <li>Fix #4065, 
@@ -58,6 +58,16 @@
   related to lexicographical issues.</li>
   <li>Add class path member function <code>compare</code> for consistency with 
   std::string.</li>
+  <li>Tighten BOOST_FILESYSTEM_DYN_LINK and BOOST_FILESYSTEM_STATIC_LINK logic 
+  in filesystem/config.hpp so that one or the other is always defined, and both 
+  being defined is a #error.</li>
+  <li>Fix #6690 and
+  #6737, resolving 
+  static linking related problems with VC++ 8 through 11. Note that this fix may 
+  reintroduce codecvt thread safety problems
+  #4889,
+  #6320, for these 
+  compilers if static linking is used.</li>
 </ul>
 
 <h2>1.49.0</h2>
@@ -142,7 +152,7 @@
 </ul>
 <hr>
 <p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->31 March, 2012<!--webbot bot="Timestamp" endspan i-checksum="28817" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->15 April, 2012<!--webbot bot="Timestamp" endspan i-checksum="29863" --></p>
 <p>© Copyright Beman Dawes, 2011</p>
 <p> Use, modification, and distribution are subject to the Boost Software 
 License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt">
Modified: trunk/libs/filesystem/src/path.cpp
==============================================================================
--- trunk/libs/filesystem/src/path.cpp	(original)
+++ trunk/libs/filesystem/src/path.cpp	2012-04-15 16:34:19 EDT (Sun, 15 Apr 2012)
@@ -791,12 +791,36 @@
   //                              locale helpers                                        //
   //------------------------------------------------------------------------------------//
 
-#ifdef BOOST_WINDOWS_API
+#if defined(BOOST_WINDOWS_API) && defined(BOOST_FILESYSTEM_STATIC_LINK)
+
+  inline std::locale default_locale()
+  {
+    std::locale global_loc = std::locale();
+    std::locale loc(global_loc, new windows_file_codecvt);
+    return loc;
+  }
+
+  inline std::locale& path_locale()
+  {
+    static std::locale loc(default_locale());
+    return loc;
+  }
+
+  inline const path::codecvt_type*& codecvt_facet_ptr()
+  {
+    static const std::codecvt<wchar_t, char, std::mbstate_t>*
+     facet(
+       &std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
+        (path_locale()));
+    return facet;
+  }
+
+#elif defined(BOOST_WINDOWS_API) && !defined(BOOST_FILESYSTEM_STATIC_LINK)
 
   std::locale path_locale(std::locale(), new windows_file_codecvt); 
 
   const std::codecvt<wchar_t, char, std::mbstate_t>*
-    codecvt_facet(&std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
+    codecvt_facet_ptr(&std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
       (path_locale));
 
 #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
@@ -824,7 +848,7 @@
                           new boost::filesystem::detail::utf8_codecvt_facet);
 
   const std::codecvt<wchar_t, char, std::mbstate_t>*
-    codecvt_facet(&std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
+    codecvt_facet_ptr(&std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
       (path_locale));
 
 #else  // Other POSIX
@@ -836,8 +860,8 @@
   // or LANG are wrong, for example), so lazy initialization is used to ensure
   // that exceptions occur after main() starts and so can be caught.
 
-  std::locale path_locale;  // initialized by path::wchar_t_codecvt_facet() below
-  const std::codecvt<wchar_t, char, std::mbstate_t>* codecvt_facet;  // ditto
+  std::locale path_locale;  // initialized by path::codecvt() below
+  const std::codecvt<wchar_t, char, std::mbstate_t>* codecvt_facet_ptr;  // ditto
 
 # endif
 
@@ -852,7 +876,26 @@
 namespace filesystem
 {
 
-  const path::codecvt_type*& path::wchar_t_codecvt_facet()
+#if defined(BOOST_WINDOWS_API) && defined(BOOST_FILESYSTEM_STATIC_LINK)
+
+  const path::codecvt_type& path::codecvt()
+  {
+    BOOST_ASSERT_MSG(codecvt_facet_ptr(), "codecvt_facet_ptr() facet hasn't been properly initialized");
+    return *codecvt_facet_ptr();
+  }
+
+  std::locale path::imbue(const std::locale & loc)
+  {
+    std::locale temp(path_locale());
+    path_locale() = loc;
+    codecvt_facet_ptr() =
+      &std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(path_locale());
+    return temp;
+  }
+
+#else
+
+  const path::codecvt_type& path::codecvt()
   {
 #   if defined(BOOST_POSIX_API) && \
       !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
@@ -862,17 +905,20 @@
       // exception if a valid std::locale("") is actually needed.
       static std::locale posix_lazy_initialization(path::imbue(std::locale("")));
 #   endif
-    return codecvt_facet;
+    return *codecvt_facet_ptr;
   }
 
   std::locale path::imbue(const std::locale& loc)
   {
     std::locale temp(path_locale);
     path_locale = loc;
-    codecvt_facet =
+    codecvt_facet_ptr =
       &std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(path_locale);
     return temp;
   }
 
+
+#endif
+
 }  // namespace filesystem
 }  // namespace boost
Modified: trunk/libs/filesystem/test/path_test.cpp
==============================================================================
--- trunk/libs/filesystem/test/path_test.cpp	(original)
+++ trunk/libs/filesystem/test/path_test.cpp	2012-04-15 16:34:19 EDT (Sun, 15 Apr 2012)
@@ -1741,6 +1741,9 @@
 
 } // unnamed namespace
 
+static boost::filesystem::path FilePath = "FilePath";  // #6737 reported this crashed
+                                                       // on VC++ debug mode build 
+
 //--------------------------------------------------------------------------------------//
 //                                                                                      //
 //                                     main                                             //