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<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
>
>
>
>

_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users