Andreas Sæbjørnsen wrote:
> The first '#elif' directive is registered as an
> 'evaluated_conditional_expression(...)', but the second
> '#elif' is never evaluated since the previous
> '#if' directive is true, and it is therefore not registered
> as either a 'skipped_token(...)' or an
> 'evaluated_conditional_expression(...)'. The way I
> expected it to work was to register it as a
> 'skipped_token(...)'. Do you have a suggestion to how I
> should otherwise be handling this?
> If not, could it be possible to add the non-evaluated '#elif'
> to the skipped token stream?
This is fixed now (Boost CVS::HEAD and Boost CVS::BOOST_RC_1_34). Thanks for
reporting.
Thank you very much! I appreciate the fast fix.
> The suggestion is for preprocessor generated tokens where the
> 'macro.get_position
().get_file().size() == 0'. An example
> of this is in the following code
>
> #ifdef SOME_MACRO
> //DO SOMETHING
> #endif
>
> Since 'SOME_MACRO' is not defined the
> 'expanding_object_like_macro(TokenT const ¯o,....)' will
> be passed a TokentT& const& macro
> with no position object, so asking for the line or column
> number will give a hard to debug segmentation fault.
This one is really strange, because if SOME_MACRO is not defined then the
expanding_object_like_macro() pp hook shouldn't be called for this macro.
For this reason I'm not able to reproduce this issue here.
Nevertheless, I think it's a bug if 'macro.get_position().get_file().size()
== 0' in any case (any token should have some associated file/position it
was encountered at). Could you please try to isolate this problem and send
me a sample?
No problem. I will send it to you as soon as I have it. :)
A change I have done to Wave which I have not told you about earlier is to
change the behaviour of on_warning(...) in 'tboost/wave/util/cpp_iterator.hpp' to
continue if a #warning directive is found, and not treat it like an error. I do not know
if the CVS-version still behaves in this way. I also added a preprocessing hook
on_warning(..) for the warning directive as I need to extract it. What do you think of this
change? (Code Below for on_warning. Changed 'preprocessing_hooks.hpp' attached).
Thanks
Andreas
#if BOOST_WAVE_SUPPORT_WARNING_DIRECTIVE != 0
///////////////////////////////////////////////////////////////////////////////
//
// on_warning(): handle #warning directives
//
///////////////////////////////////////////////////////////////////////////////
template <typename ContextT>
inline void
pp_iterator_functor<ContextT>::on_warning(
typename parse_tree_type::const_iterator const &begin,
typename parse_tree_type::const_iterator const &end)
{
BOOST_ASSERT(ctx.get_if_block_status());
// preprocess the given sequence into the provided list
token_sequence_type expanded;
get_token_value<result_type, parse_node_type> get_value;
typename ref_transform_iterator_generator<
get_token_value<result_type, parse_node_type>,
typename parse_tree_type::const_iterator
>::type first = make_ref_transform_iterator(begin, get_value);
#if BOOST_WAVE_PREPROCESS_ERROR_MESSAGE_BODY != 0
// preprocess the body of this #warning message
token_sequence_type toexpand;
std::copy(first, make_ref_transform_iterator(end, get_value),
std::inserter(toexpand, toexpand.end()));
typename token_sequence_type::iterator begin2 = toexpand.begin();
ctx.expand_whole_tokensequence(begin2, toexpand.end(), expanded,
false);
#else
// simply copy the body of this #warning message to the issued diagnostic
// message
std::copy(first, make_ref_transform_iterator(end, get_value),
std::inserter(expanded, expanded.end()));
#endif
//AS(051706) Added an extra hook to send the warning directive
std::cout << "The warning is: " << boost::wave::util::impl::as_string(expanded).c_str()
<< std::endl;
ctx.get_hooks().on_warning(toexpand);
//AS(051606) Do not treat warning directives as errors
#if 0
// report the corresponding error
BOOST_WAVE_THROW(preprocess_exception, warning_directive,
boost::wave::util::impl::as_string(expanded).c_str(), act_pos);
#endif
}
#endif // BOOST_WAVE_SUPPORT_WARNING_DIRECTIVE != 0
Regards Hartmut
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users