$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78214 - in trunk/boost: . local_function/aux_/macro/code_
From: lorcaminiti_at_[hidden]
Date: 2012-04-26 21:46:23
Author: lcaminiti
Date: 2012-04-26 21:46:22 EDT (Thu, 26 Apr 2012)
New Revision: 78214
URL: http://svn.boost.org/trac/boost/changeset/78214
Log:
Hopefully worked around an Intel compiler bug (internal error) when deducing local function result type (used same Intel workaround that ScopeExit uses to deduced capture types).
Text files modified: 
   trunk/boost/local_function/aux_/macro/code_/result.hpp |    57 ++++++++++++++++----------------------- 
   trunk/boost/scope_exit.hpp                             |     5 ++                                      
   2 files changed, 27 insertions(+), 35 deletions(-)
Modified: trunk/boost/local_function/aux_/macro/code_/result.hpp
==============================================================================
--- trunk/boost/local_function/aux_/macro/code_/result.hpp	(original)
+++ trunk/boost/local_function/aux_/macro/code_/result.hpp	2012-04-26 21:46:22 EDT (Thu, 26 Apr 2012)
@@ -21,62 +21,50 @@
 
 // PRIVATE //
 
-#define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_TAG_(id) \
-    BOOST_LOCAL_FUNCTION_AUX_SYMBOL( (deduce_result_tag)(id) )
-
 #define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_FUNC_(id) \
     /* symbol (not internal) also gives error if missing result type */ \
     BOOST_PP_CAT( \
   ERROR_missing_result_type_before_the_local_function_parameter_macro_id, \
             id)
 
-#define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_WRAP_(id) \
-    BOOST_LOCAL_FUNCTION_AUX_SYMBOL( (deduce_result_wrap)(id) )
-
-#define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_CAPTURE_(id) \
-    BOOST_LOCAL_FUNCTION_AUX_SYMBOL( (deduce_result_capture)(id) )
-
 #define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_PARAMS_(id) \
     BOOST_LOCAL_FUNCTION_AUX_SYMBOL( (deduce_result_params)(id) )
 
 #define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_TYPE_(id) \
     BOOST_LOCAL_FUNCTION_AUX_SYMBOL( (result_type)(id) )
 
+#define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_INDEX_ \
+    /* this does not have to be an integral index because ScopeExit uses */ \
+    /* just as a symbol to concatenate go generate unique symbols (but */ \
+    /* if it'd ever needed to became integral, the number of function */ \
+    /* params + 1 as in the macro CONFIG_ARITY_MAX could be used) */ \
+    result
+
 // User did not explicitly specified result type, deduce it (using Typeof).
 #define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_DEDUCE_( \
         id, typename01, decl_traits) \
+    /* user specified result type here */ \
     BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_DECL(id) \
-    /* the many tagging, wrapping, etc that follow are taken from ScopeExit */ \
-    /* type deduction mechanism and they are necessary within templates */ \
-    /* (at least on GCC) to work around an compiler internal error */ \
-    typedef \
-        void (*BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_TAG_(id))( \
-            int BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_FUNC_(id) \
-        ) \
-    ; \
-    typedef \
-        BOOST_PP_IIF(typename01, BOOST_TYPEOF_TPL, BOOST_TYPEOF)( \
-            ::boost::scope_exit::detail::wrap( \
-                ::boost::scope_exit::detail::deref( \
-                    BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_FUNC_(id), \
-                    (BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_TAG_(id))0 \
-                ) \
-            ) \
-        ) \
-        BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_WRAP_(id) \
-    ; \
-    typedef BOOST_PP_EXPR_IIF(typename01, typename) \
-        BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_WRAP_(id)::type \
-        BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_CAPTURE_(id) \
-    ; \
+    /* tagging, wrapping, etc as from ScopeExit type deduction are */ \
+    /* necessary within templates (at least on GCC) to work around an */ \
+    /* compiler internal errors) */ \
+    BOOST_SCOPE_EXIT_DETAIL_TAG_DECL(0, /* no recursive step r */ \
+            id, BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_INDEX_, \
+            BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_FUNC_(id)) \
+    BOOST_SCOPE_EXIT_DETAIL_CAPTURE_DECL(0, /* no recursive step r */ \
+            ( id, BOOST_PP_EXPR_IIF(typename01, typename) ), \
+            BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_INDEX_, \
+            BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_FUNC_(id)) \
+    /* extra struct to workaround GCC and other compiler's issues */ \
     struct BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_PARAMS_(id) { \
-        /* internal to struct to workaround GCC and other compiler's issues */ \
         typedef \
             BOOST_PP_EXPR_IIF(typename01, typename) \
             ::boost::function_traits< \
                 BOOST_PP_EXPR_IIF(typename01, typename) \
                 ::boost::remove_pointer< \
-                    BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_CAPTURE_(id) \
+                    BOOST_SCOPE_EXIT_DETAIL_CAPTURE_T(id, \
+                            BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_INDEX_, \
+                            BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_FUNC_(id)) \
                 >::type \
             >::result_type \
             BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_TYPE_(id) \
@@ -87,6 +75,7 @@
 // Precondition: RETURNS(decl_traits) != NIL
 #define BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_TYPED_( \
         id, typename01, decl_traits) \
