[gcc r16-1344] diagnostics: fix <title> of experimental-html output [PR116792]

David Malcolm dmalcolm@gcc.gnu.org
Mon Jun 9 13:43:29 GMT 2025


https://gcc.gnu.org/g:82de4cada8669639a8474808db48d63ffade2bcb

commit r16-1344-g82de4cada8669639a8474808db48d63ffade2bcb
Author: David Malcolm <dmalcolm@redhat.com>
Date:   Mon Jun 9 09:40:06 2025 -0400

    diagnostics: fix <title> of experimental-html output [PR116792]
    
    Add a new vfunc diagnostic_output_format::set_main_input_filename
    so that we can separate setting the <title> of HTML output and
    the diagnostic_artifact_role::analysis_target of SARIF output from
    creation of the sinks.  Calling it is done by the various creators
    of the sinks.
    
    gcc/ChangeLog:
            PR other/116792
            * diagnostic-format-html.cc (html_builder::m_title_element): New
            field.
            (html_builder::html_builder): Initialize it.  Don't add
            placeholder text.
            (html_builder::set_main_input_filename): New.
            (html_output_format::set_main_input_filename): New.
            (test_html_diagnostic_context::test_html_diagnostic_context): Call
            set_main_input_filename on the new sink.
            (seldtest::test_simple_log): Update expected <title> text.
            * diagnostic-format-json.cc (diagnostic_output_format_init_json):
            Return a reference to the new sink.
            (diagnostic_output_format_init_json_stderr): Likewise.
            (diagnostic_output_format_init_json_file): Likewise.
            * diagnostic-format-sarif.cc (sarif_builder::sarif_builder): Drop
            "main_input_filename_" param, and move adding an artifact for it
            with diagnostic_artifact_role::analysis_target to...
            (sarif_builder::set_main_input_filename): ...this new function.
            (sarif_output_format::set_main_input_filename): New.
            (sarif_output_format::sarif_output_format): Drop
            "main_input_filename_" param.
            (sarif_stream_output_format::sarif_stream_output_format):
            Likewise.
            (sarif_file_output_format::sarif_file_output_format): Likewise.
            (diagnostic_output_format_init_sarif): Return a reference to *FMT.
            (diagnostic_output_format_init_sarif_stderr): Return a refererence
            to the new sink.  Drop "main_input_filename_" param.
            (diagnostic_output_format_init_sarif_file): Likewise.
            (diagnostic_output_format_init_sarif_stream): Likewise.
            (make_sarif_sink): Drop "main_input_filename_" param.
            (selftest::test_sarif_diagnostic_context::test_sarif_diagnostic_context):
            Likewise.  Call set_main_input_filename on the new format.
            (selftest::test_sarif_diagnostic_context::buffered_output_format::buffered_output_format):
            Drop "main_input_filename_" param.
            (selftest::test_make_location_object): Likewise.
            * diagnostic-format-sarif.h
            (diagnostic_output_format_init_sarif_stderr): Return a refererence
            to the new sink.  Drop "main_input_filename_" param.
            (diagnostic_output_format_init_sarif_file): Likewise.
            (diagnostic_output_format_init_sarif_stream): Likewise.
            (make_sarif_sink): Drop "main_input_filename_" param.
            * diagnostic-format.h
            (diagnostic_output_format::set_main_input_filename): New vfunc.
            (diagnostic_output_format_init_json_stderr): Return a refererence
            to the new sink.
            (diagnostic_output_format_init_json_file): Likewise.
            * diagnostic.cc (diagnostic_output_format_init): Likewise.  Call
            set_main_input_filename on the new sink.
            * libgdiagnostics.cc (sarif_sink::sarif_sink): Update for above
            changes.
            * opts-diagnostic.cc (sarif_scheme_handler::make_sink): Likewise.
            (handle_OPT_fdiagnostics_add_output_): Likewise.
            (handle_OPT_fdiagnostics_set_output_): Likewise.
    
    gcc/testsuite/ChangeLog:
            PR other/116792
            * gcc.dg/html-output/missing-semicolon.py: Update expected <title>
            text.  Drop out-of-date comment.
    
    Signed-off-by: David Malcolm <dmalcolm@redhat.com>

