--- a/boost/concept_check.hpp
+++ b/boost/concept_check.hpp
@@ -1014,11 +1014,11 @@
         c.swap(c);
       }
 
-      void const_constraints(const C& c) {
-        ci = c.begin();
-        ci = c.end();
-        n = c.size();
-        b = c.empty();
+      void const_constraints(const C& constraint) {
+        ci = constraint.begin();
+        ci = constraint.end();
+        n = constraint.size();
+        b = constraint.empty();
       }
 
     private:
--- a/boost/filesystem/v3/path.hpp	2010-10-16 06:09:25.000000000 -0700
+++ b/boost/filesystem/v3/path.hpp	2011-05-14 16:54:35.927910801 -0700
@@ -142,23 +142,23 @@
     }
 
     template <class InputIterator>
-    path(InputIterator begin, InputIterator end)
+    path(InputIterator first, InputIterator last)
     { 
-      if (begin != end)
+      if (first != last)
       {
         std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
-          s(begin, end);
+          s(first, last);
         path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, codecvt());
       }
     }
 
     template <class InputIterator>
-    path(InputIterator begin, InputIterator end, const codecvt_type& cvt)
+    path(InputIterator first, InputIterator last, const codecvt_type& cvt)
     { 
-      if (begin != end)
+      if (first != last)
       {
         std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
-          s(begin, end);
+          s(first, last);
         path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
       }
     }
@@ -190,19 +190,19 @@
     }
 
     template <class InputIterator>
-    path& assign(InputIterator begin, InputIterator end)
+    path& assign(InputIterator first, InputIterator last)
     {
-      return assign(begin, end, codecvt());
+      return assign(first, last, codecvt());
     }
 
     template <class InputIterator>
-    path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt)
+    path& assign(InputIterator first, InputIterator last, const codecvt_type& cvt)
     { 
       m_pathname.clear();
-      if (begin != end)
+      if (first != last)
       {
         std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
-          s(begin, end);
+          s(first, last);
         path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
       }
       return *this;
@@ -227,13 +227,13 @@
     path& append(Source const& source, const codecvt_type& cvt);
 
     template <class InputIterator>
-    path& append(InputIterator begin, InputIterator end)
+    path& append(InputIterator first, InputIterator last)
     { 
-      return append(begin, end, codecvt());
+      return append(first, last, codecvt());
     }
 
     template <class InputIterator>
-    path& append(InputIterator begin, InputIterator end, const codecvt_type& cvt);
+    path& append(InputIterator first, InputIterator last, const codecvt_type& cvt);
 
     //  -----  modifiers  -----
 
@@ -612,13 +612,13 @@
 //--------------------------------------------------------------------------------------//
 
   template <class InputIterator>
-  path& path::append(InputIterator begin, InputIterator end, const codecvt_type& cvt)
+  path& path::append(InputIterator first, InputIterator last, const codecvt_type& cvt)
   { 
-    if (begin == end)
+    if (first == last)
       return *this;
     string_type::size_type sep_pos(m_append_separator_if_needed());
     std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
-      s(begin, end);
+      s(first, last);
     path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
     if (sep_pos)
       m_erase_redundant_separator(sep_pos);
