https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116253

--- Comment #10 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Malcolm <dmalc...@gcc.gnu.org>:

https://gcc.gnu.org/g:339246fb9ef4cac84126138093303f309071e40e

commit r15-5995-g339246fb9ef4cac84126138093303f309071e40e
Author: David Malcolm <dmalc...@redhat.com>
Date:   Fri Dec 6 13:40:55 2024 -0500

    c++: use diagnostic nesting [PR116253]

    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.

    The structure is also captured in SARIF output (via the "nestingLevel"
    property).

    gcc/cp/ChangeLog:
            PR other/116253
            * call.cc (print_conversion_rejection): Remove leading space from
            diagnostic messages.
            (print_conversion_rejection): Likewise.
            (print_arity_information): Likewise.
            (print_z_candidate): Likewise.  Add auto_diagnostic_nesting_level
            before calls to fn_type_unification and diagnose_constraints.
            (print_z_candidates): Add auto_diagnostic_nesting_level before
            looping over candidates.
            (conversion_null_warnings): Remove leading space from
            diagnostic messages.
            (maybe_inform_about_fndecl_for_bogus_argument_init): Likewise.
            * constraint.cc (tsubst_valid_expression_requirement): Add
            auto_diagnostic_nesting_level when showing why the expression is
            invalid.
            (satisfy_disjunction): Likewise when showing operans, and again
            when replaying each branch of the disjunction.
            (diagnose_constraints): Likewise when replaying satisfaction.
            * error.cc (cp_diagnostic_text_starter): Set prefix.
            (print_instantiation_full_context): Only show the file
            if we're not showing nesting or the user has opted in to
            showing location information in nested diagnostics.
            (class auto_context_line): New.
            (print_instantiation_partial_context_line): Replace calls to
            print_location and to diagnostic_show_locus with an
            auto_context_line.
            (print_instantiation_partial_context): Replace calls to
            print_location with an auto_context_line.
            (maybe_print_constexpr_context): Likewise.
            (print_constrained_decl_info): Likewise.
            (print_concept_check_info): Likewise.
            (print_constraint_context_head): Likewise.
            (print_requires_expression_info): Likewise.

    gcc/testsuite/ChangeLog:
            PR other/116253
            * g++.dg/concepts/nested-diagnostics-1-truncated.C: New test.
            * g++.dg/concepts/nested-diagnostics-1.C: New test.
            * g++.dg/concepts/nested-diagnostics-2.C: New test.

    Signed-off-by: David Malcolm <dmalc...@redhat.com>

Reply via email to