
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.
I think using the return value form on_warning() or on_hook() to decide if an exception should be thrown is an excellent idea. That would fit very well with my needs. Regards Andreas
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
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users