Diff:
---
 gcc/diagnostic-format-html.cc                      | 27 ++++++-
 gcc/diagnostic-format-json.cc                      | 23 ++++--
 gcc/diagnostic-format-sarif.cc                     | 91 ++++++++++++----------
 gcc/diagnostic-format-sarif.h                      | 10 +--
 gcc/diagnostic-format.h                            |  9 ++-
 gcc/diagnostic.cc                                  | 29 +++----
 gcc/libgdiagnostics.cc                             |  2 +-
 gcc/opts-diagnostic.cc                             |  3 +-
 .../gcc.dg/html-output/missing-semicolon.py        | 25 +-----
 9 files changed, 118 insertions(+), 101 deletions(-)

diff --git a/gcc/diagnostic-format-html.cc b/gcc/diagnostic-format-html.cc
index ea2dbbba9293..ddf6ba0f4cfc 100644
--- a/gcc/diagnostic-format-html.cc
+++ b/gcc/diagnostic-format-html.cc
@@ -104,6 +104,9 @@ public:
 		const line_maps *line_maps,
 		const html_generation_options &html_gen_opts);
 
+  void
+  set_main_input_filename (const char *name);
+
   void on_report_diagnostic (const diagnostic_info &diagnostic,
 			     diagnostic_t orig_diag_kind,
 			     diagnostic_html_format_buffer *buffer);
@@ -151,6 +154,7 @@ private:
 
   std::unique_ptr<xml::document> m_document;
   xml::element *m_head_element;
+  xml::element *m_title_element;
   xml::element *m_diagnostics_element;
   std::unique_ptr<xml::element> m_cur_diagnostic_element;
   int m_next_diag_id; // for handing out unique IDs
@@ -348,6 +352,7 @@ html_builder::html_builder (diagnostic_context &context,
   m_line_maps (line_maps),
   m_html_gen_opts (html_gen_opts),
   m_head_element (nullptr),
+  m_title_element (nullptr),
   m_diagnostics_element (nullptr),
   m_next_diag_id (0)
 {
@@ -367,7 +372,7 @@ html_builder::html_builder (diagnostic_context &context,
       m_head_element = xp.get_insertion_point ();
       {
 	xml::auto_print_element title (xp, "title", true);
-	xp.add_text ("Title goes here");
+	m_title_element = xp.get_insertion_point ();
       }
       if (m_html_gen_opts.m_css)
 	xp.add_raw (HTML_STYLE);
@@ -392,6 +397,17 @@ html_builder::html_builder (diagnostic_context &context,
   }
 }
 
+void
+html_builder::set_main_input_filename (const char *name)
+{
+  gcc_assert (m_title_element);
+  if (name)
+    {
+      m_title_element->m_children.clear ();
+      m_title_element->add_text (name);
+    }
+}
+
 /* Implementation of "on_report_diagnostic" for HTML output.  */
 
 void
@@ -765,6 +781,12 @@ public:
     diagnostic_output_format::dump (out, indent);
   }
 
+  void
+  set_main_input_filename (const char *name) final override
+  {
+    m_builder.set_main_input_filename (name);
+  }
+
   std::unique_ptr<diagnostic_per_format_buffer>
   make_per_format_buffer () final override
   {
@@ -940,6 +962,7 @@ public:
 							       line_table,
 							       html_gen_opts);
     sink->update_printer ();
+    sink->set_main_input_filename ("(main input filename)");
     m_format = sink.get (); // borrowed
 
     set_output_format (std::move (sink));
@@ -998,7 +1021,7 @@ test_simple_log ()
       "     \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
       "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
       "  <head>\n"
-      "    <title>Title goes here</title>\n"
+      "    <title>(main input filename)</title>\n"
       "  </head>\n"
       "  <body>\n"
       "    <div class=\"gcc-diagnostic-list\">\n"
diff --git a/gcc/diagnostic-format-json.cc b/gcc/diagnostic-format-json.cc
index 205678dbe041..fb5489778358 100644
--- a/gcc/diagnostic-format-json.cc
+++ b/gcc/diagnostic-format-json.cc
@@ -505,40 +505,47 @@ private:
 };
 
 /* Populate CONTEXT in preparation for JSON output (either to stderr, or
-   to a file).  */
+   to a file) using FMT.  Return a reference to *FMT.  */
 
