$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78601 - in branches/release/boost/msm: . back front front/detail front/euml mpl_graph
From: christophe.j.henry_at_[hidden]
Date: 2012-05-24 15:38:49
Author: chenry
Date: 2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
New Revision: 78601
URL: http://svn.boost.org/trac/boost/changeset/78601
Log:
merged rev. 76655-78475
Properties modified: 
   branches/release/boost/msm/   (props changed)
   branches/release/boost/msm/active_state_switching_policies.hpp   (props changed)
   branches/release/boost/msm/back/   (props changed)
   branches/release/boost/msm/back/args.hpp   (props changed)
   branches/release/boost/msm/back/bind_helpers.hpp   (props changed)
   branches/release/boost/msm/back/common_types.hpp   (props changed)
   branches/release/boost/msm/back/copy_policies.hpp   (props changed)
   branches/release/boost/msm/back/default_compile_policy.hpp   (props changed)
   branches/release/boost/msm/back/dispatch_table.hpp   (props changed)
   branches/release/boost/msm/back/favor_compile_time.hpp   (contents, props changed)
   branches/release/boost/msm/back/fold_to_list.hpp   (props changed)
   branches/release/boost/msm/back/history_policies.hpp   (props changed)
   branches/release/boost/msm/back/metafunctions.hpp   (contents, props changed)
   branches/release/boost/msm/back/mpl_graph_fsm_check.hpp   (props changed)
   branches/release/boost/msm/back/no_fsm_check.hpp   (props changed)
   branches/release/boost/msm/back/queue_container_circular.hpp   (props changed)
   branches/release/boost/msm/back/queue_container_deque.hpp   (props changed)
   branches/release/boost/msm/back/state_machine.hpp   (contents, props changed)
   branches/release/boost/msm/back/tools.hpp   (props changed)
   branches/release/boost/msm/common.hpp   (contents, props changed)
   branches/release/boost/msm/front/   (props changed)
   branches/release/boost/msm/front/common_states.hpp   (props changed)
   branches/release/boost/msm/front/completion_event.hpp   (props changed)
   branches/release/boost/msm/front/detail/   (props changed)
   branches/release/boost/msm/front/detail/common_states.hpp   (props changed)
   branches/release/boost/msm/front/detail/row2_helper.hpp   (props changed)
   branches/release/boost/msm/front/euml/   (props changed)
   branches/release/boost/msm/front/euml/algorithm.hpp   (props changed)
   branches/release/boost/msm/front/euml/common.hpp   (contents, props changed)
   branches/release/boost/msm/front/euml/container.hpp   (contents, props changed)
   branches/release/boost/msm/front/euml/euml.hpp   (props changed)
   branches/release/boost/msm/front/euml/euml_typeof.hpp   (props changed)
   branches/release/boost/msm/front/euml/guard_grammar.hpp   (props changed)
   branches/release/boost/msm/front/euml/iteration.hpp   (props changed)
   branches/release/boost/msm/front/euml/operator.hpp   (contents, props changed)
   branches/release/boost/msm/front/euml/phoenix_placeholders.hpp   (props changed)
   branches/release/boost/msm/front/euml/querying.hpp   (props changed)
   branches/release/boost/msm/front/euml/state_grammar.hpp   (contents, props changed)
   branches/release/boost/msm/front/euml/stl.hpp   (props changed)
   branches/release/boost/msm/front/euml/stt_grammar.hpp   (props changed)
   branches/release/boost/msm/front/euml/transformation.hpp   (contents, props changed)
   branches/release/boost/msm/front/functor_row.hpp   (props changed)
   branches/release/boost/msm/front/internal_row.hpp   (props changed)
   branches/release/boost/msm/front/row2.hpp   (props changed)
   branches/release/boost/msm/front/state_machine_def.hpp   (contents, props changed)
   branches/release/boost/msm/front/states.hpp   (contents, props changed)
   branches/release/boost/msm/mpl_graph/   (props changed)
   branches/release/boost/msm/msm_grammar.hpp   (contents, props changed)
   branches/release/boost/msm/proto_config.hpp   (props changed)
   branches/release/boost/msm/row_tags.hpp   (props changed)
Text files modified: 
   branches/release/boost/msm/back/favor_compile_time.hpp   |     2                                         
   branches/release/boost/msm/back/metafunctions.hpp        |    13 ++                                      
   branches/release/boost/msm/back/state_machine.hpp        |   186 ++++++++++++++++++++++++--------------- 
   branches/release/boost/msm/common.hpp                    |     2                                         
   branches/release/boost/msm/front/euml/common.hpp         |   122 +++++++++-----------------              
   branches/release/boost/msm/front/euml/container.hpp      |   102 ++++++++++----------                    
   branches/release/boost/msm/front/euml/operator.hpp       |    20 ++--                                    
   branches/release/boost/msm/front/euml/state_grammar.hpp  |    25 +++--                                   
   branches/release/boost/msm/front/euml/transformation.hpp |     8                                         
   branches/release/boost/msm/front/state_machine_def.hpp   |     3                                         
   branches/release/boost/msm/front/states.hpp              |    11 +                                       
   branches/release/boost/msm/msm_grammar.hpp               |    40 ++++++++                                
   12 files changed, 301 insertions(+), 233 deletions(-)
Modified: branches/release/boost/msm/back/favor_compile_time.hpp
==============================================================================
--- branches/release/boost/msm/back/favor_compile_time.hpp	(original)
+++ branches/release/boost/msm/back/favor_compile_time.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -108,7 +108,7 @@
         std::deque<cell> one_state;
     };
     template <class TransitionState>
-    static HandledEnum call_submachine(Fsm& fsm, int region, int state, Event const& evt)
+    static HandledEnum call_submachine(Fsm& fsm, int , int , Event const& evt)
     {
         return (fsm.template get_state<TransitionState&>()).process_any_event( ::boost::any(evt));
     }
Modified: branches/release/boost/msm/back/metafunctions.hpp
==============================================================================
--- branches/release/boost/msm/back/metafunctions.hpp	(original)
+++ branches/release/boost/msm/back/metafunctions.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -632,11 +632,22 @@
         ::boost::mpl::bool_<false> >::type type;
 };
 
