Index: boost/spirit/home/karma/numeric/detail/numeric_utils.hpp
===================================================================
--- boost/spirit/home/karma/numeric/detail/numeric_utils.hpp	(revision 58850)
+++ boost/spirit/home/karma/numeric/detail/numeric_utils.hpp	(working copy)
@@ -548,6 +548,29 @@
 
     ///////////////////////////////////////////////////////////////////////////
     //
+    //  The uint_inserter template takes care of the conversion of any integer 
+    //  to a string, while interpreting the number as an unsigned type.
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        unsigned Radix, typename CharEncoding = unused_type
+      , typename Tag = unused_type>
+    struct uint_inserter : int_inserter<Radix, CharEncoding, Tag>
+    {
+        typedef int_inserter<Radix, CharEncoding, Tag> base_type;
+
+        //  Common code for integer string representations
+        template <typename OutputIterator, typename T>
+        static bool
+        call(OutputIterator& sink, T const& n)
+        {
+            typename detail::absolute_value_helper<T>::result_type un = n;
+            return base_type::call(sink, un, un, 0);
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
     //  The sign_inserter template generates a sign for a given numeric value.
     //
     //    The parameter forcesign allows to generate a sign even for positive  
Index: boost/spirit/home/karma/numeric/uint.hpp
===================================================================
--- boost/spirit/home/karma/numeric/uint.hpp	(revision 58850)
+++ boost/spirit/home/karma/numeric/uint.hpp	(working copy)
@@ -249,7 +249,7 @@
             if (!traits::has_optional_value(attr))
                 return false;       // fail if it's an uninitialized optional
 
-            return int_inserter<Radix, CharEncoding, Tag>::
+            return uint_inserter<Radix, CharEncoding, Tag>::
                         call(sink, traits::extract_from(attr, context)) &&
                    delimit_out(sink, d);      // always do post-delimiting
         }
@@ -315,7 +315,7 @@
             {
                 return false;
             }
-            return int_inserter<Radix, CharEncoding, Tag>::call(sink, n_) &&
+            return uint_inserter<Radix, CharEncoding, Tag>::call(sink, n_) &&
                    delimit_out(sink, d);      // always do post-delimiting
         }
 
@@ -325,7 +325,7 @@
         bool generate(OutputIterator& sink, Context&, Delimiter const& d
           , unused_type) const
         {
-            return int_inserter<Radix, CharEncoding, Tag>::call(sink, n_) &&
+            return uint_inserter<Radix, CharEncoding, Tag>::call(sink, n_) &&
                    delimit_out(sink, d);      // always do post-delimiting
         }
 
Index: boost/spirit/home/qi/binary/binary.hpp
===================================================================
--- boost/spirit/home/qi/binary/binary.hpp	(revision 58850)
+++ boost/spirit/home/qi/binary/binary.hpp	(working copy)
@@ -250,7 +250,7 @@
             Iterator it = first;
             for (unsigned int i = 0; i < sizeof(attr_); ++i)
             {
-                if (it == last || *bytes++ != *it++)
+                if (it == last || *bytes++ != static_cast<unsigned char>(*it++))
                     return false;
             }
 
Index: boost/spirit/home/qi/directive/matches.hpp
===================================================================
--- boost/spirit/home/qi/directive/matches.hpp	(revision 58850)
+++ boost/spirit/home/qi/directive/matches.hpp	(working copy)
@@ -57,7 +57,7 @@
         {
             bool result = subject.parse(first, last, context, skipper, unused);
             spirit::traits::assign_to(result, attr);
-            return result;
+            return true;
         }
 
         template <typename Context>
Index: libs/spirit/test/qi/matches.cpp
===================================================================
--- libs/spirit/test/qi/matches.cpp	(revision 58850)
+++ libs/spirit/test/qi/matches.cpp	(working copy)
@@ -31,9 +31,9 @@
         BOOST_TEST(!test("y", matches[char_('x')]));
         BOOST_TEST(!test("y", matches['x']));
         bool result = true;
-        BOOST_TEST(!test_attr("y", matches[char_('x')], result) && !result);
+        BOOST_TEST(test_attr("y", matches[char_('x')], result, false) && !result);
         result = true;
-        BOOST_TEST(!test_attr("y", matches['x'], result) && !result);
+        BOOST_TEST(test_attr("y", matches['x'], result, false) && !result);
     }
 
     return boost::report_errors();
