
Andreas Sæbjørnsen wrote:
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).
Hmmm. The 'warning_directive' preprocess_exception is recoverable. That means you may simply continue to iterate after catching this type of exception (see the wave driver how this may be achieved). That's the reason why I made the warning to throw an exception (same as #error). I'm not sure if we really should change this behaviour (even more as the driver currently depends on that). OTOH I like your idea to add a on_warning() pp hook function (same should be added for #error as well). What do you think, what if we use the return value of the on_warning() pp hook to decide, whether to throw the exception? This way we could keep the default behaviour (throwing) but you could enforce the non-throwing behaviour simply by returning false. Regards Hartmut
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
get_value; typename ref_transform_iterator_generator< get_token_value
, 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