+// builds flags (add internal_flag_list and flag_list). internal_flag_list is used for terminate/interrupt states
+template <class StateType>
+struct get_flag_list 
+{
+    typedef typename ::boost::mpl::insert_range< 
+        typename StateType::flag_list, 
+        typename ::boost::mpl::end< typename StateType::flag_list >::type,
+        typename StateType::internal_flag_list
+    >::type type;
+};
+
 template <class StateType>
 struct is_state_blocking 
 {
     typedef typename ::boost::mpl::fold<
-        typename StateType::flag_list, ::boost::mpl::set<>,
+        typename get_flag_list<StateType>::type, ::boost::mpl::set<>,
         ::boost::mpl::if_<
                  has_event_blocking_flag< ::boost::mpl::placeholders::_2>,
                  ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2 >, 
Modified: branches/release/boost/msm/back/state_machine.hpp
==============================================================================
--- branches/release/boost/msm/back/state_machine.hpp	(original)
+++ branches/release/boost/msm/back/state_machine.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -52,6 +52,7 @@
 
 #include <boost/msm/active_state_switching_policies.hpp>
 #include <boost/msm/row_tags.hpp>
+#include <boost/msm/msm_grammar.hpp>
 #include <boost/msm/back/fold_to_list.hpp>
 #include <boost/msm/back/metafunctions.hpp>
 #include <boost/msm/back/history_policies.hpp>
@@ -73,6 +74,7 @@
 BOOST_MPL_HAS_XXX_TRAIT_DEF(fsm_check)
 BOOST_MPL_HAS_XXX_TRAIT_DEF(compile_policy)
 BOOST_MPL_HAS_XXX_TRAIT_DEF(queue_container_policy)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(using_declared_table)
 
 #ifndef BOOST_MSM_CONSTRUCTOR_ARG_SIZE
 #define BOOST_MSM_CONSTRUCTOR_ARG_SIZE 5 // default max number of arguments for constructors
@@ -120,7 +122,16 @@
     >
 > state_machine_signature;
 
-
+// just here to disable use of proto when not needed
+template <class T, class F,class Enable=void>
+struct make_euml_terminal;
+template <class T,class F>
+struct make_euml_terminal<T,F,typename ::boost::disable_if<has_using_declared_table<F> >::type>
+{};
+template <class T,class F>
+struct make_euml_terminal<T,F,typename ::boost::enable_if<has_using_declared_table<F> >::type>
+    : public proto::extends<typename proto::terminal< boost::msm::state_tag>::type, T, boost::msm::state_domain>
+{};
 
 // library-containing class for state machines.  Pass the actual FSM class as
 // the Concrete parameter.
@@ -136,6 +147,11 @@
     public ::boost::parameter::binding<
             typename state_machine_signature::bind<A0,A1,A2,A3,A4>::type, ::boost::msm::back::tag::front_end
     >::type
+    , public make_euml_terminal<state_machine<A0,A1,A2,A3,A4>,
+                         typename ::boost::parameter::binding<
+                                    typename state_machine_signature::bind<A0,A1,A2,A3,A4>::type, ::boost::msm::back::tag::front_end
+                         >::type   
+      >
 {
 public:
     // Create ArgumentPack
@@ -170,7 +186,8 @@
     typedef ::boost::function<
         execute_return () >                         deferred_fct;
     typedef typename QueueContainerPolicy::
-        template In<deferred_fct>::type             deferred_events_queue_t;
+        template In< 
+        std::pair<deferred_fct,bool> >::type        deferred_events_queue_t;
     typedef typename QueueContainerPolicy::
         template In<transition_fct>::type           events_queue_t;
 
@@ -255,7 +272,7 @@
     {
     public:
         deferred_msg_queue_helper():m_deferred_events_queue(){}
-        deferred_events_queue_t     m_deferred_events_queue;
+        deferred_events_queue_t         m_deferred_events_queue;
     };
 
  public: 
@@ -996,10 +1013,11 @@
         // Take the transition action and return the next state.
         static HandledEnum execute(library_sm& fsm, int region_index, int , transition_event const& evt)
         {
-             execute_return res = 
-                (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list)).process_event(evt); 
-             fsm.m_states[region_index]=get_state_id<stt,T1>::type::value;
-             return res;
+            // false as second parameter because this event is forwarded from outer fsm
+            execute_return res = 
+                (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list)).process_event_internal(evt,false); 
+            fsm.m_states[region_index]=get_state_id<stt,T1>::type::value;
+            return res;
         }
         // helper metafunctions used by dispatch table and give the frow a new event
         // (used to avoid double entries in a table because of base events)
@@ -1232,50 +1250,11 @@
         do_exit(finalEvent,*this);
     }
 
-    // Main function used by clients of the derived FSM to make
-    // transitions. Can also be called for internally (for example in an action method) generated events.
+    // Main function used by clients of the derived FSM to make transitions.
     template<class Event>
     execute_return process_event(Event const& evt)
     {
-        HandledEnum ret_handled=HANDLED_FALSE;
-        // if the state machine has terminate or interrupt flags, check them, otherwise skip
-        if (is_event_handling_blocked_helper<Event>
-                ( ::boost::mpl::bool_<has_fsm_blocking_states<library_sm>::type::value>() ) )
-            return HANDLED_TRUE;
-        // if a message queue is needed and processing is on the way
-        if (!do_pre_msg_queue_helper<Event>
-                (evt,::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>()) )
-        {
-            // wait for the end of current processing
-            return HANDLED_TRUE;
-        }
-        else
-        {
-            // prepare the next deferred event for handling
-            // if one defer is found in the SM, otherwise skip
-            handle_defer_helper<library_sm> defer_helper(m_deferred_events_queue);
-            defer_helper.do_pre_handle_deferred();
-            // process event
-            HandledEnum handled = this->do_process_helper<Event>
-                (evt,::boost::mpl::bool_<is_no_exception_thrown<library_sm>::type::value>());
-            if (handled)
-            {
-                ret_handled = handled;
-            }
-
-            // process completion transitions BEFORE any other event in the pool (UML Standard 2.3 §15.3.14)
-            handle_eventless_transitions_helper<library_sm> eventless_helper(this,(handled == HANDLED_TRUE));
-            eventless_helper.process_completion_event();
-
-            // after handling, take care of the deferred events
-            defer_helper.do_post_handle_deferred(handled);
-
-            // now check if some events were generated in a transition and was not handled
-            // because of another processing, and if yes, start handling them
-            do_post_msg_queue_helper(::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>());
-
-            return ret_handled;
-        }       
+        return process_event_internal(evt,true);
     }
 
     template <class EventType>
@@ -1748,16 +1727,16 @@
     }
     // the following 2 functions handle the processing either with a try/catch protection or without
     template <class StateType,class EventType>
-    HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::true_ const &)
+    HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::true_ const &, bool is_direct_call)
     {
-        return this->do_process_event(evt);
+        return this->do_process_event(evt,is_direct_call);
     }
     template <class StateType,class EventType>
