Opened 14 years ago

Closed 14 years ago

#2246 closed Bugs (fixed)

Phoenix2 lazy function compilation error

Reported by: François Barel <frabar666@…> Owned by: Joel de Guzman
Milestone: Boost 1.37.0 Component: spirit
Version: Boost 1.36.0 Severity: Problem
Keywords: phoenix lazy function Cc:

Description

I get a compilation error when trying to do a lazy Phoenix function.

By that I mean a Phoenix function (for use in a Spirit action) which is in fact the result of calling another Phoenix actor (in my case a phoenix::bind) -- as the implementation of function, compose and function_eval seems to allow (IIUC the function can be any Phoenix actor, just like its arguments).


Repro:

#include <boost/spirit/include/qi.hpp>
using namespace ::boost::spirit;
using namespace ::boost::spirit::qi;

#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
using namespace ::boost::phoenix;

template< typename F >
function< F > make_function(const F& f)
    { return function< F >(f); }

struct Actor
{
    typedef void result_type;
    template< typename T = unused_type >
    struct result { typedef result_type type; };
    void operator()(int) const { assert( this != NULL ); }
};

struct Context
{
    const Actor* pa;
};

int main()
{
    Context c = { NULL };
    Actor a;

    rule< const wchar_t* > r;
    // Not lazy, fine.
    r = eps[ make_function( a                        )(42) ];
    // Lazy, compilation error.
    r = eps[ make_function( *bind( &Context::pa, c ) )(42) ];

    c.pa = &a;

    const wchar_t* x = L"";
    parse(x, x, r);

    return 0;
}

The error is (note the '&'):

boost/spirit/home/phoenix/core/detail/function_eval.hpp:108:
  error: ‘const Actor&’ is not a class, struct, or union type


The attached patch (remove_reference when getting function type) solved it for me.

Francois

Attachments (1)

Phoenix2_lazy.diff (1008 bytes ) - added by François Barel <frabar666@…> 14 years ago.

Download all attachments as: .zip

Change History (2)

by François Barel <frabar666@…>, 14 years ago

Attachment: Phoenix2_lazy.diff added

comment:1 by Joel de Guzman, 14 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.