$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: [boost] Problems with proto and /clr
From: Jorge Lodos Vigil (lodos_at_[hidden])
Date: 2011-10-11 07:40:48
Hi
In boost 1.47 proto stopped compiling with /clr in VS2008 and VS2010. Take the calc3 example, for instance.
The root problem is that /clr is instantiating templates that normally are not.
The change in proto is the new is_applyable metafunction. In normal compilation, when the received parameter is not callable mpl::and_ ensures that there is no need to fully instantiate the is_transform metafunction parameter. Apparently when using /clr it gets instantiated any way.
You may verify this commenting out the 3 BOOST_MPL_ASSERT_RELATION lines in calc3 sample (so it will compile) and adding the following in the main function:
// This is an instantiation of is_applyable that causes problems
typedef boost::mpl::max<CalculatorGrammar,boost::proto::_state> is_applyable_parameter_t;
// This is why it normally compiles
BOOST_MPL_ASSERT_NOT((boost::proto::is_callable<is_applyable_parameter_t>));
// The following correctly fails to compile, the is_transform metafunction must never be instantiated
//bool is_tranform = boost::proto::is_transform<is_applyable_parameter_t>::value;
// This is the line that does not compile with /clr but normally does
typedef mpl::and_<mpl::false_, boost::proto::is_transform<is_applyable_parameter_t> > problem_t;
This code fails to compile with /clr, because is_applyable_parameter_t is instantiated and CalculatorGrammar is not comparable.
Before I continue to dig in proto code, try workarounds and create tickets, I thought I might ask these questions here:
1. In case a workaround can be found (decomposing is_applyable in 2 metafunctions, for instance) is it of interest to support /clr?
2. Is this situation a compiler bug, a proto bug or just bad luck + undefined behavior?
I'll appreciate any comment you may have on this. Please note that this causes xpressive and probably spirit to fail compilation with /clr.
On a side note note, if there is interest to support /clr, it should not be a problem to modify MSVC test scripts. Only the /clr parameter must be added to the command line, nothing else. Apparently there is no big demand for C++ with /clr, but if there is interest I could try to modify tests scripts and correct any problem that may surface.
Thank you in advance for your time.
Best regards
Jorge