-    HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::false_ const &)
+    HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::false_ const &, bool is_direct_call)
     {
         try
         {
-            return this->do_process_event(evt);
+            return this->do_process_event(evt,is_direct_call);
         }
         catch (std::exception& e)
         {
@@ -1789,24 +1768,40 @@
             events_queue(a_queue),next_deferred_event(){}
         void do_pre_handle_deferred()
         {
-            if (!events_queue.m_deferred_events_queue.empty())
-            {
-                next_deferred_event = events_queue.m_deferred_events_queue.back();
-                events_queue.m_deferred_events_queue.pop_back();
-            }
         }
 
         void do_post_handle_deferred(HandledEnum handled)
         {
-            if (((handled & HANDLED_DEFERRED) == HANDLED_DEFERRED) && next_deferred_event )
+            if (handled == HANDLED_TRUE)
             {
-                // the event was already deferred, no reason to process another deferred event
-                events_queue.m_deferred_events_queue.push_back(next_deferred_event);
-                return;
+                // a transition has been taken, it makes sense again to try processing waiting deferred events
+                // reset all events to not tested 
+                for (std::size_t i = 0; i < events_queue.m_deferred_events_queue.size(); ++i)
+                {
+                    events_queue.m_deferred_events_queue[i].second=false;
+                }
+                // test first event
+                if (!events_queue.m_deferred_events_queue.empty())
+                {
+                    deferred_fct next = events_queue.m_deferred_events_queue.front().first;
+                    events_queue.m_deferred_events_queue.pop_front();
+                    next();
+                }
             }
-            else if (next_deferred_event)
+            else
             {
-                next_deferred_event();
+                // look for next deferred event, if any
+                typename deferred_events_queue_t::iterator it = 
+                    std::find_if(events_queue.m_deferred_events_queue.begin(),
+                                 events_queue.m_deferred_events_queue.end(),
+                                 boost::bind(&std::pair<deferred_fct,bool>::second, _1) == false);
+                if (it != events_queue.m_deferred_events_queue.end())
+                {
+                    (*it).second = true;
+                    deferred_fct next = (*it).first;
+                    events_queue.m_deferred_events_queue.erase(it);
+                    next();
+                }
             }
         }
 
@@ -1945,9 +1940,55 @@
         HandledEnum&    result;
     };
 
+    // Main function used internally to make transitions
+    // Can only be called for internally (for example in an action method) generated events.
+    template<class Event>
+    execute_return process_event_internal(Event const& evt, bool is_direct_call)
+    {
+        HandledEnum ret_handled=HANDLED_FALSE;
+        // if the state machine has terminate or interrupt flags, check them, otherwise skip
+        if (is_event_handling_blocked_helper<Event>
+                ( ::boost::mpl::bool_<has_fsm_blocking_states<library_sm>::type::value>() ) )
+            return HANDLED_TRUE;
+        // if a message queue is needed and processing is on the way
+        if (!do_pre_msg_queue_helper<Event>
+                (evt,::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>()) )
+        {
+            // wait for the end of current processing
+            return HANDLED_TRUE;
+        }
+        else
+        {
+            // prepare the next deferred event for handling
+            // if one defer is found in the SM, otherwise skip
+            handle_defer_helper<library_sm> defer_helper(m_deferred_events_queue);
+            defer_helper.do_pre_handle_deferred();
+            // process event
+            HandledEnum handled = this->do_process_helper<Event>
+                (evt,::boost::mpl::bool_<is_no_exception_thrown<library_sm>::type::value>(),is_direct_call);
+            if (handled)
+            {
+                ret_handled = handled;
+            }
+
+            // process completion transitions BEFORE any other event in the pool (UML Standard 2.3 §15.3.14)
+            handle_eventless_transitions_helper<library_sm> eventless_helper(this,(handled == HANDLED_TRUE));
+            eventless_helper.process_completion_event();
+
+            // after handling, take care of the deferred events
+            defer_helper.do_post_handle_deferred(handled);
+
+            // now check if some events were generated in a transition and was not handled
+            // because of another processing, and if yes, start handling them
+            do_post_msg_queue_helper(::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>());
+
+            return ret_handled;
+        }       
+    }
+
     // minimum event processing without exceptions, queues, etc.
     template<class Event>
-    HandledEnum do_process_event(Event const& evt)
+    HandledEnum do_process_event(Event const& evt, bool is_direct_call)
     {
         HandledEnum handled = HANDLED_FALSE;
         // dispatch the event to every region
@@ -1957,9 +1998,10 @@
         // if the event has not been handled and we have orthogonal zones, then
         // generate an error on every active state 
         // for state machine states contained in other state machines, do not handle
-        // but let the containing sm handle the error
+        // but let the containing sm handle the error, unless the event was generated in this fsm 
+        // (by calling process_event on this fsm object, is_direct_call == true)
         // completion events do not produce an error
-        if (!handled && !is_contained() && !is_completion_event<Event>::type::value)
+        if ( (!is_contained() || is_direct_call) && !handled && !is_completion_event<Event>::type::value)
         {
             for (int i=0; i<nr_regions::value;++i)
             {
@@ -1988,16 +2030,18 @@
     }
 
 #define MSM_COMPOSITE_ACCEPT_SUB(z, n, unused) ARG ## n vis ## n
+#define MSM_COMPOSITE_ACCEPT_SUB2(z, n, unused) boost::ref( vis ## n )
 #define MSM_COMPOSITE_ACCEPT_EXECUTE(z, n, unused)                                      \
         template <BOOST_PP_ENUM_PARAMS(n, class ARG)>                                   \
         void composite_accept(BOOST_PP_ENUM(n, MSM_COMPOSITE_ACCEPT_SUB, ~ ) )               \
         {                                                                               \
             this->accept(BOOST_PP_ENUM_PARAMS(n,vis));                                        \
-            this->visit_current_states(BOOST_PP_ENUM_PARAMS(n,vis));                          \
+            this->visit_current_states(BOOST_PP_ENUM(n,MSM_COMPOSITE_ACCEPT_SUB2, ~));        \
         }
         BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_COMPOSITE_ACCEPT_EXECUTE, ~)
 #undef MSM_COMPOSITE_ACCEPT_EXECUTE
 #undef MSM_COMPOSITE_ACCEPT_SUB
+#undef MSM_COMPOSITE_ACCEPT_SUB2
 
     // helper used to call the init states at the start of the state machine
     template <class Event>
@@ -2080,7 +2124,7 @@
         template <class StateType>
         void operator()( ::boost::msm::wrap<StateType> const& )
         {
-            typedef typename StateType::flag_list flags;
+            typedef typename get_flag_list<StateType>::type flags;
             typedef typename ::boost::mpl::contains<flags,Flag >::type found;
             typedef typename is_composite_state<StateType>::type composite;
 
@@ -2405,7 +2449,7 @@
          {
              typedef typename build_orthogonal_regions<
                  library_sm,
-                 typename Derived::initial_state 
+                 initial_states 
              >::type all_regions;
              enum {region_index= find_region_index<all_regions,StateType>::value };
          };         
@@ -2477,6 +2521,8 @@
              // entry on the FSM
              (static_cast<Derived*>(self))->on_entry(evt,fsm);
              int state_id = get_state_id<stt,typename EventType::active_state::wrapped_entry>::value;
+             BOOST_STATIC_ASSERT(find_region_id<typename EventType::active_state::wrapped_entry>::region_index >= 0);
+             BOOST_STATIC_ASSERT(find_region_id<typename EventType::active_state::wrapped_entry>::region_index < nr_regions::value);
              // given region starts with the entry pseudo state as active state
              self->m_states[find_region_id<typename EventType::active_state::wrapped_entry>::region_index] = state_id;
              self->internal_start(evt.m_event);
@@ -2600,7 +2646,7 @@
     // puts a deferred event in the queue
     void post_deferred_event(deferred_fct& deferred)
     {
-        m_deferred_events_queue.m_deferred_events_queue.push_front(deferred);
+        m_deferred_events_queue.m_deferred_events_queue.push_back(std::make_pair(deferred,true));
     }
     // removes one event from the message queue and processes it
     template <class StateType>
Modified: branches/release/boost/msm/common.hpp
==============================================================================
--- branches/release/boost/msm/common.hpp	(original)
+++ branches/release/boost/msm/common.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -11,8 +11,6 @@
 #ifndef BOOST_MSM_COMMON_H
 #define BOOST_MSM_COMMON_H
 
-
-
 namespace boost { namespace msm
 {
 // wrapper for mpl::for_each as showed in the C++ Template Metaprogramming ch. 9
Modified: branches/release/boost/msm/front/euml/common.hpp
==============================================================================
--- branches/release/boost/msm/front/euml/common.hpp	(original)
+++ branches/release/boost/msm/front/euml/common.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -183,51 +183,12 @@
     typedef typename T::event_name type;
 };
 
-// grammar forbidding address of for terminals
-struct terminal_grammar : proto::not_<proto::address_of<proto::_> >
-{};
-
-// Forward-declare an expression wrapper
-template<typename Expr>
-struct euml_terminal;
-
-struct sm_domain
-    : proto::domain< proto::generator<euml_terminal>, terminal_grammar, boost::msm::msm_domain >
-{};
-
-struct state_grammar : 
-    proto::and_<
-        proto::not_<proto::address_of<proto::_> >,
-        proto::not_<proto::shift_right<proto::_,proto::_> >,
-        proto::not_<proto::shift_left<proto::_,proto::_> >,
-        proto::not_<proto::bitwise_and<proto::_,proto::_> >
-    >
-{};
-struct state_domain
-    : proto::domain< proto::generator<euml_terminal>, state_grammar,sm_domain >
-{};
-
-template<typename Expr>
-struct euml_terminal
-    : proto::extends<Expr, euml_terminal<Expr>, sm_domain>
-{
-    typedef
-        proto::extends<Expr, euml_terminal<Expr>, sm_domain>
-        base_type;
-    // Needs a constructor
-    euml_terminal(Expr const &e = Expr())
-        : base_type(e)
-    {}
-    // Unhide Proto's overloaded assignment operator
-    using base_type::operator=;
-};
-
 template <class EVT>
-struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT, sm_domain>
+struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain>
 {
     typedef event_tag euml_tag_type;
     typedef EVT event_name;
-    using proto::extends<typename proto::terminal<event_tag>::type, EVT, sm_domain>::operator=;
+    using proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -239,10 +200,10 @@
     };
 };
 template <class STATE>
-struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, state_domain>
+struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain>
 {
     typedef state_tag euml_tag_type;
-    using proto::extends<typename proto::terminal<state_tag>::type, STATE, state_domain>::operator=;
+    using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
         ,class Arg6 
@@ -254,22 +215,22 @@
     };
 };
 template <class STATE>
-struct euml_state: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, state_domain>
+struct euml_state: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain>
 {
     typedef state_tag euml_tag_type;
     typedef int not_intern_euml_state;
-    using proto::extends<typename proto::terminal<state_tag>::type, STATE, state_domain>::operator=;
+    using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=;
     struct In
     {
         typedef STATE type;
     };
 };
 template <class ACTION>
-struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, sm_domain>
+struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain>
 {
     typedef action_tag euml_tag_type;
     typedef ACTION action_name;
-    using proto::extends<typename proto::terminal<action_tag>::type, ACTION, sm_domain>::operator=;
+    using proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -281,10 +242,10 @@
     };
 };
 template <class FLAG>
-struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, sm_domain>
+struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain>
 {
     typedef flag_tag euml_tag_type;
-    using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, sm_domain>::operator=;
+    using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -297,10 +258,10 @@
 };
 
 template <class CONFIG>
-struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, sm_domain>
+struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain>
 {
     typedef config_tag euml_tag_type;
-    using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, sm_domain>::operator=;
+    using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -441,7 +402,7 @@
         return src;
     }
 };