-static void
+static diagnostic_output_format &
 diagnostic_output_format_init_json (diagnostic_context &context,
 				    std::unique_ptr<json_output_format> fmt)
 {
+  gcc_assert (fmt);
+  diagnostic_output_format &out = *fmt;
+
   /* Don't colorize the text.  */
   pp_show_color (fmt->get_printer ()) = false;
   context.set_show_highlight_colors (false);
 
   context.set_output_format (std::move (fmt));
+
+  return out;
 }
 
-/* Populate CONTEXT in preparation for JSON output to stderr.  */
+/* Populate CONTEXT in preparation for JSON output to stderr.
+   Return a reference to the context's new sink.  */
 
-void
+diagnostic_output_format &
 diagnostic_output_format_init_json_stderr (diagnostic_context &context,
 					   bool formatted)
 {
-  diagnostic_output_format_init_json
+  return diagnostic_output_format_init_json
     (context,
      std::make_unique<json_stderr_output_format> (context,
 						  formatted));
 }
 
 /* Populate CONTEXT in preparation for JSON output to a file named
-   BASE_FILE_NAME.gcc.json.  */
+   BASE_FILE_NAME.gcc.json.
+   Return a reference to the context's new sink.  */
 
-void
+diagnostic_output_format &
 diagnostic_output_format_init_json_file (diagnostic_context &context,
 					 bool formatted,
 					 const char *base_file_name)
 {
-  diagnostic_output_format_init_json
+  return diagnostic_output_format_init_json
     (context,
      std::make_unique<json_file_output_format> (context,
 						formatted,
diff --git a/gcc/diagnostic-format-sarif.cc b/gcc/diagnostic-format-sarif.cc
index 454eaae4d905..7dcd126aeb23 100644
--- a/gcc/diagnostic-format-sarif.cc
+++ b/gcc/diagnostic-format-sarif.cc
@@ -751,7 +751,6 @@ public:
   sarif_builder (diagnostic_context &context,
 		 pretty_printer &printer,
 		 const line_maps *line_maps,
-		 const char *main_input_filename_,
 		 std::unique_ptr<sarif_serialization_format> serialization_format,
 		 const sarif_generation_options &sarif_gen_opts);
   ~sarif_builder ();
@@ -767,6 +766,9 @@ public:
     return m_logical_loc_mgr;
   }
 
+  void
+  set_main_input_filename (const char *name);
+
   void on_report_diagnostic (const diagnostic_info &diagnostic,
 			     diagnostic_t orig_diag_kind,
 			     diagnostic_sarif_format_buffer *buffer);
@@ -1643,7 +1645,6 @@ sarif_thread_flow::add_location ()
 sarif_builder::sarif_builder (diagnostic_context &context,
 			      pretty_printer &printer,
 			      const line_maps *line_maps,
-			      const char *main_input_filename_,
 			      std::unique_ptr<sarif_serialization_format> serialization_format,
 			      const sarif_generation_options &sarif_gen_opts)
 : m_context (context),
@@ -1672,17 +1673,6 @@ sarif_builder::sarif_builder (diagnostic_context &context,
 
   if (auto client_data_hooks = context.get_client_data_hooks ())
     m_logical_loc_mgr = client_data_hooks->get_logical_location_manager ();
-
-  /* Mark MAIN_INPUT_FILENAME_ as the artifact that the tool was
-     instructed to scan.
-     Only quote the contents if it gets referenced by physical locations,
-     since otherwise the "no diagnostics" case would quote the main input
-     file, and doing so noticeably bloated the output seen in analyzer
-     integration testing (build directory went from 20G -> 21G).  */
-  if (main_input_filename_)
-    get_or_create_artifact (main_input_filename_,
-			    diagnostic_artifact_role::analysis_target,
-			    false);
 }
 
 sarif_builder::~sarif_builder ()
@@ -1820,6 +1810,20 @@ sarif_builder::make_stack_from_backtrace ()
   return stack;
 }
 
+void
+sarif_builder::set_main_input_filename (const char *name)
+{
+  /* Mark NAME as the artifact that the tool was instructed to scan.
+     Only quote the contents if it gets referenced by physical locations,
+     since otherwise the "no diagnostics" case would quote the main input
+     file, and doing so noticeably bloated the output seen in analyzer
+     integration testing (build directory went from 20G -> 21G).  */
+  if (name)
+    get_or_create_artifact (name,
+			    diagnostic_artifact_role::analysis_target,
+			    false);
+}
+
 /* Implementation of "on_report_diagnostic" for SARIF output.  */
 
 void
@@ -3657,6 +3661,12 @@ public:
     diagnostic_output_format::dump (out, indent);
   }
 
