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

--- Comment #1 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:3dcce649a1e0833a4c3bb9ced4b9c0b38c3fb8a5

commit r16-1404-g3dcce649a1e0833a4c3bb9ced4b9c0b38c3fb8a5
Author: David Malcolm <dmalc...@redhat.com>
Date:   Tue Jun 10 20:06:37 2025 -0400

    diagnostics: fix tag nesting issues in experimental-html sink [PR120610]

    I've been seeing issues in the experimental-html sink where the nesting
    of tags goes wrong.

    The two issues I've seen are:
    * the pp_token_list from the diagnostic message that reaches the
      html_token_printer doesn't always have matching pairs of begin/end
      tokens (PR other/120610)
    * a bug in diagnostic-show-locus where there was a stray xp.pop_tag,
      in print_trailing_fixits.

    This patch:
    * changes the xml::printer::pop_tag API so that it now takes the
      expected name of the element being popped (rather than expressing this
      in comments), and that, by default, the xml::printer asserts that this
      matches.
    * gives the html_token_printer its own xml::printer instance to restrict
      the affected area of the DOM tree; this xml::printer doesn't enforce
      nesting (PR other/120610)
    * adds RAII sentinel classes that automatically check for pushes/pops
      being balanced within a scope, using them in various places
    * fixes the bug in print_trailing_fixits for html output

    gcc/ChangeLog:
            PR other/120610
            * diagnostic-format-html.cc (html_builder::html_builder): Update
            for new param of xml::printer::pop_tag.
            (html_path_label_writer::end_label): Likewise.
            (html_builder::make_element_for_diagnostic::html_token_printer):
            Give the instance its own xml::printer.  Update for new param of
            xml::printer::pop_tag.
            (html_builder::make_element_for_diagnostic): Give the instance its
            own xml::printer.
            (html_builder::make_metadata_element): Update for new param of
            xml::printer::pop_tag.
            (html_builder::flush_to_file): Likewise.
            * diagnostic-path-output.cc (begin_html_stack_frame): Likewise.
            (begin_html_stack_frame): Likewise.
            (end_html_stack_frame): Likewise.
            (print_path_summary_as_html): Likewise.
            * diagnostic-show-locus.cc
            (struct to_text::auto_check_tag_nesting): New.
            (struct to_html:: auto_check_tag_nesting): New.
            (to_text::pop_html_tag): Change param to const char *.
            (to_html::pop_html_tag): Likewise; rename param to
            "expected_name".
            (default_diagnostic_start_span_fn<to_html>): Update for new param
            of xml::printer::pop_tag.
            (layout_printer<to_html>::end_label): Likewise.
            (layout_printer<Sink>::print_trailing_fixits): Add RAII sentinel
            to check tag nesting for the HTML case.  Delete stray popping
            of "td" in the presence of fix-it hints.
            (layout_printer<Sink>::print_line): Add RAII sentinel
            to check tag nesting for the HTML case.
            (diagnostic_source_print_policy::print_as_html): Likewise.
            (layout_printer<Sink>::print): Likewise.
            * xml-printer.h (xml::printer::printer): Add optional
            "check_popped_tags" param.
            (xml::printer::pop_tag): Add "expected_name" param.
            (xml::printer::get_num_open_tags): New accessor.
            (xml::printer::dump): New decl.
            (xml::printer::m_check_popped_tags): New field.
            (class xml::auto_check_tag_nesting): New.
            (class xml::auto_print_element): Update for new param of pop_tag.
            * xml.cc: Move pragma pop so that the pragma also covers
            xml::printer's member functions, "dump" in particular.
            (xml::printer::printer): Add param "check_popped_tags".
            (xml::printer::pop_tag): Add param "expected_name" and use it to
assert
            that the popped tag is as expected.  Assert that we have a tag to
            pop.
            (xml::printer::dump): New.
            (selftest::test_printer): Update for new param of pop_tag.
            (selftest::test_attribute_ordering): Likewise.

    gcc/testsuite/ChangeLog:
            PR other/120610
            * gcc.dg/format/diagnostic-ranges-html.py: Remove out-of-date
            comment.

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

Reply via email to