-struct GetSource_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetSource_Helper, sm_domain>
+struct GetSource_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetSource_Helper, boost::msm::sm_domain>
 {
     GetSource_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -491,7 +452,7 @@
         return tgt;
     }
 };
-struct GetTarget_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetTarget_Helper, sm_domain>
+struct GetTarget_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetTarget_Helper, boost::msm::sm_domain>
 {
     GetTarget_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -543,7 +504,7 @@
         return state;
     }
 };
-struct GetState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetState_Helper, sm_domain>
+struct GetState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetState_Helper, boost::msm::sm_domain>
 {
     GetState_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -618,7 +579,7 @@
         return evt;
     }
 };
-struct GetEvent_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetEvent_Helper, sm_domain>
+struct GetEvent_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetEvent_Helper, boost::msm::sm_domain>
 {
     GetEvent_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -688,12 +649,12 @@
     }
     template <class EVT,class FSM,class SourceState,class TargetState>
     typename transition_action_result<EVT,FSM,SourceState,TargetState>::type 
-        operator()(EVT const& evt ,FSM& fsm,SourceState& ,TargetState&)const
+        operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const
     {
         return fsm;
     }
 };
-struct GetFsm_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetFsm_Helper, sm_domain>
+struct GetFsm_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetFsm_Helper, boost::msm::sm_domain>
 {
     GetFsm_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -764,10 +725,10 @@
     }
 };
 
-struct SubState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, sm_domain>
+struct SubState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain>
 {
     SubState_Helper(){}
-    using proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -827,7 +788,7 @@
     }
 };
 
-struct GetAttribute_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetAttribute_Helper, sm_domain>
+struct GetAttribute_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetAttribute_Helper, boost::msm::sm_domain>
 {
     GetAttribute_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1391,10 +1352,10 @@
 };
 
 struct process_tag {};
-struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, sm_domain>
+struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain>
 {
     Process_Helper(){}
-    using proto::extends< proto::terminal<process_tag>::type, Process_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -1562,10 +1523,10 @@
     }
 };
 struct reprocess_tag {};
-struct Reprocess_Helper: proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, sm_domain>
+struct Reprocess_Helper: proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain>
 {
     Reprocess_Helper(){}
-    using proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -1700,10 +1661,10 @@
 };
 
 struct process2_tag {};
-struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, sm_domain>
+struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain>
 {
     Process2_Helper(){}
-    using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -1781,7 +1742,7 @@
     }
 };
 
-struct Get_Flag_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, Get_Flag_Helper, sm_domain>
+struct Get_Flag_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, Get_Flag_Helper, boost::msm::sm_domain>
 {
     Get_Flag_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1806,10 +1767,10 @@
         fsm.defer_event(evt);
     }
 };
-struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, sm_domain>
+struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain>
 {
     Defer_Helper(){}
-    using proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -1823,10 +1784,10 @@
 Defer_Helper const defer_ = Defer_Helper();
 
 struct explicit_tag {};
-struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, sm_domain>
+struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain>
 {
     Explicit_Helper(){}
-    using proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -1840,10 +1801,10 @@
 Explicit_Helper const explicit_ = Explicit_Helper();
 
 struct entry_pt_tag {};
-struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, sm_domain>
+struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain>
 {
     Entry_Pt_Helper(){}
-    using proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -1857,10 +1818,10 @@
 Entry_Pt_Helper const entry_pt_ = Entry_Pt_Helper();
 
 struct exit_pt_tag {};
-struct Exit_Pt_Helper : proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, sm_domain>
+struct Exit_Pt_Helper : proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain>
 {
     Exit_Pt_Helper(){}
-    using proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -2039,7 +2000,7 @@
         ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} };                  \
         struct function_name ## tag{};                                                                  \
         struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type,       \
-        functor ## Helper , sm_domain> { functor ## Helper(){}                                          \
+        functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){}                              \
         template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6>                    \
         struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; };                           \
         functor ## Helper const function_name = functor ## Helper ();
@@ -2183,14 +2144,14 @@
         ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt),Param6()(evt,fsm,src,tgt));}               \
         template <class Event,class FSM,class STATE>                                                    \
         typename ::boost::enable_if<typename ::boost::mpl::has_key<                                     \
-        typename Param1::tag_type,boost::msm::front::state_action_tag>::type,                                              \
+        typename Param1::tag_type,boost::msm::front::state_action_tag>::type,                           \
         typename state_action_result<Event,FSM,STATE>::type >::type                                     \
         operator()(Event const& evt,FSM& fsm,STATE& state )const {                                      \
         return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state)       \
         ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} };                  \
         struct function_name ## tag{};                                                                  \
         struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type,       \
-        functor ## Helper , sm_domain> { functor ## Helper(){}                                          \
+        functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){}                              \
         template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6>                    \
         struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; };                           \
         functor ## Helper const function_name = functor ## Helper ();
@@ -2320,7 +2281,7 @@
         ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} };                                          \
         struct function_name ## tag{};                                                                  \
         struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type,       \
-        functor ## Helper , sm_domain> { functor ## Helper(){}                                          \
+        functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){}                              \
         template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>                               \
         struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; };                                \
         functor ## Helper const function_name = functor ## Helper ();
@@ -2446,7 +2407,7 @@
         ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} };                                          \
         struct function_name ## tag{};                                                                  \
         struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type,       \
-        functor ## Helper , sm_domain> { functor ## Helper(){}                                          \
+        functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){}                              \
         template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>                               \
         struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; };                                \
         functor ## Helper const function_name = functor ## Helper ();
@@ -2630,6 +2591,7 @@
     typedef BOOST_TYPEOF(build_sm<instance_name ## tag> expr) instance_name;
 
 #define BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(expr,instance_name)                                     \
+    typedef int using_declared_table;                                                                   \
     typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER  BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name;
 
 #define BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(expr)                                                                     \
Modified: branches/release/boost/msm/front/euml/container.hpp
==============================================================================
--- branches/release/boost/msm/front/euml/container.hpp	(original)
+++ branches/release/boost/msm/front/euml/container.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -65,7 +65,7 @@
 };
 
 struct front_tag {};
