$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r69527 - in trunk: boost/spirit/home/support libs/spirit/test libs/spirit/test/qi
From: hartmut.kaiser_at_[hidden]
Date: 2011-03-03 13:49:31
Author: hkaiser
Date: 2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
New Revision: 69527
URL: http://svn.boost.org/trac/boost/changeset/69527
Log:
Spirit: fixed compilation issue in attribute handling code
Added:
   trunk/libs/spirit/test/qi/pass_container1.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/pass_container2.cpp   (contents, props changed)
   trunk/libs/spirit/test/qi/pass_container3.cpp   (contents, props changed)
Removed:
   trunk/libs/spirit/test/qi/pass_container.cpp
Text files modified: 
   trunk/boost/spirit/home/support/attributes.hpp |     8 ++++++--                                
   trunk/libs/spirit/test/Jamfile                 |     4 +++-                                    
   2 files changed, 9 insertions(+), 3 deletions(-)
Modified: trunk/boost/spirit/home/support/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/support/attributes.hpp	(original)
+++ trunk/boost/spirit/home/support/attributes.hpp	2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
@@ -82,7 +82,9 @@
     {
         template <typename T, typename Expected>
         struct value_type_is_substitute
-          : is_substitute<typename T::value_type, typename Expected::value_type>
+          : is_substitute<
+                typename container_value<T>::type
+              , typename container_value<Expected>::type>
         {};
     }
 
@@ -121,7 +123,9 @@
     {
         template <typename T, typename Expected>
         struct value_type_is_weak_substitute
-          : is_weak_substitute<typename T::value_type, typename Expected::value_type>
+          : is_weak_substitute<
+                typename container_value<T>::type
+              , typename container_value<Expected>::type>
         {};
     }
 
Modified: trunk/libs/spirit/test/Jamfile
==============================================================================
--- trunk/libs/spirit/test/Jamfile	(original)
+++ trunk/libs/spirit/test/Jamfile	2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
@@ -66,7 +66,8 @@
      [ run qi/not_predicate.cpp    : : : : qi_not_predicate ]
      [ run qi/optional.cpp         : : : : qi_optional ]
      [ run qi/parse_attr.cpp       : : : : qi_parse_attr ]
-     [ run qi/pass_container.cpp   : : : : qi_pass_container ]
+     [ run qi/pass_container1.cpp  : : : : qi_pass_container1 ]
+     [ run qi/pass_container2.cpp  : : : : qi_pass_container2 ]
      [ run qi/permutation.cpp      : : : : qi_permutation ]
      [ run qi/plus.cpp             : : : : qi_plus ]
      [ run qi/range_run.cpp        : : : : qi_range_run ]
@@ -113,6 +114,7 @@
      [ run qi/regression_repeat.cpp                               : : : : qi_regression_repeat ]
      [ run qi/regression_transform_assignment.cpp                 : : : : qi_regression_transform_assignment ]
      [ compile qi/regression_fusion_proto_spirit.cpp              : : qi_regression_fusion_proto_spirit ]
+     [ compile qi/pass_container3.cpp                             : : qi_pass_container3 ]
     ;
 
     ###########################################################################