+    /* user specified result type here */ \
     struct BOOST_LOCAL_FUNCTION_AUX_CODE_RESULT_PARAMS_(id) { \
         typedef \
             BOOST_PP_LIST_FIRST( \
Modified: trunk/boost/scope_exit.hpp
==============================================================================
--- trunk/boost/scope_exit.hpp	(original)
+++ trunk/boost/scope_exit.hpp	2012-04-26 21:46:22 EDT (Thu, 26 Apr 2012)
@@ -508,11 +508,12 @@
 
 #define BOOST_SCOPE_EXIT_DETAIL_CAPTURE_DECL(r, id_ty, i, var) \
     struct BOOST_SCOPE_EXIT_AUX_WRAPPED(BOOST_PP_TUPLE_ELEM(2, 0, id_ty), i) \
+        /* no need to use TYPEOF_TPL here because it's within inheritance */ \
         : BOOST_TYPEOF(::boost::scope_exit::detail::wrap( \
                 BOOST_SCOPE_EXIT_AUX_DEREF(BOOST_PP_TUPLE_ELEM(2, 0, id_ty), \
                         i, var))) \
     {}; \
-    typedef BOOST_PP_TUPLE_ELEM(2, 1,id_ty) \
+    typedef BOOST_PP_TUPLE_ELEM(2, 1, id_ty) \
         BOOST_SCOPE_EXIT_AUX_WRAPPED(BOOST_PP_TUPLE_ELEM(2, 0, id_ty), i)::type\
         BOOST_SCOPE_EXIT_DETAIL_CAPTURE_T(BOOST_PP_TUPLE_ELEM(2, 0, id_ty), \
                 i, var) \
@@ -522,6 +523,7 @@
 
 #define BOOST_SCOPE_EXIT_DETAIL_CAPTURE_DECL(r, id_ty, i, var) \
     typedef \
+        /* no TYPEOF_TPL here because uses TYPEOF_KEYWORD directly */ \
         BOOST_TYPEOF_KEYWORD(BOOST_SCOPE_EXIT_AUX_DEREF( \
                 BOOST_PP_TUPLE_ELEM(2, 0, id_ty), i, var)) \
         BOOST_SCOPE_EXIT_DETAIL_CAPTURE_T(BOOST_PP_TUPLE_ELEM(2, 0, id_ty), \
@@ -532,6 +534,7 @@
 
 #define BOOST_SCOPE_EXIT_DETAIL_CAPTURE_DECL(r, id_ty, i, var) \
     typedef \
+        /* no need to use TYPEOF_TPL here because it's a typedef */ \
         BOOST_TYPEOF(::boost::scope_exit::detail::wrap( \
                 BOOST_SCOPE_EXIT_AUX_DEREF(BOOST_PP_TUPLE_ELEM(2, 0, id_ty), \
                         i, var))) \