-struct Front_Helper: proto::extends< proto::terminal<front_tag>::type, Front_Helper, sm_domain>
+struct Front_Helper: proto::extends< proto::terminal<front_tag>::type, Front_Helper, boost::msm::sm_domain>
 {
     Front_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -120,7 +120,7 @@
 };
 
 struct back_tag {};
-struct Back_Helper: proto::extends< proto::terminal<back_tag>::type, Back_Helper, sm_domain>
+struct Back_Helper: proto::extends< proto::terminal<back_tag>::type, Back_Helper, boost::msm::sm_domain>
 {
     Back_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -175,7 +175,7 @@
 };
 
 struct begin_tag {};
-struct Begin_Helper: proto::extends< proto::terminal<begin_tag>::type, Begin_Helper, sm_domain>
+struct Begin_Helper: proto::extends< proto::terminal<begin_tag>::type, Begin_Helper, boost::msm::sm_domain>
 {
     Begin_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -229,7 +229,7 @@
     }
 };
 struct end_tag {};
-struct End_Helper: proto::extends< proto::terminal<end_tag>::type, End_Helper, sm_domain>
+struct End_Helper: proto::extends< proto::terminal<end_tag>::type, End_Helper, boost::msm::sm_domain>
 {
     End_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -284,7 +284,7 @@
 };
 
 struct rbegin_tag {};
-struct RBegin_Helper: proto::extends< proto::terminal<rbegin_tag>::type, RBegin_Helper, sm_domain>
+struct RBegin_Helper: proto::extends< proto::terminal<rbegin_tag>::type, RBegin_Helper, boost::msm::sm_domain>
 {
     RBegin_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -338,7 +338,7 @@
     }
 };
 struct rend_tag {};
-struct REnd_Helper: proto::extends< proto::terminal<rend_tag>::type, REnd_Helper, sm_domain>
+struct REnd_Helper: proto::extends< proto::terminal<rend_tag>::type, REnd_Helper, boost::msm::sm_domain>
 {
     REnd_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -380,7 +380,7 @@
     }
 };
 struct push_back_tag {};
-struct Push_Back_Helper: proto::extends< proto::terminal<push_back_tag>::type, Push_Back_Helper, sm_domain>
+struct Push_Back_Helper: proto::extends< proto::terminal<push_back_tag>::type, Push_Back_Helper, boost::msm::sm_domain>
 {
     Push_Back_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -422,7 +422,7 @@
     }
 };
 struct pop_back_tag {};
-struct Pop_Back_Helper: proto::extends< proto::terminal<pop_back_tag>::type, Pop_Back_Helper, sm_domain>
+struct Pop_Back_Helper: proto::extends< proto::terminal<pop_back_tag>::type, Pop_Back_Helper, boost::msm::sm_domain>
 {
     Pop_Back_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -464,7 +464,7 @@
     }
 };
 struct push_front_tag {};
-struct Push_Front_Helper: proto::extends< proto::terminal<push_front_tag>::type, Push_Front_Helper, sm_domain>
+struct Push_Front_Helper: proto::extends< proto::terminal<push_front_tag>::type, Push_Front_Helper, boost::msm::sm_domain>
 {
     Push_Front_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -506,7 +506,7 @@
     }
 };
 struct pop_front_tag {};
-struct Pop_Front_Helper: proto::extends< proto::terminal<pop_front_tag>::type, Pop_Front_Helper, sm_domain>
+struct Pop_Front_Helper: proto::extends< proto::terminal<pop_front_tag>::type, Pop_Front_Helper, boost::msm::sm_domain>
 {
     Pop_Front_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -548,7 +548,7 @@
     }
 };
 struct clear_tag {};
-struct Clear_Helper: proto::extends< proto::terminal<clear_tag>::type, Clear_Helper, sm_domain>
+struct Clear_Helper: proto::extends< proto::terminal<clear_tag>::type, Clear_Helper, boost::msm::sm_domain>
 {
     Clear_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -590,7 +590,7 @@
     }
 };
 struct list_reverse_tag {};
-struct ListReverse_Helper: proto::extends< proto::terminal<list_reverse_tag>::type, ListReverse_Helper, sm_domain>
+struct ListReverse_Helper: proto::extends< proto::terminal<list_reverse_tag>::type, ListReverse_Helper, boost::msm::sm_domain>
 {
     ListReverse_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -660,7 +660,7 @@
     }
 };
 struct list_unique_tag {};
-struct ListUnique_Helper: proto::extends< proto::terminal<list_unique_tag>::type, ListUnique_Helper, sm_domain>
+struct ListUnique_Helper: proto::extends< proto::terminal<list_unique_tag>::type, ListUnique_Helper, boost::msm::sm_domain>
 {
     ListUnique_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -730,7 +730,7 @@
     }
 };
 struct list_sort_tag {};
-struct ListSort_Helper: proto::extends< proto::terminal<list_sort_tag>::type, ListSort_Helper, sm_domain>
+struct ListSort_Helper: proto::extends< proto::terminal<list_sort_tag>::type, ListSort_Helper, boost::msm::sm_domain>
 {
     ListSort_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -784,7 +784,7 @@
     }
 };
 struct capacity_tag {};
-struct Capacity_Helper: proto::extends< proto::terminal<capacity_tag>::type, Capacity_Helper, sm_domain>
+struct Capacity_Helper: proto::extends< proto::terminal<capacity_tag>::type, Capacity_Helper, boost::msm::sm_domain>
 {
     Capacity_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -838,7 +838,7 @@
     }
 };
 struct size_tag {};
-struct Size_Helper: proto::extends< proto::terminal<size_tag>::type, Size_Helper, sm_domain>
+struct Size_Helper: proto::extends< proto::terminal<size_tag>::type, Size_Helper, boost::msm::sm_domain>
 {
     Size_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -892,7 +892,7 @@
     }
 };
 struct max_size_tag {};
-struct Max_Size_Helper: proto::extends< proto::terminal<max_size_tag>::type, Max_Size_Helper, sm_domain>
+struct Max_Size_Helper: proto::extends< proto::terminal<max_size_tag>::type, Max_Size_Helper, boost::msm::sm_domain>
 {
     Max_Size_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -934,7 +934,7 @@
     }
 };
 struct reserve_tag {};
-struct Reserve_Helper: proto::extends< proto::terminal<reserve_tag>::type, Reserve_Helper, sm_domain>
+struct Reserve_Helper: proto::extends< proto::terminal<reserve_tag>::type, Reserve_Helper, boost::msm::sm_domain>
 {
     Reserve_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1003,7 +1003,7 @@
     }
 };
 struct resize_tag {};
-struct Resize_Helper: proto::extends< proto::terminal<resize_tag>::type, Resize_Helper, sm_domain>
+struct Resize_Helper: proto::extends< proto::terminal<resize_tag>::type, Resize_Helper, boost::msm::sm_domain>
 {
     Resize_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1186,7 +1186,7 @@
     }
 };
 struct insert_tag {};
-struct Insert_Helper: proto::extends< proto::terminal<insert_tag>::type, Insert_Helper, sm_domain>
+struct Insert_Helper: proto::extends< proto::terminal<insert_tag>::type, Insert_Helper, boost::msm::sm_domain>
 {
     Insert_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1228,7 +1228,7 @@
     }
 };
 struct swap_tag {};
-struct Swap_Helper: proto::extends< proto::terminal<swap_tag>::type, Swap_Helper, sm_domain>
+struct Swap_Helper: proto::extends< proto::terminal<swap_tag>::type, Swap_Helper, boost::msm::sm_domain>
 {
     Swap_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1314,7 +1314,7 @@
     }
 };
 struct erase_tag {};
-struct Erase_Helper: proto::extends< proto::terminal<erase_tag>::type, Erase_Helper, sm_domain>
+struct Erase_Helper: proto::extends< proto::terminal<erase_tag>::type, Erase_Helper, boost::msm::sm_domain>
 {
     Erase_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1356,7 +1356,7 @@
     }
 };
 struct empty_tag {};