Deleted: trunk/libs/spirit/test/qi/pass_container.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/pass_container.cpp	2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
+++ (empty file)
@@ -1,326 +0,0 @@
-//  Copyright (c) 2001-2011 Hartmut Kaiser
-// 
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include <string>
-#include <vector>
-#include <set>
-#include <map>
-
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_string.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_directive.hpp>
-#include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/qi_auxiliary.hpp>
-#include <boost/spirit/include/support_argument.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_object.hpp>
-#include <boost/spirit/include/phoenix_stl.hpp>
-#include <boost/fusion/include/std_pair.hpp>
-
-#include <string>
-#include <iostream>
-#include "test.hpp"
-
-using namespace spirit_test;
-
-inline bool compare(std::vector<char> const& v, std::string const& s)
-{
-    return v.size() == s.size() && std::equal(v.begin(), v.end(), s.begin());
-}
-
-int main()
-{
-    using boost::spirit::qi::char_;
-    using boost::spirit::qi::omit;
-
-    {
-        std::vector<char> v;
-        BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', v) &&
-            compare(v, "abcdefgh"));
-
-        std::string s;
-        BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', s) && 
-            s == "abcdefgh");
-
-        BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ','));
-        BOOST_TEST(test("a,b,c,d,e,f,g,h", omit[char_] % ','));
-    }
-
-    {
-        std::vector<char> v1;
-        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v1) &&
-            compare(v1, "abcdefgh"));
-        v1.clear();
-        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', v1) &&
-            compare(v1, "aceg"));
-
-        std::string s;
-        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', s) && 
-            s == "abcdefgh");
-        s.clear();
-        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', s) && 
-            s == "aceg");
-
-        std::vector<std::pair<char, char> > v2;
-        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v2) &&
-            v2.size() == 4 && 
-            v2[0] == std::make_pair('a', 'b') && 
-            v2[1] == std::make_pair('c', 'd') &&
-            v2[2] == std::make_pair('e', 'f') &&
-            v2[3] == std::make_pair('g', 'h'));
-
-        s.clear();
-        BOOST_TEST(test_attr("ab,cd,efg", (char_ >> char_) % ',' >> char_, s) &&
-            s == "abcdefg");
-
-        BOOST_TEST(test("ab,cd,ef,gh", (char_ >> char_) % ','));
-        BOOST_TEST(test("ab,cd,ef,gh", (omit[char_ >> char_]) % ','));
-    }
-
-    {
-        std::vector<char> v1;
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v1) &&
-            compare(v1, "abcdefgh"));
-        v1.clear();
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v1) &&
-            compare(v1, "adg"));
-        v1.clear();
-        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v1) &&
-            compare(v1, "bcefh"));
-
-        std::string s1;
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', s1) && 
-            s1 == "abcdefgh");
-        s1.clear();
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s1) && 
-            s1 == "adg");
-        s1.clear();
-        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', s1) && 
-            s1 == "bcefh");
-
-        std::vector<std::pair<char, std::vector<char> > > v2;
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v2) &&
-            v2.size() == 3 && 
-            v2[0].first == 'a' && compare(v2[0].second, "bc") && 
-            v2[1].first == 'd' && compare(v2[1].second, "ef") &&
-            v2[2].first == 'g' && compare(v2[2].second, "h"));
-
-        std::vector<std::vector<char> > v3;
-        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v3) &&
-            v3.size() == 3 && 
-            compare(v3[0], "bc") && compare(v3[1], "ef") &&
-            compare(v3[2], "h"));
-
-        std::vector<char> v4;
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v4) &&
-            v4.size() == 3 && 
-            v4[0] == 'a' &&  v4[1] == 'd' && v4[2] == 'g');
-
-        std::vector<std::string> v5;
-        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v5) &&
-            v5.size() == 3 && 
-            v5[0] == "bc" && v5[1] == "ef" && v5[2] == "h");
-
-        std::string s2;
-        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s2) &&
-            s2.size() == 3 && 
-            s2 == "adg");
-
-        BOOST_TEST(test("abc,def,gh", (char_ >> *~char_(',')) % ','));
-        BOOST_TEST(test("abc,def,gh", (omit[char_ >> *~char_(',')]) % ','));
-    }
-
-    {
-        using boost::spirit::qi::alpha;
-        using boost::spirit::qi::digit;
-
-        std::vector<char> v1;
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v1) &&
-            compare(v1, "ab12cd34ef56"));
-        v1.clear();
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v1) &&
-            compare(v1, "123456"));
-        v1.clear();
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', v1) &&
-            compare(v1, "abcdef"));
-
-        std::string s1;
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', s1) &&
-            s1 == "ab12cd34ef56");
-        s1.clear();
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', s1) &&
-            s1 == "123456");
-        s1.clear();
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', s1) &&
-            s1 == "abcdef");
-
-        std::vector<std::pair<std::vector<char>, std::vector<char> > > v2;
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v2) &&
-            v2.size() == 3 && 
-            compare(v2[0].first, "ab") && compare(v2[0].second, "12") &&
-            compare(v2[1].first, "cd") && compare(v2[1].second, "34") &&
-            compare(v2[2].first, "ef") && compare(v2[2].second, "56"));
-
-        std::vector<std::pair<std::string, std::string> > v3;
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v3) &&
-            v3.size() == 3 && 
-            v3[0].first == "ab" && v3[0].second == "12" &&
-            v3[1].first == "cd" && v3[1].second == "34" &&
-            v3[2].first == "ef" && v3[2].second == "56");
-
-        std::vector<std::vector<char> > v4;
-        BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v4) &&
-            v4.size() == 3 && 
-            compare(v4[0], "12") &&
-            compare(v4[1], "34") &&
-            compare(v4[2], "56"));
-
-        BOOST_TEST(test("ab12,cd34,ef56", (*alpha >> *digit) % ','));
-        BOOST_TEST(test("ab12,cd34,ef56", omit[*alpha >> *digit] % ','));
-    }
-
-    {
-        std::vector<std::vector<char> > v1;
-        BOOST_TEST(test_attr("abc,def,gh", *~char_(',') % ',', v1) &&
-            v1.size() == 3 && 
-            compare(v1[0], "abc") && 
-            compare(v1[1], "def") && 
-            compare(v1[2], "gh"));
-
-        std::vector<std::string> v2;
-        BOOST_TEST(test_attr("abc,def,gh", *~char_(',') % ',', v2) && 
-            v2.size() == 3 && v2[0] == "abc" && v2[1] == "def" && v2[2] == "gh");
-
-        BOOST_TEST(test("abc,def,gh", *~char_(',') % ','));
-        BOOST_TEST(test("abc,def,gh", omit[*~char_(',')] % ','));
-    }
-
-    {
-        std::vector<char> v1;
-        BOOST_TEST(test_attr("a", char_ >> -(char_ % ','), v1) &&
-            compare(v1, "a"));
-        v1.clear();
-        BOOST_TEST(test_attr("ab,c", char_ >> -(char_ % ','), v1) &&
-            compare(v1, "abc"));
-        v1.clear();
-        BOOST_TEST(test_attr("a", char_ >> -char_, v1) &&
-            compare(v1, "a"));
-        v1.clear();
-        BOOST_TEST(test_attr("ab", char_ >> -char_, v1) &&
-            compare(v1, "ab"));
-
-        std::vector<boost::optional<char> > v2;
-        BOOST_TEST(test_attr("a", char_ >> -char_, v2) &&
-            v2.size() == 2 && 
-            boost::get<char>(v2[0]) == 'a' && 
-            !v2[1]);
-        v2.clear();
-        BOOST_TEST(test_attr("ab", char_ >> -char_, v2) &&
-            v2.size() == 2 && 
-            boost::get<char>(v2[0]) == 'a' && 
-            boost::get<char>(v2[1]) == 'b');
-
-        std::string s;
-        BOOST_TEST(test_attr("a", char_ >> -(char_ % ','), s) &&
-            s == "a");
-        s.clear();
-        BOOST_TEST(test_attr("ab,c", char_ >> -(char_ % ','), s) &&
-            s == "abc");
-        s.clear();
-        BOOST_TEST(test_attr("ab", char_ >> -char_, s) &&
-            s == "ab");
-        s.clear();
-        BOOST_TEST(test_attr("a", char_ >> -char_, s) &&
-            s ==  "a");
-
-        BOOST_TEST(test("a", char_ >> -(char_ % ',')));
-        BOOST_TEST(test("ab,c", char_ >> -(char_ % ',')));
-        BOOST_TEST(test("a", char_ >> -char_));
-        BOOST_TEST(test("ab", char_ >> -char_));
-    }
-
-    {
-        using boost::spirit::qi::eps;
-
-        std::vector<char> v;
-        BOOST_TEST(test_attr("a", char_ >> ((char_ % ',') | eps), v) &&
-            compare(v, "a"));
-        v.clear();
-        BOOST_TEST(test_attr("ab,c", char_ >> ((char_ % ',') | eps), v) &&
-            compare(v, "abc"));
-
-        std::string s;
-        BOOST_TEST(test_attr("a", char_ >> ((char_ % ',') | eps), s) &&
-            s == "a");
-        s.clear();
-        BOOST_TEST(test_attr("ab,c", char_ >> ((char_ % ',') | eps), s) &&
-            s == "abc");
-
-        BOOST_TEST(test("a", char_ >> ((char_ % ',') | eps)));
-        BOOST_TEST(test("ab,c", char_ >> ((char_ % ',') | eps)));
-    }
-
-    {
-        std::vector<char> v1;
-        BOOST_TEST(test_attr("abc1,abc2", 
-                *~char_(',') >> *(',' >> *~char_(',')), v1) &&
-            compare(v1, "abc1abc2"));
-
-        std::vector<std::string> v2;
-        BOOST_TEST(test_attr("abc1,abc2", 
-                *~char_(',') >> *(',' >> *~char_(',')), v2) &&
-            v2.size() == 2 && 
-            v2[0] == "abc1" &&
-            v2[1] == "abc2");
-
-        std::string s;
-        BOOST_TEST(test_attr("abc1,abc2", 
-                *~char_(',') >> *(',' >> *~char_(',')), s) &&
-            s == "abc1abc2");
-    }
-
-    {
-        using boost::spirit::qi::alpha;
-        using boost::spirit::qi::digit;
-
-        std::vector<char> v1;
-        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | +digit), v1) &&
-            compare(v1, "ab1cd2"));
-        v1.clear();
-        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | digit), v1) &&
-            compare(v1, "ab1cd2"));
-
-        std::string s1;
-        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | +digit), s1) &&
-            s1 == "ab1cd2");
-        s1.clear();
-        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | digit), s1) &&
-            s1 == "ab1cd2");
-
-// doesn't work yet
-//         std::vector<std::vector<char> > v2;
-//         BOOST_TEST(test_attr("ab1cd123", *(alpha >> alpha | +digit), v2) &&
-//             v2.size() == 4 &&
-//             compare(v2[0], "ab") &&
-//             compare(v2[1], "1") &&
-//             compare(v2[2], "cd") &&
-//             compare(v2[3], "123"));
-// 
-//         std::vector<std::string> v3;
-//         BOOST_TEST(test_attr("ab1cd123", *(alpha >> alpha | +digit), v3) &&
-//             v3.size() == 4 &&
-//             v3[0] == "ab" &&
-//             v3[1] == "1" &&
-//             v3[2] == "cd" &&
-//             v3[3] == "123");
-    }
-    return boost::report_errors();
-}
-
Added: trunk/libs/spirit/test/qi/pass_container1.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/pass_container1.cpp	2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
@@ -0,0 +1,191 @@
+//  Copyright (c) 2001-2011 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <string>
+#include <vector>
+#include <set>
+#include <map>
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include <string>
+#include <iostream>
+#include "test.hpp"
+
+using namespace spirit_test;
+
+inline bool compare(std::vector<char> const& v, std::string const& s)
+{
+    return v.size() == s.size() && std::equal(v.begin(), v.end(), s.begin());
+}
+
+int main()
+{
+    using boost::spirit::qi::char_;
+    using boost::spirit::qi::omit;
+
+    {
+        std::vector<char> v;
+        BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', v) &&
+            compare(v, "abcdefgh"));
+
+        std::string s;
+        BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', s) && 
+            s == "abcdefgh");
+
+        BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ','));
+        BOOST_TEST(test("a,b,c,d,e,f,g,h", omit[char_] % ','));
+    }
+
+    {
+        std::vector<char> v1;
+        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v1) &&
+            compare(v1, "abcdefgh"));
+        v1.clear();
+        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', v1) &&
+            compare(v1, "aceg"));
+
+        std::string s;
+        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', s) && 
+            s == "abcdefgh");
+        s.clear();
+        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', s) && 
+            s == "aceg");
+
+        std::vector<std::pair<char, char> > v2;
+        BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v2) &&
+            v2.size() == 4 && 
+            v2[0] == std::make_pair('a', 'b') && 
+            v2[1] == std::make_pair('c', 'd') &&
+            v2[2] == std::make_pair('e', 'f') &&
+            v2[3] == std::make_pair('g', 'h'));
+
+        s.clear();
+        BOOST_TEST(test_attr("ab,cd,efg", (char_ >> char_) % ',' >> char_, s) &&
+            s == "abcdefg");
+
+        BOOST_TEST(test("ab,cd,ef,gh", (char_ >> char_) % ','));
+        BOOST_TEST(test("ab,cd,ef,gh", (omit[char_ >> char_]) % ','));
+    }
+
+    {
+        std::vector<char> v1;
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v1) &&
+            compare(v1, "abcdefgh"));
+        v1.clear();
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v1) &&
+            compare(v1, "adg"));
+        v1.clear();
+        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v1) &&
+            compare(v1, "bcefh"));
+
+        std::string s1;
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', s1) && 
+            s1 == "abcdefgh");
+        s1.clear();
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s1) && 
+            s1 == "adg");
+        s1.clear();
+        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', s1) && 
+            s1 == "bcefh");
+
+        std::vector<std::pair<char, std::vector<char> > > v2;
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v2) &&
+            v2.size() == 3 && 
+            v2[0].first == 'a' && compare(v2[0].second, "bc") && 
+            v2[1].first == 'd' && compare(v2[1].second, "ef") &&
+            v2[2].first == 'g' && compare(v2[2].second, "h"));
+
+        std::vector<std::vector<char> > v3;
+        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v3) &&
+            v3.size() == 3 && 
+            compare(v3[0], "bc") && compare(v3[1], "ef") &&
+            compare(v3[2], "h"));
+
+        std::vector<char> v4;
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v4) &&
+            v4.size() == 3 && 
+            v4[0] == 'a' &&  v4[1] == 'd' && v4[2] == 'g');
+
+        std::vector<std::string> v5;
+        BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v5) &&
+            v5.size() == 3 && 
+            v5[0] == "bc" && v5[1] == "ef" && v5[2] == "h");
+
+        std::string s2;
+        BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s2) &&
+            s2.size() == 3 && 
+            s2 == "adg");
+
+        BOOST_TEST(test("abc,def,gh", (char_ >> *~char_(',')) % ','));
+        BOOST_TEST(test("abc,def,gh", (omit[char_ >> *~char_(',')]) % ','));
+    }
+
+    {
+        using boost::spirit::qi::alpha;
+        using boost::spirit::qi::digit;
+
+        std::vector<char> v1;
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v1) &&
+            compare(v1, "ab12cd34ef56"));
+        v1.clear();
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v1) &&
+            compare(v1, "123456"));
+        v1.clear();
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', v1) &&
+            compare(v1, "abcdef"));
+
+        std::string s1;
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', s1) &&
+            s1 == "ab12cd34ef56");
+        s1.clear();
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', s1) &&
+            s1 == "123456");
+        s1.clear();
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', s1) &&
+            s1 == "abcdef");
+
+        std::vector<std::pair<std::vector<char>, std::vector<char> > > v2;
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v2) &&
+            v2.size() == 3 && 
+            compare(v2[0].first, "ab") && compare(v2[0].second, "12") &&
+            compare(v2[1].first, "cd") && compare(v2[1].second, "34") &&
+            compare(v2[2].first, "ef") && compare(v2[2].second, "56"));
+
+        std::vector<std::pair<std::string, std::string> > v3;
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v3) &&
+            v3.size() == 3 && 
+            v3[0].first == "ab" && v3[0].second == "12" &&
+            v3[1].first == "cd" && v3[1].second == "34" &&
+            v3[2].first == "ef" && v3[2].second == "56");
+
+        std::vector<std::vector<char> > v4;
+        BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v4) &&
+            v4.size() == 3 && 
+            compare(v4[0], "12") &&
+            compare(v4[1], "34") &&
+            compare(v4[2], "56"));
+
+        BOOST_TEST(test("ab12,cd34,ef56", (*alpha >> *digit) % ','));
+        BOOST_TEST(test("ab12,cd34,ef56", omit[*alpha >> *digit] % ','));
+    }
+
+    return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/qi/pass_container2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/pass_container2.cpp	2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
@@ -0,0 +1,184 @@
+//  Copyright (c) 2001-2011 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <string>
+#include <vector>
+#include <set>
+#include <map>
+#include <iostream>
+
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+inline bool compare(std::vector<char> const& v, std::string const& s)
+{
+    return v.size() == s.size() && std::equal(v.begin(), v.end(), s.begin());
+}
+
+int main()
+{
+    using boost::spirit::qi::char_;
+    using boost::spirit::qi::omit;
+
+    {
+        std::vector<std::vector<char> > v1;
+        BOOST_TEST(test_attr("abc,def,gh", *~char_(',') % ',', v1) &&
+            v1.size() == 3 && 
+            compare(v1[0], "abc") && 
+            compare(v1[1], "def") && 
+            compare(v1[2], "gh"));
+
+        std::vector<std::string> v2;
+        BOOST_TEST(test_attr("abc,def,gh", *~char_(',') % ',', v2) && 
+            v2.size() == 3 && v2[0] == "abc" && v2[1] == "def" && v2[2] == "gh");
+
+        BOOST_TEST(test("abc,def,gh", *~char_(',') % ','));
+        BOOST_TEST(test("abc,def,gh", omit[*~char_(',')] % ','));
+    }
+
+    {
+        std::vector<char> v1;
+        BOOST_TEST(test_attr("a", char_ >> -(char_ % ','), v1) &&
+            compare(v1, "a"));
+        v1.clear();
+        BOOST_TEST(test_attr("ab,c", char_ >> -(char_ % ','), v1) &&
+            compare(v1, "abc"));
+        v1.clear();
+        BOOST_TEST(test_attr("a", char_ >> -char_, v1) &&
+            compare(v1, "a"));
+        v1.clear();
+        BOOST_TEST(test_attr("ab", char_ >> -char_, v1) &&
+            compare(v1, "ab"));
+
+        std::vector<boost::optional<char> > v2;
+        BOOST_TEST(test_attr("a", char_ >> -char_, v2) &&
+            v2.size() == 2 && 
+            boost::get<char>(v2[0]) == 'a' && 
+            !v2[1]);
+        v2.clear();
+        BOOST_TEST(test_attr("ab", char_ >> -char_, v2) &&
+            v2.size() == 2 && 
+            boost::get<char>(v2[0]) == 'a' && 
+            boost::get<char>(v2[1]) == 'b');
+
+        std::string s;
+        BOOST_TEST(test_attr("a", char_ >> -(char_ % ','), s) &&
+            s == "a");
+        s.clear();
+        BOOST_TEST(test_attr("ab,c", char_ >> -(char_ % ','), s) &&
+            s == "abc");
+        s.clear();
+        BOOST_TEST(test_attr("ab", char_ >> -char_, s) &&
+            s == "ab");
+        s.clear();
+        BOOST_TEST(test_attr("a", char_ >> -char_, s) &&
+            s ==  "a");
+
+        BOOST_TEST(test("a", char_ >> -(char_ % ',')));
+        BOOST_TEST(test("ab,c", char_ >> -(char_ % ',')));
+        BOOST_TEST(test("a", char_ >> -char_));
+        BOOST_TEST(test("ab", char_ >> -char_));
+    }
+
+    {
+        using boost::spirit::qi::eps;
+
+        std::vector<char> v;
+        BOOST_TEST(test_attr("a", char_ >> ((char_ % ',') | eps), v) &&
+            compare(v, "a"));
+        v.clear();
+        BOOST_TEST(test_attr("ab,c", char_ >> ((char_ % ',') | eps), v) &&
+            compare(v, "abc"));
+
+        std::string s;
+        BOOST_TEST(test_attr("a", char_ >> ((char_ % ',') | eps), s) &&
+            s == "a");
+        s.clear();
+        BOOST_TEST(test_attr("ab,c", char_ >> ((char_ % ',') | eps), s) &&
+            s == "abc");
+
+        BOOST_TEST(test("a", char_ >> ((char_ % ',') | eps)));
+        BOOST_TEST(test("ab,c", char_ >> ((char_ % ',') | eps)));
+    }
+
+    {
+        std::vector<char> v1;
+        BOOST_TEST(test_attr("abc1,abc2", 
+                *~char_(',') >> *(',' >> *~char_(',')), v1) &&
+            compare(v1, "abc1abc2"));
+
+        std::vector<std::string> v2;
+        BOOST_TEST(test_attr("abc1,abc2", 
+                *~char_(',') >> *(',' >> *~char_(',')), v2) &&
+            v2.size() == 2 && 
+            v2[0] == "abc1" &&
+            v2[1] == "abc2");
+
+        std::string s;
+        BOOST_TEST(test_attr("abc1,abc2", 
+                *~char_(',') >> *(',' >> *~char_(',')), s) &&
+            s == "abc1abc2");
+    }
+
+    {
+        using boost::spirit::qi::alpha;
+        using boost::spirit::qi::digit;
+
+        std::vector<char> v1;
+        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | +digit), v1) &&
+            compare(v1, "ab1cd2"));
+        v1.clear();
+        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | digit), v1) &&
+            compare(v1, "ab1cd2"));
+
+        std::string s1;
+        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | +digit), s1) &&
+            s1 == "ab1cd2");
+        s1.clear();
+        BOOST_TEST(test_attr("ab1cd2", *(alpha >> alpha | digit), s1) &&
+            s1 == "ab1cd2");
+
+// doesn't work yet
+//         std::vector<std::vector<char> > v2;
+//         BOOST_TEST(test_attr("ab1cd123", *(alpha >> alpha | +digit), v2) &&
+//             v2.size() == 4 &&
+//             compare(v2[0], "ab") &&
+//             compare(v2[1], "1") &&
+//             compare(v2[2], "cd") &&
+//             compare(v2[3], "123"));
+// 
+//         std::vector<std::string> v3;
+//         BOOST_TEST(test_attr("ab1cd123", *(alpha >> alpha | +digit), v3) &&
+//             v3.size() == 4 &&
+//             v3[0] == "ab" &&
+//             v3[1] == "1" &&
+//             v3[2] == "cd" &&
+//             v3[3] == "123");
+    }
+
+    {
+    }
+
+    return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/qi/pass_container3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/pass_container3.cpp	2011-03-03 13:49:26 EST (Thu, 03 Mar 2011)
@@ -0,0 +1,46 @@
+//  Copyright (c) 2001-2011 Hartmut Kaiser
+// 
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// compilation test only
+
+#include <string>
+#include <vector>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+
+#include <boost/variant.hpp>
+
+//////////////////////////////////////////////////////////////////////////////
+struct ast; // Forward declaration
+
+typedef boost::variant<
+    double, char, int, std::string, boost::recursive_wrapper<ast>
+> ast_element;
+
+struct ast 
+{
+    int op; 
+    std::vector<ast_element> children;
+    ast() {} 
+};
+
+BOOST_FUSION_ADAPT_STRUCT(
+    ast,
+    (int, op)
+    (std::vector<ast_element>, children)
+)
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+    namespace qi = boost::spirit::qi;
+
+    qi::rule<char const*, ast()> num_expr;
+    num_expr = (*(qi::char_ >> num_expr))[ qi::_1 ];
+
+    return 0;
+}
+