$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: eric_at_[hidden]
Date: 2008-05-27 03:27:20
Author: eric_niebler
Date: 2008-05-27 03:27:19 EDT (Tue, 27 May 2008)
New Revision: 45810
URL: http://svn.boost.org/trac/boost/changeset/45810
Log:
get statement tests passing on gcc
Text files modified: 
   branches/proto/v4/boost/phoenix/core/reference.hpp   |    14 ++++++++++++--                          
   branches/proto/v4/boost/phoenix/core/value.hpp       |    16 ++++++++++++++--                        
   branches/proto/v4/boost/phoenix/scope/let.hpp        |     3 +--                                     
   branches/proto/v4/boost/phoenix/statement/switch.hpp |     2 +-                                      
   4 files changed, 28 insertions(+), 7 deletions(-)
Modified: branches/proto/v4/boost/phoenix/core/reference.hpp
==============================================================================
--- branches/proto/v4/boost/phoenix/core/reference.hpp	(original)
+++ branches/proto/v4/boost/phoenix/core/reference.hpp	2008-05-27 03:27:19 EDT (Tue, 27 May 2008)
@@ -18,12 +18,22 @@
       : proto::terminal<T &>::type
     {
         explicit reference(T &t)
-          : proto::terminal<T &>::type(proto::terminal<T &>::type::make(t))
+          : proto::terminal<T &>::type(
+                proto::terminal<T &>::type::make(t)
+            )
+        {}
+
+        reference(reference<T> const volatile &that)
+          : proto::terminal<T &>::type(
+                proto::terminal<T &>::type::make(that.child0)
+            )
         {}
 
         operator actor<reference<T> >() const
         {
-            actor<reference<T> > that = {*this};
+            // work around strange infinite recursion issue on gcc
+            reference<T> const volatile &vthis = *this;
+            actor<reference<T> > that = {vthis};
             return that;
         }
     };
Modified: branches/proto/v4/boost/phoenix/core/value.hpp
==============================================================================
--- branches/proto/v4/boost/phoenix/core/value.hpp	(original)
+++ branches/proto/v4/boost/phoenix/core/value.hpp	2008-05-27 03:27:19 EDT (Tue, 27 May 2008)
@@ -27,12 +27,24 @@
       : proto::terminal<T>::type
     {
         explicit value(T const &t)
-          : proto::terminal<T>::type(proto::terminal<T>::type::make(t))
+          : proto::terminal<T>::type(
+                proto::terminal<T>::type::make(t)
+            )
+        {}
+
+        value(value<T> const volatile &that)
+          : proto::terminal<T>::type(
+                proto::terminal<T>::type::make(
+                    const_cast<T const &>(that.child0)
+                )
+            )
         {}
 
         operator actor<value<T> >() const
         {
-            actor<value<T> > that = {*this};
+            // work around strange infinite recursion issue on gcc
+            value<T> const volatile &vthis = *this;
+            actor<value<T> > that = {vthis};
             return that;
         }
     };
Modified: branches/proto/v4/boost/phoenix/scope/let.hpp
==============================================================================
--- branches/proto/v4/boost/phoenix/scope/let.hpp	(original)
+++ branches/proto/v4/boost/phoenix/scope/let.hpp	2008-05-27 03:27:19 EDT (Tue, 27 May 2008)
@@ -151,6 +151,7 @@
                 };
             };
 
+            ////////////////////////////////////////////////////////////////////////////////////////
             template<typename SubGrammar>
             struct with_grammar
             {
@@ -253,8 +254,6 @@
         {};
 
         ////////////////////////////////////////////////////////////////////////////////////////////
-        // BUGBUG this isn't quite right. It gets the answer wrong for
-        // let(_a = 1)[ _a += arg1 ]
         template<typename SubGrammar>
         struct is_nullary_extension<tag::let_, SubGrammar>
           : detail::with_grammar<SubGrammar>::is_nullary_extension
Modified: branches/proto/v4/boost/phoenix/statement/switch.hpp
==============================================================================
--- branches/proto/v4/boost/phoenix/statement/switch.hpp	(original)
+++ branches/proto/v4/boost/phoenix/statement/switch.hpp	2008-05-27 03:27:19 EDT (Tue, 27 May 2008)
@@ -202,7 +202,7 @@
 
 #else
 
-    #define N BOOST_PP_ITERATION()
+    #define N BOOST_PP_SUB(PHOENIX_LIMIT, BOOST_PP_ITERATION())
 
         #define M0(Z, N, DATA)                                                                      \
             proto::expr<tag::case_<BOOST_PP_CAT(L, N)>, BOOST_PP_CAT(A, N), 1> const &BOOST_PP_CAT(a, N)\