> On Oct 31, 2024, at 12:55, David Malcolm <dmalc...@redhat.com> wrote:
> 
> On Wed, 2024-10-30 at 20:51 +0000, Qing Zhao wrote:
>> Hi, David,
>> 
>>> On Oct 30, 2024, at 14:54, David Malcolm <dmalc...@redhat.com>
>>> wrote:
>>> 
>>> On Wed, 2024-10-30 at 15:53 +0000, Qing Zhao wrote:
>>>> 
>>>> 
>>>>> On Oct 30, 2024, at 10:48, David Malcolm <dmalc...@redhat.com>
>>>>> wrote:
>>>>> 
>>>>> On Wed, 2024-10-30 at 14:34 +0000, Sam James wrote:
>>>>>> Qing Zhao <qing.z...@oracle.com> writes:
>>>>>> 
>>>>>>> Control this with a new option -fdiagnostics-details.
>>>>>>> 
>>> 
> 
> [...]
> 
>> 
>>>> Should I control the creation of “rich_location" with the flag
>>>> “flag_diagnostics_details” (Similar as I control the creation of
>>>> “move_history” data structure with the flag
>>>> “flag_diagnostics_details”? 
>>>> 
>>>> If so, how should I do it? Do you have a suggestion on a clean
>>>> and
>>>> simply coding here (Sorry for the stupid question on this)
>>> 
>>> You can probably do all of this on the stack; make a new
>>> rich_location
>>> subclass, with something like:
>>> 
>>> class rich_location_with_details : public gcc_rich_location
>>> {
>>> public:
>>>  rich_location_with_details (location_t location, gimple *stmt);
>>> 
>>> private:
>>>  class deferred_move_history_path {
>>>  public:
>>>     deferred_move_history_path (location_t location, gimple *stmt)
>>>     : m_location (location), m_stmt (stmt)
>>>     {
>>>     }
>>> 
>>>     std::unique_ptr<diagnostic_path>
>>>     make_path () const final override;
>>>     /* TODO: you'll need to implement this; it will be called on
>>>        demand if a diagnostic is acutally emitted for this
>>>        rich_location.  */
>> 
>> What do you mean by “it will be called on demand if a diagnostic is
>> actually emitted”? 
>> Do I need to do anything special in the code to call this
>> “make_path”? 
> 
> I think I got the above wrong, sorry - I meant
> deferred_move_history_path to be derived from the
> deferred_diagnostic_path from my patch

Okay, I see. 
> 
> I've rewritten my patch somewhat, and I pushed it to trunk as r15-4807
> a few minutes ago:
> https://gcc.gnu.org/pipermail/gcc-patches/2024-October/667070.html
> I renamed "deferred_diagnostic_path" to "lazy_diagnostic_path" which
> hopefully is a clearer name.
> 
> 
> With that, I think you want something like rich_location subclass
> (caveat: untested):
> 
> #include "lazy-diagnostic-path.h"
> 
> /* A rich_location subclass that lazily populates a diagnostic_path   
> with move history events, but only if the path is actually to be
>   used.  */
> 
> class rich_location_with_details : public gcc_rich_location
> {
> public:
>  rich_location_with_details (location_t location, gimple *stmt)
>  : gcc_rich_location (location),
>    m_deferred_move_history_path (location, stmt)
>  {
>    set_path (&m_deferred_move_history_path);
>  }
> 
> private:
>  class lazy_move_history_path : public lazy_diagnostic_path {
>  public:
>     lazy_move_history_path (location_t location, gimple *stmt)
>     : m_location (location), m_stmt (stmt)
>     {
>     }
> 
>     std::unique_ptr<diagnostic_path>
>     make_inner_path () const final override;
>     /* TODO: you'll need to implement this; it will be called on
>        demand if a diagnostic is actually emitted for this
>        rich_location.  */
> 
>    location_t m_location;
>    gimple *m_stmt;
>  } m_lazy_move_history_path;
> };
> 
> ...and with that support subclass, you should be able to do something like
> this to make them on the stack:
> 
>   rich_location_with_details richloc (location, stmt);
>   warned = warning_at (&richloc, OPT_Warray_bounds_,
>                 "array subscript %E is outside array"
>                        " bounds of %qT", low_sub_org, artype);
> 
> and all that will be done in richloc's constructor will be some cheap
> field initializations.
> 
> Only if a diagnostic actually gets emitted will
>  lazy_move_history_path::make_inner_path
> be called, at which point it can query the move history and make a path
> with the appropriate events.

Now, I understand. Thanks a lot for the detailed explanation.

> 
> There's an example of this approach in test_emission in
> https://gcc.gnu.org/pipermail/gcc-patches/2024-October/667070.html
> which has types test_lazy_path and test_rich_location, which are
> analogous to lazy_move_history_path and rich_location_with_details
> above.

Thanks a  lot for the example, it’s very helpful.
> 
> Hope this makes sense; sorry for being unclear.  Alternatively I can
> have a go at implementing this if you send me the latest version of
> your patches.

I will try to write this myself, if there is any issue, I will ask for your 
help.

Again, thanks a lot for the help.

Qing
> 
> Dave


Reply via email to