+  void
+  set_main_input_filename (const char *name) final override
+  {
+    m_builder.set_main_input_filename (name);
+  }
+
   std::unique_ptr<diagnostic_per_format_buffer>
   make_per_format_buffer () final override
   {
@@ -3722,11 +3732,10 @@ public:
 protected:
   sarif_output_format (diagnostic_context &context,
 		       const line_maps *line_maps,
-		       const char *main_input_filename_,
 		       std::unique_ptr<sarif_serialization_format> serialization_format,
 		       const sarif_generation_options &sarif_gen_opts)
   : diagnostic_output_format (context),
-    m_builder (context, *get_printer (), line_maps, main_input_filename_,
+    m_builder (context, *get_printer (), line_maps,
 	       std::move (serialization_format), sarif_gen_opts),
     m_buffer (nullptr)
   {}
@@ -3740,11 +3749,10 @@ class sarif_stream_output_format : public sarif_output_format
 public:
   sarif_stream_output_format (diagnostic_context &context,
 			      const line_maps *line_maps,
-			      const char *main_input_filename_,
 			      std::unique_ptr<sarif_serialization_format> serialization_format,
 			      const sarif_generation_options &sarif_gen_opts,
 			      FILE *stream)
-  : sarif_output_format (context, line_maps, main_input_filename_,
+  : sarif_output_format (context, line_maps,
 			 std::move (serialization_format), sarif_gen_opts),
     m_stream (stream)
   {
@@ -3766,11 +3774,10 @@ class sarif_file_output_format : public sarif_output_format
 public:
   sarif_file_output_format (diagnostic_context &context,
 			    const line_maps *line_maps,
-			    const char *main_input_filename_,
 			    std::unique_ptr<sarif_serialization_format> serialization_format,
 			    const sarif_generation_options &sarif_gen_opts,
 			    diagnostic_output_file output_file)
-  : sarif_output_format (context, line_maps, main_input_filename_,
+  : sarif_output_format (context, line_maps,
 			 std::move (serialization_format), sarif_gen_opts),
     m_output_file (std::move (output_file))
   {
@@ -3914,34 +3921,39 @@ sarif_builder::sarif_token_printer::print_tokens (pretty_printer *pp,
 }
 
 /* Populate CONTEXT in preparation for SARIF output (either to stderr, or
-   to a file).  */
+   to a file).
+   Return a reference to *FMT.  */
 
-static void
+static diagnostic_output_format &
 diagnostic_output_format_init_sarif (diagnostic_context &context,
 				     std::unique_ptr<sarif_output_format> fmt)
 {
+  gcc_assert (fmt);
+  diagnostic_output_format &out = *fmt;
+
   fmt->update_printer ();
 
   context.set_output_format (std::move (fmt));
+
+  return out;
 }
 
-/* Populate CONTEXT in preparation for SARIF output to stderr.  */
+/* Populate CONTEXT in preparation for SARIF output to stderr.
+   Return a reference to the new sink.  */
 
-void
+diagnostic_output_format &
 diagnostic_output_format_init_sarif_stderr (diagnostic_context &context,
 					    const line_maps *line_maps,
-					    const char *main_input_filename_,
 					    bool formatted)
 {
   gcc_assert (line_maps);
   const sarif_generation_options sarif_gen_opts;
   auto serialization
     = std::make_unique<sarif_serialization_format_json> (formatted);
-  diagnostic_output_format_init_sarif
+  return diagnostic_output_format_init_sarif
     (context,
      std::make_unique<sarif_stream_output_format> (context,
 						   line_maps,
-						   main_input_filename_,
 						   std::move (serialization),
 						   sarif_gen_opts,
 						   stderr));
@@ -4018,12 +4030,12 @@ diagnostic_output_format_open_sarif_file (diagnostic_context &context,
 }
 
 /* Populate CONTEXT in preparation for SARIF output to a file named
-   BASE_FILE_NAME.sarif.  */
+   BASE_FILE_NAME.sarif.
+   Return a reference to the new sink.  */
 
-void
+diagnostic_output_format &
 diagnostic_output_format_init_sarif_file (diagnostic_context &context,
 					  line_maps *line_maps,
-					  const char *main_input_filename_,
 					  bool formatted,
 					  const char *base_file_name)
 {
@@ -4038,22 +4050,21 @@ diagnostic_output_format_init_sarif_file (diagnostic_context &context,
     = std::make_unique<sarif_serialization_format_json> (formatted);
 
   const sarif_generation_options sarif_gen_opts;
-  diagnostic_output_format_init_sarif
+  return diagnostic_output_format_init_sarif
     (context,
      std::make_unique<sarif_file_output_format> (context,
 						 line_maps,
-						 main_input_filename_,
 						 std::move (serialization),
 						 sarif_gen_opts,
 						 std::move (output_file)));
 }
 
-/* Populate CONTEXT in preparation for SARIF output to STREAM.  */
+/* Populate CONTEXT in preparation for SARIF output to STREAM.
+   Return a reference to the new sink.  */
 
-void
+diagnostic_output_format &
 diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
 					    const line_maps *line_maps,
-					    const char *main_input_filename_,
 					    bool formatted,
 					    FILE *stream)
 {
@@ -4061,11 +4072,10 @@ diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
   const sarif_generation_options sarif_gen_opts;
   auto serialization
     = std::make_unique<sarif_serialization_format_json> (formatted);
-  diagnostic_output_format_init_sarif
+  return diagnostic_output_format_init_sarif
     (context,
      std::make_unique<sarif_stream_output_format> (context,
 						   line_maps,
-						   main_input_filename_,
 						   std::move (serialization),
 						   sarif_gen_opts,
 						   stream));
@@ -4074,7 +4084,6 @@ diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
 std::unique_ptr<diagnostic_output_format>
 make_sarif_sink (diagnostic_context &context,
 		 const line_maps &line_maps,
-		 const char *main_input_filename_,
 		 std::unique_ptr<sarif_serialization_format> serialization,
 		 const sarif_generation_options &sarif_gen_opts,
 		 diagnostic_output_file output_file)
@@ -4082,7 +4091,6 @@ make_sarif_sink (diagnostic_context &context,
   auto sink
     = std::make_unique<sarif_file_output_format> (context,
 						  &line_maps,
-						  main_input_filename_,
 						  std::move (serialization),
 						  sarif_gen_opts,
 						  std::move (output_file));
@@ -4183,11 +4191,11 @@ public:
   {
     auto format = std::make_unique<buffered_output_format> (*this,
 							    line_table,
-							    main_input_filename,
 							    true,
 							    sarif_gen_opts);
     m_format = format.get (); // borrowed
     diagnostic_output_format_init_sarif (*this, std::move (format));
+    m_format->set_main_input_filename (main_input_filename);
   }
 
   std::unique_ptr<sarif_log> flush_to_object ()
@@ -4204,10 +4212,9 @@ private:
   public:
     buffered_output_format (diagnostic_context &context,
 			    const line_maps *line_maps,
-			    const char *main_input_filename_,
 			    bool formatted,
 			    const sarif_generation_options &sarif_gen_opts)
-    : sarif_output_format (context, line_maps, main_input_filename_,
+    : sarif_output_format (context, line_maps,
 			   std::make_unique<sarif_serialization_format_json>
 			     (formatted),
 			   sarif_gen_opts)
@@ -4243,7 +4250,7 @@ test_make_location_object (const sarif_generation_options &sarif_gen_opts,
   test_diagnostic_context dc;
   pretty_printer pp;
   sarif_builder builder
-    (dc, pp, line_table, "MAIN_INPUT_FILENAME",
+    (dc, pp, line_table,
      std::make_unique<sarif_serialization_format_json> (true),
      sarif_gen_opts);
 
diff --git a/gcc/diagnostic-format-sarif.h b/gcc/diagnostic-format-sarif.h
index 4e6a525d64c1..763dc25f39e8 100644
--- a/gcc/diagnostic-format-sarif.h
+++ b/gcc/diagnostic-format-sarif.h
@@ -41,21 +41,18 @@ diagnostic_output_format_open_sarif_file (diagnostic_context &context,
 					  const char *base_file_name,
 					  enum sarif_serialization_kind serialization_kind);
 
-extern void
+extern diagnostic_output_format &
 diagnostic_output_format_init_sarif_stderr (diagnostic_context &context,
 					    const line_maps *line_maps,
-					    const char *main_input_filename_,
 					    bool formatted);
-extern void
+extern diagnostic_output_format &
 diagnostic_output_format_init_sarif_file (diagnostic_context &context,
 					  line_maps *line_maps,
-					  const char *main_input_filename_,
 					  bool formatted,
 					  const char *base_file_name);
-extern void
+extern diagnostic_output_format &
 diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
 					    const line_maps *line_maps,
-					    const char *main_input_filename_,
 					    bool formatted,
 					    FILE *stream);
 
@@ -109,7 +106,6 @@ struct sarif_generation_options
 extern std::unique_ptr<diagnostic_output_format>
 make_sarif_sink (diagnostic_context &context,
 		 const line_maps &line_maps,
-		 const char *main_input_filename_,
 		 std::unique_ptr<sarif_serialization_format> serialization_format,
 		 const sarif_generation_options &sarif_gen_opts,
 		 diagnostic_output_file output_file);
diff --git a/gcc/diagnostic-format.h b/gcc/diagnostic-format.h
index f274a00f6e0d..4de5842ad2c2 100644
--- a/gcc/diagnostic-format.h
+++ b/gcc/diagnostic-format.h
@@ -36,6 +36,10 @@ public:
 
   virtual void dump (FILE *out, int indent) const;
 
+  /* Vfunc for notifying this format what the primary input file is,
+     e.g. for titles of HTML, for SARIF's artifact metadata.  */
+  virtual void set_main_input_filename (const char *) {}
+
   /* Vfunc for making an appropriate diagnostic_per_format_buffer
      subclass for this format.  */
   virtual std::unique_ptr<diagnostic_per_format_buffer>
@@ -95,10 +99,11 @@ diagnostic_output_format_init (diagnostic_context &,
 			       const char *base_file_name,
 			       enum diagnostics_output_format,
 			       bool json_formatting);
-extern void
+
+extern diagnostic_output_format &
 diagnostic_output_format_init_json_stderr (diagnostic_context &context,
 					   bool formatted);
-extern void
+extern diagnostic_output_format &
 diagnostic_output_format_init_json_file (diagnostic_context &context,
 					 bool formatted,
 					 const char *base_file_name);
diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc
index 20582b1fd5ee..5b8eb7d14042 100644
--- a/gcc/diagnostic.cc
+++ b/gcc/diagnostic.cc
@@ -1865,6 +1865,7 @@ diagnostic_output_format_init (diagnostic_context &context,
 			       enum diagnostics_output_format format,
 			       bool json_formatting)
 {
+  diagnostic_output_format *new_sink = nullptr;
   switch (format)
     {
     default:
@@ -1874,31 +1875,31 @@ diagnostic_output_format_init (diagnostic_context &context,
       break;
 
     case DIAGNOSTICS_OUTPUT_FORMAT_JSON_STDERR:
-      diagnostic_output_format_init_json_stderr (context,
-						 json_formatting);
+      new_sink = &diagnostic_output_format_init_json_stderr (context,
+							     json_formatting);
       break;
 
     case DIAGNOSTICS_OUTPUT_FORMAT_JSON_FILE:
-      diagnostic_output_format_init_json_file (context,
-					       json_formatting,
-					       base_file_name);
+      new_sink = &diagnostic_output_format_init_json_file (context,
+							   json_formatting,
+							   base_file_name);
       break;
 
     case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_STDERR:
-      diagnostic_output_format_init_sarif_stderr (context,
-						  line_table,
-						  main_input_filename_,
-						  json_formatting);
+      new_sink = &diagnostic_output_format_init_sarif_stderr (context,
+							      line_table,
+							      json_formatting);
       break;
 
     case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE:
-      diagnostic_output_format_init_sarif_file (context,
-						line_table,
-						main_input_filename_,
-						json_formatting,
-						base_file_name);
+      new_sink = &diagnostic_output_format_init_sarif_file (context,
+							line_table,
+							    json_formatting,
+							    base_file_name);
       break;
     }
+  if (new_sink)
+    new_sink->set_main_input_filename (main_input_filename_);
 }
 
 /* Initialize this context's m_diagrams based on CHARSET.
diff --git a/gcc/libgdiagnostics.cc b/gcc/libgdiagnostics.cc
index 70b0f36e0438..0040db463dc1 100644
--- a/gcc/libgdiagnostics.cc
+++ b/gcc/libgdiagnostics.cc
@@ -1191,10 +1191,10 @@ sarif_sink::sarif_sink (diagnostic_manager &mgr,
   auto serialization = std::make_unique<sarif_serialization_format_json> (true);
   auto inner_sink = make_sarif_sink (mgr.get_dc (),
 				     *mgr.get_line_table (),
-				     main_input_file->get_name (),
 				     std::move (serialization),
 				     sarif_gen_opts,
 				     std::move (output_file));
+  inner_sink->set_main_input_filename (main_input_file->get_name ());
   mgr.get_dc ().add_sink (std::move (inner_sink));
 }
 
diff --git a/gcc/opts-diagnostic.cc b/gcc/opts-diagnostic.cc
index 3a1dc528ac56..3629f17f0cee 100644
--- a/gcc/opts-diagnostic.cc
+++ b/gcc/opts-diagnostic.cc
@@ -531,7 +531,6 @@ sarif_scheme_handler::make_sink (const context &ctxt,
 
   auto sink = make_sarif_sink (ctxt.m_dc,
 			       *line_table,
-			       ctxt.m_opts.x_main_input_filename,
 			       std::move (serialization_obj),
 			       sarif_gen_opts,
 			       std::move (output_file));
@@ -633,6 +632,7 @@ handle_OPT_fdiagnostics_add_output_ (const gcc_options &opts,
   if (!sink)
     return;
 
+  sink->set_main_input_filename (opts.x_main_input_filename);
   dc.add_sink (std::move (sink));
 }
 
@@ -657,6 +657,7 @@ handle_OPT_fdiagnostics_set_output_ (const gcc_options &opts,
   if (!sink)
     return;
 
+  sink->set_main_input_filename (opts.x_main_input_filename);
   dc.set_output_format (std::move (sink));
 }
 
diff --git a/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py b/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py
index 02ff84c14bb6..880fcc0231bc 100644
--- a/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py
+++ b/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py
@@ -26,7 +26,7 @@ def test_basics(html_tree):
     assert head is not None
 
     title = head.find('xhtml:title', ns)
-    assert title.text == 'Title goes here'
+    assert title.text.endswith('gcc/testsuite/gcc.dg/html-output/missing-semicolon.c')
 
     body = root.find('xhtml:body', ns)
     assert body is not None
@@ -56,26 +56,3 @@ def test_basics(html_tree):
     assert pre is not None
     assert pre.attrib['class'] == 'gcc-generated-patch'
     assert pre.text.startswith('--- ')
-
-# For reference, here's the generated HTML:
-"""
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <title>Title goes here</title>
-  </head>
-  <body>
-    <div class="gcc-diagnostic-list">
-      <div class="gcc-diagnostic">
-        <span class="gcc-message">expected '<span class="gcc-quoted-text">;</span>' before '<span class="gcc-quoted-text">}</span>' token</span>
-        <pre class="gcc-generated-patch">
-        [...snip...]
-        </pre>
-      </div>
-    </div>
-  </body>
-</html>
-"""


More information about the Gcc-cvs mailing list