On Tue, 2024-11-12 at 09:02 -0500, David Malcolm wrote:
> This patch uses the nested diagnostics capabilities added in the
> earlier
> patch in the C++ frontend.
> 
> With this, and enabling the non-standard text formatting via:
>   -fdiagnostics-set-output=text:experimental-nesting=yes
> and using:
>   -std=c++20 -fconcepts-diagnostics-depth=2
> then the output for the example in SG15's P3358R0 ("SARIF for
> Structured
> Diagnostics") is:
> 
> P3358R0.C: In function ‘int main()’:
> P3358R0.C:26:6: error: no matching function for call to ‘pet(lizard)’
>    26 |   pet(lizard{});
>       |   ~~~^~~~~~~~~~
>   • note: candidate: ‘template<class auto:1>  requires 
> pettable<auto:1> void pet(auto:1)’
>     P3358R0.C:21:6:
>        21 | void pet(pettable auto t);
>           |      ^~~
>     • note: template argument deduction/substitution failed:
>       • note: constraints not satisfied
>         • P3358R0.C: In substitution of ‘template<class auto:1> 
> requires  pettable<auto:1> void pet(auto:1) [with auto:1 = lizard]’:
>         • required from here
>           P3358R0.C:26:6:
>              26 |   pet(lizard{});
>                 |   ~~~^~~~~~~~~~
>         • required for the satisfaction of ‘pettable<auto:1>’ [with
> auto:1 = lizard]
>           P3358R0.C:19:9:
>              19 | concept pettable = has_member_pet<T> or
> has_default_pet<T>;
>                 |         ^~~~~~~~
>         • note: no operand of the disjunction is satisfied
>           P3358R0.C:19:38:
>              19 | concept pettable = has_member_pet<T> or
> has_default_pet<T>;
>                 |                   
> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
>           • note: the operand ‘has_member_pet<T>’ is unsatisfied
> because
>             P3358R0.C:19:20:
>                19 | concept pettable = has_member_pet<T> or
> has_default_pet<T>;
>                   |                   
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>             • required for the satisfaction of ‘has_member_pet<T>’
> [with T = lizard]
>               P3358R0.C:13:9:
>                  13 | concept has_member_pet = requires(T t) {
> t.pet(); };
>                     |         ^~~~~~~~~~~~~~
>             • required for the satisfaction of ‘pettable<auto:1>’
> [with auto:1 = lizard]
>               P3358R0.C:19:9:
>                  19 | concept pettable = has_member_pet<T> or
> has_default_pet<T>;
>                     |         ^~~~~~~~
>             • in requirements with ‘T t’ [with T = lizard]
>               P3358R0.C:13:26:
>                  13 | concept has_member_pet = requires(T t) {
> t.pet(); };
>                     |                         
> ^~~~~~~~~~~~~~~~~~~~~~~~~~
>             • note: the required expression ‘t.pet()’ is invalid,
> because
>               P3358R0.C:13:47:
>                  13 | concept has_member_pet = requires(T t) {
> t.pet(); };
>                     |                                         
> ~~~~~^~
>               • error: ‘struct lizard’ has no member named ‘pet’
>                 P3358R0.C:13:44:
>                    13 | concept has_member_pet = requires(T t) {
> t.pet(); };
>                       |                                         
> ~~^~~
>           • note: the operand ‘has_default_pet<T>’ is unsatisfied
> because
>             P3358R0.C:19:41:
>                19 | concept pettable = has_member_pet<T> or
> has_default_pet<T>;
>                   |                   
> ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
>             • required for the satisfaction of ‘has_default_pet<T>’
> [with T = lizard]
>               P3358R0.C:16:9:
>                  16 | concept has_default_pet = T::is_pettable;
>                     |         ^~~~~~~~~~~~~~~
>             • required for the satisfaction of ‘pettable<auto:1>’
> [with auto:1 = lizard]
>               P3358R0.C:19:9:
>                  19 | concept pettable = has_member_pet<T> or
> has_default_pet<T>;
>                     |         ^~~~~~~~
>             • error: ‘is_pettable’ is not a member of ‘lizard’
>               P3358R0.C:16:30:
>                  16 | concept has_default_pet = T::is_pettable;
>                     |                              ^~~~~~~~~~~
>   • note: candidate: ‘void pet(dog)’
>     P3358R0.C:9:6:
>         9 | void pet(dog);
>           |      ^~~
>     • note: no known conversion for argument 1 from ‘lizard’ to ‘dog’
>       P3358R0.C:9:10:
>           9 | void pet(dog);
>             |          ^~~
>   • note: candidate: ‘void pet(cat)’
>     P3358R0.C:10:6:
>        10 | void pet(cat);
>           |      ^~~
>     • note: no known conversion for argument 1 from ‘lizard’ to ‘cat’
>       P3358R0.C:10:10:
>          10 | void pet(cat);
>             |          ^~~
> 
> showing the hierarchical structure of the messages; ideally there
> would be a UI here allowing the user to expand/collapse the messages
> to drill out into the detail they are interested in.

For the curious, I've attached a screenshot of a colorized version of
this to PR other/116253 as:
  https://gcc.gnu.org/bugzilla/attachment.cgi?id=59580

Dave

Reply via email to