-struct Empty_Helper: proto::extends< proto::terminal<empty_tag>::type, Empty_Helper, sm_domain>
+struct Empty_Helper: proto::extends< proto::terminal<empty_tag>::type, Empty_Helper, boost::msm::sm_domain>
 {
     Empty_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1398,7 +1398,7 @@
     }
 };
 struct list_remove_tag {};
-struct ListRemove_Helper: proto::extends< proto::terminal<list_remove_tag>::type, ListRemove_Helper, sm_domain>
+struct ListRemove_Helper: proto::extends< proto::terminal<list_remove_tag>::type, ListRemove_Helper, boost::msm::sm_domain>
 {
     ListRemove_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1440,7 +1440,7 @@
     }
 };
 struct list_remove_if_tag {};
-struct ListRemove_If_Helper: proto::extends< proto::terminal<list_remove_if_tag>::type, ListRemove_If_Helper, sm_domain>
+struct ListRemove_If_Helper: proto::extends< proto::terminal<list_remove_if_tag>::type, ListRemove_If_Helper, boost::msm::sm_domain>
 {
     ListRemove_If_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1510,7 +1510,7 @@
     }
 };
 struct list_merge_tag {};
-struct ListMerge_Helper: proto::extends< proto::terminal<list_merge_tag>::type, ListMerge_Helper, sm_domain>
+struct ListMerge_Helper: proto::extends< proto::terminal<list_merge_tag>::type, ListMerge_Helper, boost::msm::sm_domain>
 {
     ListMerge_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1623,7 +1623,7 @@
     }
 };
 struct splice_tag {};
-struct Splice_Helper: proto::extends< proto::terminal<splice_tag>::type, Splice_Helper, sm_domain>
+struct Splice_Helper: proto::extends< proto::terminal<splice_tag>::type, Splice_Helper, boost::msm::sm_domain>
 {
     Splice_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1741,7 +1741,7 @@
 };
 
 struct string_find_tag {};
-struct StringFind_Helper: proto::extends< proto::terminal<string_find_tag>::type, StringFind_Helper, sm_domain>
+struct StringFind_Helper: proto::extends< proto::terminal<string_find_tag>::type, StringFind_Helper, boost::msm::sm_domain>
 {
     StringFind_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1881,7 +1881,7 @@
 };
 
 struct string_rfind_tag {};
-struct StringRFind_Helper: proto::extends< proto::terminal<string_rfind_tag>::type, StringRFind_Helper, sm_domain>
+struct StringRFind_Helper: proto::extends< proto::terminal<string_rfind_tag>::type, StringRFind_Helper, boost::msm::sm_domain>
 {
     StringRFind_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -1994,7 +1994,7 @@
 
 struct string_find_first_of_tag {};
 struct StringFindFirstOf_Helper: 
-    proto::extends< proto::terminal<string_find_first_of_tag>::type, StringFindFirstOf_Helper, sm_domain>
+    proto::extends< proto::terminal<string_find_first_of_tag>::type, StringFindFirstOf_Helper, boost::msm::sm_domain>
 {
     StringFindFirstOf_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2135,7 +2135,7 @@
 
 struct string_find_first_not_of_tag {};
 struct StringFindFirstNotOf_Helper: 
-    proto::extends< proto::terminal<string_find_first_not_of_tag>::type, StringFindFirstNotOf_Helper, sm_domain>
+    proto::extends< proto::terminal<string_find_first_not_of_tag>::type, StringFindFirstNotOf_Helper, boost::msm::sm_domain>
 {
     StringFindFirstNotOf_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2276,7 +2276,7 @@
 
 struct string_find_last_of_tag {};
 struct StringFindLastOf_Helper: 
-    proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastOf_Helper, sm_domain>
+    proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastOf_Helper, boost::msm::sm_domain>
 {
     StringFindLastOf_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2417,7 +2417,7 @@
 
 struct string_find_last_not_of_tag {};
 struct StringFindLastNotOf_Helper: 
-    proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastNotOf_Helper, sm_domain>
+    proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastNotOf_Helper, boost::msm::sm_domain>
 {
     StringFindLastNotOf_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2594,7 +2594,7 @@
 };
 
 struct associative_erase_tag {};
-struct Associative_Erase_Helper: proto::extends< proto::terminal<associative_erase_tag>::type, Associative_Erase_Helper, sm_domain>
+struct Associative_Erase_Helper: proto::extends< proto::terminal<associative_erase_tag>::type, Associative_Erase_Helper, boost::msm::sm_domain>
 {
     Associative_Erase_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2650,7 +2650,7 @@
 };
 
 struct associative_find_tag {};
-struct Associative_Find_Helper: proto::extends< proto::terminal<associative_find_tag>::type, Associative_Find_Helper, sm_domain>
+struct Associative_Find_Helper: proto::extends< proto::terminal<associative_find_tag>::type, Associative_Find_Helper, boost::msm::sm_domain>
 {
     Associative_Find_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2704,7 +2704,7 @@
     }
 };
 struct associative_count_tag {};
-struct AssociativeCount_Helper: proto::extends< proto::terminal<associative_count_tag>::type, AssociativeCount_Helper, sm_domain>
+struct AssociativeCount_Helper: proto::extends< proto::terminal<associative_count_tag>::type, AssociativeCount_Helper, boost::msm::sm_domain>
 {
     AssociativeCount_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2760,7 +2760,7 @@
 
 struct associative_lower_bound_tag {};
 struct Associative_Lower_Bound_Helper: proto::extends< proto::terminal<associative_lower_bound_tag>::type, 
-                                                       Associative_Lower_Bound_Helper, sm_domain>
+                                                       Associative_Lower_Bound_Helper, boost::msm::sm_domain>
 {
     Associative_Lower_Bound_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2816,7 +2816,7 @@
 
 struct associative_upper_bound_tag {};
 struct Associative_Upper_Bound_Helper: proto::extends< proto::terminal<associative_upper_bound_tag>::type, 
-                                                       Associative_Upper_Bound_Helper, sm_domain>
+                                                       Associative_Upper_Bound_Helper, boost::msm::sm_domain>
 {
     Associative_Upper_Bound_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2871,7 +2871,7 @@
 };
 
 struct first_tag {};
-struct First_Helper: proto::extends< proto::terminal<first_tag>::type, First_Helper, sm_domain>
+struct First_Helper: proto::extends< proto::terminal<first_tag>::type, First_Helper, boost::msm::sm_domain>
 {
     First_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2926,7 +2926,7 @@
 };
 
 struct second_tag {};
-struct Second_Helper: proto::extends< proto::terminal<second_tag>::type, Second_Helper, sm_domain>
+struct Second_Helper: proto::extends< proto::terminal<second_tag>::type, Second_Helper, boost::msm::sm_domain>
 {
     Second_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -2990,7 +2990,7 @@
 
 struct associative_equal_range_tag {};
 struct Associative_Equal_Range_Helper: proto::extends< proto::terminal<associative_equal_range_tag>::type, 
-                                                       Associative_Equal_Range_Helper, sm_domain>
+                                                       Associative_Equal_Range_Helper, boost::msm::sm_domain>
 {
     Associative_Equal_Range_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3102,7 +3102,7 @@
     }
 };
 struct substr_tag {};
-struct Substr_Helper: proto::extends< proto::terminal<substr_tag>::type, Substr_Helper, sm_domain>
+struct Substr_Helper: proto::extends< proto::terminal<substr_tag>::type, Substr_Helper, boost::msm::sm_domain>
 {
     Substr_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3264,7 +3264,7 @@
 };
 
 struct string_compare_tag {};
-struct StringCompare_Helper: proto::extends< proto::terminal<string_compare_tag>::type, StringCompare_Helper, sm_domain>
+struct StringCompare_Helper: proto::extends< proto::terminal<string_compare_tag>::type, StringCompare_Helper, boost::msm::sm_domain>
 {
     StringCompare_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3388,7 +3388,7 @@
 };
 
 struct append_tag {};
-struct Append_Helper: proto::extends< proto::terminal<append_tag>::type, Append_Helper, sm_domain>
+struct Append_Helper: proto::extends< proto::terminal<append_tag>::type, Append_Helper, boost::msm::sm_domain>
 {
     Append_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3513,7 +3513,7 @@
 };
 
 struct string_insert_tag {};
-struct StringInsert_Helper: proto::extends< proto::terminal<string_insert_tag>::type, StringInsert_Helper, sm_domain>
+struct StringInsert_Helper: proto::extends< proto::terminal<string_insert_tag>::type, StringInsert_Helper, boost::msm::sm_domain>
 {
     StringInsert_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3620,7 +3620,7 @@
 };
 
 struct string_erase_tag {};
-struct StringErase_Helper: proto::extends< proto::terminal<string_erase_tag>::type, StringErase_Helper, sm_domain>
+struct StringErase_Helper: proto::extends< proto::terminal<string_erase_tag>::type, StringErase_Helper, boost::msm::sm_domain>
 {
     StringErase_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3744,7 +3744,7 @@
     }
 };
 struct assign_tag {};
-struct StringAssign_Helper: proto::extends< proto::terminal<assign_tag>::type, StringAssign_Helper, sm_domain>
+struct StringAssign_Helper: proto::extends< proto::terminal<assign_tag>::type, StringAssign_Helper, boost::msm::sm_domain>
 {
     StringAssign_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3835,7 +3835,7 @@
 };
 
 struct string_replace_tag {};
-struct StringReplace_Helper: proto::extends< proto::terminal<string_replace_tag>::type, StringReplace_Helper, sm_domain>
+struct StringReplace_Helper: proto::extends< proto::terminal<string_replace_tag>::type, StringReplace_Helper, boost::msm::sm_domain>
 {
     StringReplace_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3891,7 +3891,7 @@
     }
 };
 struct c_str_tag {};
-struct CStr_Helper: proto::extends< proto::terminal<c_str_tag>::type, CStr_Helper, sm_domain>
+struct CStr_Helper: proto::extends< proto::terminal<c_str_tag>::type, CStr_Helper, boost::msm::sm_domain>
 {
     CStr_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -3947,7 +3947,7 @@
     }
 };
 struct string_data_tag {};
-struct StringData_Helper: proto::extends< proto::terminal<string_data_tag>::type, StringData_Helper, sm_domain>
+struct StringData_Helper: proto::extends< proto::terminal<string_data_tag>::type, StringData_Helper, boost::msm::sm_domain>
 {
     StringData_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -4048,7 +4048,7 @@
 };
 
 struct string_copy_tag {};
-struct StringCopy_Helper: proto::extends< proto::terminal<string_copy_tag>::type, StringCopy_Helper, sm_domain>
+struct StringCopy_Helper: proto::extends< proto::terminal<string_copy_tag>::type, StringCopy_Helper, boost::msm::sm_domain>
 {
     StringCopy_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
Modified: branches/release/boost/msm/front/euml/operator.hpp
==============================================================================
--- branches/release/boost/msm/front/euml/operator.hpp	(original)
+++ branches/release/boost/msm/front/euml/operator.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -157,10 +157,10 @@
 struct if_tag 
 {
 };
-struct If : proto::extends<proto::terminal<if_tag>::type, If, sm_domain>
+struct If : proto::extends<proto::terminal<if_tag>::type, If, boost::msm::sm_domain>
 {
     If(){}
-    using proto::extends< proto::terminal<if_tag>::type, If, sm_domain>::operator=;
+    using proto::extends< proto::terminal<if_tag>::type, If, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -256,10 +256,10 @@
 struct if_then_tag 
 {
 };
-struct If_Then : proto::extends< proto::terminal<if_then_tag>::type, If_Then, sm_domain>
+struct If_Then : proto::extends< proto::terminal<if_then_tag>::type, If_Then, boost::msm::sm_domain>
 {
     If_Then(){}
-    using proto::extends< proto::terminal<if_then_tag>::type, If_Then, sm_domain>::operator=;
+    using proto::extends< proto::terminal<if_then_tag>::type, If_Then, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -312,10 +312,10 @@
 struct while_do_tag 
 {
 };
-struct While_Do_Helper : proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, sm_domain>
+struct While_Do_Helper : proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, boost::msm::sm_domain>
 {
     While_Do_Helper(){}
-    using proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -368,10 +368,10 @@
 struct do_while_tag 
 {
 };
-struct Do_While_Helper : proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, sm_domain>
+struct Do_While_Helper : proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, boost::msm::sm_domain>
 {
     Do_While_Helper(){}
-    using proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
@@ -426,10 +426,10 @@
 struct for_loop_tag 
 {
 };
-struct For_Loop_Helper : proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, sm_domain>
+struct For_Loop_Helper : proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, boost::msm::sm_domain>
 {
     For_Loop_Helper(){}
-    using proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, sm_domain>::operator=;
+    using proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, boost::msm::sm_domain>::operator=;
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
 #ifdef BOOST_MSVC 
  ,class Arg6 
Modified: branches/release/boost/msm/front/euml/state_grammar.hpp
==============================================================================
--- branches/release/boost/msm/front/euml/state_grammar.hpp	(original)
+++ branches/release/boost/msm/front/euml/state_grammar.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -59,6 +59,7 @@
     typedef StateNameTag state_name_tag;
     // flags
     typedef Flags       flag_list;
+    typedef ::boost::mpl::vector0<> internal_flag_list;
     // deferred events
     typedef Defer       deferred_events;
 
@@ -99,6 +100,7 @@
 
     // flags
     typedef Flags       flag_list;
+    typedef ::boost::mpl::vector0<> internal_flag_list;
     // deferred events
     typedef Defer       deferred_events;
 
@@ -135,6 +137,7 @@
     typedef StateNameTag state_name_tag;
     // flags
     typedef Flags       flag_list;
+    typedef ::boost::mpl::vector0<> internal_flag_list;
     // deferred events
     typedef Defer       deferred_events;
 
@@ -175,6 +178,7 @@
 
     // flags
     typedef Flags       flag_list;
+    typedef ::boost::mpl::vector0<> internal_flag_list;
     // deferred events
     typedef Defer       deferred_events;
 
@@ -562,13 +566,13 @@
 {};
 
 // attributes building
-#define BOOST_MSM_EUML_DECLARE_ATTRIBUTE(attr_type,attr_name)                                           \
-struct attr_name ## _                                                                                   \
-    : proto::extends< proto::terminal<msm::front::action_tag>::type, attr_name ## _, sm_domain>         \
-    {typedef  attr_name ## _ action_name;                                                               \
-        typedef ::boost::fusion::pair<attr_name ## _,attr_type> attribute_type;                         \
-        attr_name ## _ (){}                                                                             \
-    };                                                                                                  \
+#define BOOST_MSM_EUML_DECLARE_ATTRIBUTE(attr_type,attr_name)                                                           \
+struct attr_name ## _                                                                                                   \
+    : proto::extends< proto::terminal< ::boost::msm::front::action_tag>::type, attr_name ## _, boost::msm::sm_domain>   \
+    {typedef  attr_name ## _ action_name;                                                                               \
+        typedef ::boost::fusion::pair<attr_name ## _,attr_type> attribute_type;                                         \
+        attr_name ## _ (){}                                                                                             \
+    };                                                                                                                  \
 attr_name ## _ const attr_name = attr_name ## _();
 
 struct make_attributes_tag
@@ -597,7 +601,7 @@
    BOOST_PROTO_BASIC_EXTENDS(
        proto::terminal<make_attributes_tag>::type
      , attribute
-     , sm_domain
+     , boost::msm::sm_domain
    )
    typedef ::boost::fusion::pair<int,int> attribute_type;
 };
@@ -668,7 +672,7 @@
    BOOST_PROTO_BASIC_EXTENDS(
        proto::terminal<make_configure_tag>::type
      , configure
-     , sm_domain
+     , boost::msm::sm_domain
    )
 };
 
@@ -700,7 +704,7 @@
    BOOST_PROTO_BASIC_EXTENDS(
        proto::terminal<state_tag>::type
      , define_init
-     , sm_domain
+     , boost::msm::sm_domain
    )
 };
 
@@ -867,6 +871,7 @@
     // flags
     typedef StateNameTag state_name_tag;
     typedef Flags                        flag_list;
+    typedef ::boost::mpl::vector0<>      internal_flag_list;
     // deferred events
     typedef Defer                        deferred_events;
     // customization (message queue, exceptions)
Modified: branches/release/boost/msm/front/euml/transformation.hpp
==============================================================================
--- branches/release/boost/msm/front/euml/transformation.hpp	(original)
+++ branches/release/boost/msm/front/euml/transformation.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -107,7 +107,7 @@
 };
 
 struct back_inserter_tag {};
-struct BackInserter_Helper: proto::extends< proto::terminal<back_inserter_tag>::type, BackInserter_Helper, sm_domain>
+struct BackInserter_Helper: proto::extends< proto::terminal<back_inserter_tag>::type, BackInserter_Helper, boost::msm::sm_domain>
 {
     BackInserter_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -162,7 +162,7 @@
 };
 
 struct front_inserter_tag {};
-struct FrontInserter_Helper: proto::extends< proto::terminal<front_inserter_tag>::type, FrontInserter_Helper, sm_domain>
+struct FrontInserter_Helper: proto::extends< proto::terminal<front_inserter_tag>::type, FrontInserter_Helper, boost::msm::sm_domain>
 {
     FrontInserter_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -217,7 +217,7 @@
 };
 
 struct inserter_tag {};
-struct Inserter_Helper: proto::extends< proto::terminal<inserter_tag>::type, Inserter_Helper, sm_domain>
+struct Inserter_Helper: proto::extends< proto::terminal<inserter_tag>::type, Inserter_Helper, boost::msm::sm_domain>
 {
     Inserter_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
@@ -315,7 +315,7 @@
     }
 };
 struct transform_tag {};
-struct Transform_Helper: proto::extends< proto::terminal<transform_tag>::type, Transform_Helper, sm_domain>
+struct Transform_Helper: proto::extends< proto::terminal<transform_tag>::type, Transform_Helper, boost::msm::sm_domain>
 {
     Transform_Helper(){}
     template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 
Modified: branches/release/boost/msm/front/state_machine_def.hpp
==============================================================================
--- branches/release/boost/msm/front/state_machine_def.hpp	(original)
+++ branches/release/boost/msm/front/state_machine_def.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -31,6 +31,7 @@
     // tags
     // default: no flag
     typedef ::boost::mpl::vector0<>               flag_list;
+    typedef ::boost::mpl::vector0<>               internal_flag_list;
     //default: no deferred events
     typedef ::boost::mpl::vector0<>               deferred_events;
     // customization (message queue, exceptions)
@@ -197,7 +198,7 @@
 protected:
     // Default no-transition handler. Can be replaced in the Derived SM class.
     template <class FSM,class Event>
-    void no_transition(Event const& ,FSM&, int state)
+    void no_transition(Event const& ,FSM&, int )
     {
         BOOST_ASSERT(false);
     }
Modified: branches/release/boost/msm/front/states.hpp
==============================================================================
--- branches/release/boost/msm/front/states.hpp	(original)
+++ branches/release/boost/msm/front/states.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -49,6 +49,7 @@
     // tags
     // default: no flag
     typedef ::boost::mpl::vector0<>       flag_list;
+    typedef ::boost::mpl::vector0<>       internal_flag_list;
     //default: no deferred events
     typedef ::boost::mpl::vector0<>       deferred_events;
 };
@@ -59,7 +60,8 @@
 struct terminate_state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy
 {
     // tags
-    typedef ::boost::mpl::vector<boost::msm::TerminateFlag>      flag_list;
+    typedef ::boost::mpl::vector0<>                               flag_list;
+    typedef ::boost::mpl::vector< boost::msm::TerminateFlag>      internal_flag_list;
     //default: no deferred events
     typedef ::boost::mpl::vector0<>                               deferred_events;
 };
@@ -71,9 +73,10 @@
 struct interrupt_state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy
 {
     // tags
+    typedef ::boost::mpl::vector0<>                           flag_list;
     typedef ::boost::mpl::vector<boost::msm::InterruptedFlag,
         boost::msm::EndInterruptFlag<EndInterruptEvent> >       
-        flag_list;
+                                                              internal_flag_list;
     //default: no deferred events
     typedef ::boost::mpl::vector0<>                           deferred_events;
 };
@@ -101,6 +104,7 @@
     typedef int explicit_entry_state;
     // default: no flag
     typedef ::boost::mpl::vector0<>       flag_list;
+    typedef ::boost::mpl::vector0<>       internal_flag_list;
     //default: no deferred events
     typedef ::boost::mpl::vector0<>       deferred_events;
 };
@@ -117,7 +121,8 @@
     typedef int         pseudo_exit;
 
     // default: no flag
-    typedef ::boost::mpl::vector< > flag_list;
+    typedef ::boost::mpl::vector0<>  flag_list;
+    typedef ::boost::mpl::vector0<>  internal_flag_list;
     //default: no deferred events
     typedef ::boost::mpl::vector0<>  deferred_events;
 };
Modified: branches/release/boost/msm/msm_grammar.hpp
==============================================================================
--- branches/release/boost/msm/msm_grammar.hpp	(original)
+++ branches/release/boost/msm/msm_grammar.hpp	2012-05-24 15:38:46 EDT (Thu, 24 May 2012)
@@ -11,6 +11,7 @@
 #ifndef BOOST_MSM_GRAMMAR_H
 #define BOOST_MSM_GRAMMAR_H
 
+#include <boost/proto/core.hpp>
 #include <boost/msm/common.hpp>
 
 
@@ -41,6 +42,45 @@
     {}
 };
 
+// grammar forbidding address of for terminals
+struct terminal_grammar : proto::not_<proto::address_of<proto::_> >
+{};
+
+// Forward-declare an expression wrapper
+template<typename Expr>
+struct euml_terminal;
+
+struct sm_domain
+    : proto::domain< proto::generator<euml_terminal>, terminal_grammar, boost::msm::msm_domain >
+{};
+
+struct state_grammar : 
+    proto::and_<
+        proto::not_<proto::address_of<proto::_> >,
+        proto::not_<proto::shift_right<proto::_,proto::_> >,
+        proto::not_<proto::shift_left<proto::_,proto::_> >,
+        proto::not_<proto::bitwise_and<proto::_,proto::_> >
+    >
+{};
+struct state_domain
+    : proto::domain< proto::generator<euml_terminal>, boost::msm::state_grammar,boost::msm::sm_domain >
+{};
+
+template<typename Expr>
+struct euml_terminal
+    : proto::extends<Expr, euml_terminal<Expr>, boost::msm::sm_domain>
+{
+    typedef
+        proto::extends<Expr, euml_terminal<Expr>, boost::msm::sm_domain>
+        base_type;
+    // Needs a constructor
+    euml_terminal(Expr const &e = Expr())
+        : base_type(e)
+    {}
+    // Unhide Proto's overloaded assignment operator
+    using base_type::operator=;
+};
+
 } } // boost::msm
 #endif //BOOST_MSM_GRAMMAR_H