{"id":2229017,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2229017/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260427161804.1717021-1-dmalcolm@redhat.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260427161804.1717021-1-dmalcolm@redhat.com>","date":"2026-04-27T16:18:04","name":"[pushed] wwwdocs: Document my gcc 16 changes","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"9cb62abd2c749fda5bddc7c37ca752fb405d3525","submitter":{"id":24465,"url":"http://patchwork.ozlabs.org/api/1.1/people/24465/?format=json","name":"David Malcolm","email":"dmalcolm@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260427161804.1717021-1-dmalcolm@redhat.com/mbox/","series":[{"id":501686,"url":"http://patchwork.ozlabs.org/api/1.1/series/501686/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=501686","date":"2026-04-27T16:18:04","name":"[pushed] wwwdocs: Document my gcc 16 changes","version":1,"mbox":"http://patchwork.ozlabs.org/series/501686/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2229017/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2229017/checks/","tags":{},"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=fZzVL1Pp;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=fZzVL1Pp","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g47zX1Vt7z1yHX\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 02:18:46 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 023FD4BAD15E\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 27 Apr 2026 16:18:45 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 8B4414B9DB4F\n for <gcc-patches@gcc.gnu.org>; Mon, 27 Apr 2026 16:18:09 +0000 (GMT)","from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-627-Qfdf6MXQN86VfU8JLAnSNg-1; Mon,\n 27 Apr 2026 12:18:07 -0400","from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id EDB711956095\n for <gcc-patches@gcc.gnu.org>; Mon, 27 Apr 2026 16:18:06 +0000 (UTC)","from t14s.localdomain.com (unknown [10.22.65.168])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 4F53B3007572; Mon, 27 Apr 2026 16:18:06 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 023FD4BAD15E","OpenDKIM Filter v2.11.0 sourceware.org 8B4414B9DB4F"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 8B4414B9DB4F","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 8B4414B9DB4F","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777306689; cv=none;\n b=sSHIMut59aMSt4cxNMTAgSqIeXAws3P/pWS7I+quOaWgpppw/SKwJOcA52vIPYQyZuOQn9DLtk2Ee79n2ZhI3hIs55gl6LEAs2IqoZex2Eq17PS9+3/LNDJN+7gB1/8N8AVE+uF7iC8fTp4XAURx+cQXQPLQdzRyLCXIsnalit4=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777306689; c=relaxed/simple;\n bh=BfmYJ2RnILoWG8V41PsiqzFomTpGFFh/RWNHXUwNrzY=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=tfA7uExhRh0pDh+p8RN0APJ3pAOhIXwUb6naqn42Xa5mFepGYyy3WrWkz2wCvQZDEvgNDZSQpr0kjpMoheMHww+bxkqq+vmHUeLmfT+yCxZ+gbt9ZFKiy3xTcOlDxl93+E8nJrQSn9Sp/qzggQyvfNEkyEuDyH8NITWfjpc9nRQ=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777306689;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=V/QnXPEAiDldlKgM5r85OZddHzL4vjQbtTFu1pITSoI=;\n b=fZzVL1PpxuBC3VDrnO3ZyQnT+x5EIu9ZMVnkCChSmRAVLZ0GaYz3tF2yAGLuKAZ4SHXG2p\n sMdtII1rYdtKcL/f3J7XQABw9OMRhk4vhA0bNgZ/rg7bUuaSvDGTEWOB3kxcN8LZ+Qgo+v\n 71mQsQ6UfxMt/0edNPilNBRWIjU/z+Y=","X-MC-Unique":"Qfdf6MXQN86VfU8JLAnSNg-1","X-Mimecast-MFC-AGG-ID":"Qfdf6MXQN86VfU8JLAnSNg_1777306687","From":"David Malcolm <dmalcolm@redhat.com>","To":"gcc-patches@gcc.gnu.org","Cc":"David Malcolm <dmalcolm@redhat.com>","Subject":"[pushed] wwwdocs: Document my gcc 16 changes","Date":"Mon, 27 Apr 2026 12:18:04 -0400","Message-ID":"<20260427161804.1717021-1-dmalcolm@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.4","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"pzIi9Z7u1rFUDDRu0TR0RxgESCkvvM7yvilN0KKvxSQ_1777306687","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"I've pushed this patch for the website to cover my various\nGCC 16 changes (and porting notes).\n\nDave\n\n---\n htdocs/gcc-16/changes.html    | 265 +++++++++++++++++++++++++++++++++-\n htdocs/gcc-16/porting_to.html | 183 +++++++++++++++++++++++\n 2 files changed, 447 insertions(+), 1 deletion(-)","diff":"diff --git a/htdocs/gcc-16/changes.html b/htdocs/gcc-16/changes.html\nindex c56f3b8b..65462545 100644\n--- a/htdocs/gcc-16/changes.html\n+++ b/htdocs/gcc-16/changes.html\n@@ -36,6 +36,12 @@ a work-in-progress.</p>\n       predefines <code>_REENTRANT</code> on Solaris.\n       See <a href=\"porting_to.html#solaris\">the porting notes</a> for more\n       information.</li>\n+  <li>The so-called \"<code>json</code>\" format for\n+      <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-format\"><code>-fdiagnostics-format=</code></a>\n+      has been removed in this release.\n+      Users seeking machine-readable diagnostics from GCC should use\n+      <a href=\"https://gcc.gnu.org/wiki/SARIF\">SARIF</a>.\n+  </li>\n </ul>\n \n \n@@ -265,6 +271,21 @@ for general information.</p>\n       of diagnostic text (<a href=\"https://gcc.gnu.org/PR102613\">PR102613</a>)</li>\n     </ul>\n   </li>\n+  <li>Various C++ error messages (such as for problems involving templates)\n+    now have a hierarchical structure.  This nesting of messages is presented\n+    using indentation and bullet points.  The old behavior can be restored via\n+    <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-nesting\"><code>-fno-diagnostics-show-nesting</code></a>\n+    or\n+    <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-plain-output\"><code>-fdiagnostics-plain-output</code></a>.\n+    <!-- commit d3fe5a560f0bcca8e11ec0f9bb916f59615f51d8\n+\t diagnostics: enable nested diagnostics by default [PR116253] -->\n+    <!-- commit 41f071a64ff7027a98e6b6a7e3641156e3be70e0\n+\t c++: improve nesting in print_z_candidate [PR121966] -->\n+    <!-- commit 9d27750d153dd4147eebe6b30d3e18f7cb3d7384\n+\t c++: use nesting and counts in print_candidates -->\n+    <!-- commit b76d9f7c1f2e14a576e2e548b0d454a1f16c7fde\n+\t c++: UX improvements for close matches in print_candidates -->\n+  </li>\n </ul>\n \n <h4 id=\"libstdcxx\">Runtime Library (libstdc++)</h4>\n@@ -632,7 +653,249 @@ struct Affected : E\n <!-- <h2>Documentation improvements</h2> -->\n \n <!-- .................................................................. -->\n-<!-- <h2 id=\"plugins\">Improvements for plugin authors</h2> -->\n+<h2 id=\"diagnostics\">Improvements to GCC Diagnostics</h2>\n+<ul>\n+  <li>GCC can now output diagnostics in HTML form via\n+    <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-add-output_003dexperimental-html\"><code>-fdiagnostics-add-output=experimental-html</code></a>\n+  </li>\n+\n+  <li>GCC's SARIF output now respects the\n+    <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#index-dumpdir\">dump directory</a>.\n+    For example, given\n+    <code><pre>\n+      gcc \\\n+        -o build-dir/foo.o \\\n+        -fdiagnostics-add-output=sarif\n+        foo.c\n+    </pre></code>\n+    GCC 15 would write the SARIF to <code>foo.c.sarif</code>, whereas\n+    GCC 16 now writes it to <code>build-dir/foo.c.sarif</code>.\n+    <!-- commit 6fe28020cae53e3703921aedb9f267115a5262d3\n+\t diagnostics: respect dumpdir when outputting SARIF and HTML file [PR110522] -->\n+  </li>\n+\n+\n+  <li>GCC's SARIF output now captures the nesting of logical locations.\n+    <!-- commit f25e178b8c2cc868168b0a29ab03260fbefa4ff7\n+\t sarif output: capture nesting of logical locations [PR116176] -->\n+  </li>\n+\n+  <li>In GCC's SARIF output,\n+    <code>fix</code> objects now contain\n+    <code>description</code> properties in many cases.\n+    <!-- commit 0d5af6a757051708d2dfa510b2ad84f083d7eddc\n+\t sarif output: add descriptions to fix-it hints (§3.55.2) [PR121986] -->\n+  </li>\n+\n+  <li>GCC's SARIF output has gained 5 new values for the\n+    <a href=\"https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html#_Toc141791009\">§3.38.8 <code>kinds</code> property of <code>threadFlowLocation</code></a>,\n+    for expressing non-standard control flow:\n+    <ul>\n+      <li><code>throw</code> for throwing an exception</li>\n+      <li><code>catch</code> for catching an exception</li>\n+      <li><code>unwind</code> for unwinding stack frame(s) during\n+\texception-handling</li>\n+      <li><code>setjmp</code> for calls to setjmp</li>\n+      <li><code>longjmp</code> for calls to longjmp that rewind the\n+\tprogram counter/stack to the location of a previous setjmp call</li>\n+    </ul>\n+    <!-- commit 0a2c4b6dd2019d144df49227fce950e10ae62b09\n+\t analyzer: add event kinds for special control flow [PR122544] -->\n+  </li>\n+\n+  <li>GCC diagnostics can now have directed graphs associated with them, and\n+    can also report \"global\" directed graphs.  Graphs are ignored by text sinks,\n+    but are captured by SARIF sinks, and the \"experimental-html\" renders any\n+    such graphs in SVG-based form using dot.  For example, setting\n+    <code>cfgs=yes</code> on a SARIF or HTML diagnostic sink will enable\n+    capturing GCC's intermediate representation of every function at every\n+    optimization pass.</li>\n+\n+  <li>GCC diagnostics can now refer to logical locations inside XML and JSON\n+    files (such as via libgdiagnostics).  The <code>sarif-replay</code> tool\n+    now uses this to provide JSON pointers when it reports on issues in its\n+    SARIF input.</li>\n+\n+  <li>If\n+    <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#index-GCC_005fDIAGNOSTICS_005fLOG\"><code>GCC_DIAGNOSTICS_LOG</code></a>\n+    is set in the environment, GCC's diagnostic subsystem will emit a\n+    text log to stderr (or a named file) to track what it's doing and the\n+    decisions it's making (e.g. exactly when and why a diagnostic is being\n+    rejected).</li>\n+\n+  <li>If\n+    <a href=https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#index-EXPERIMENTAL_005fSARIF_005fSOCKET><code>EXPERIMENTAL_SARIF_SOCKET</code></a>\n+    is set in the environment, GCC will attempt to connect to that socket on\n+    startup and send JSON-RPC notifications to it for every diagnostic emitted.\n+    <!-- commit 8a155c170b443e332b3db4922f0f0d588a17604f\n+\t diagnostics: add experimental SARIF JSON-RPC notifications for IDEs [PR115970] -->\n+  </li>\n+</ul>\n+\n+<!-- .................................................................. -->\n+<h2 id=\"plugins\">Improvements for plugin authors</h2>\n+<ul>\n+  <li>GCC has gained a \"publish/subscribe\" framework, allowing for\n+    loosely-coupled senders and receivers, with strongly-typed messages\n+    passing between them.  In this release the only topics for plugins\n+    to subscribe to are:\n+    <ul>\n+      <li>events relating to optimization passes starting/stopping on particular\n+\tfunctions\n+      <!-- commit 4a2e1c31159aab4bde1990589ccab0da2436dfad\n+\t   Add publish/subscribe topics and channel: pass_events -->\n+      </li>\n+      <li>events relating to the static analyzer\n+      <!-- commit f68343c2543ab65d75ef88bd920dfa209c7cbe20\n+\t   analyzer: replace PLUGIN_ANALYZER_INIT with a pub/sub channel\n+\n+\t   commit d36257a190dbe94a284f774fbf5c003abf03fc33\n+\t   analyzer: port translation_unit_callbacks to pub/sub\n+\n+\t   commit bc668cf6c94a2607f280fa2447095e5f7cb81c2e\n+\t   analyzer: port pop_frame_callbacks to pub/sub\n+\t-->\n+      </li>\n+    </ul>\n+  </li>\n+\n+  <li>GCC diagnostic sinks can now have <code>extension</code> objects\n+    associated with them, with a <code>finalizer</code> hook.  Plugins can\n+    use this to capture additional information in SARIF output files.\n+    <!-- commit 0558c6028e47eb623365c3865577f40f9d1fa27c\n+\t diagnostics: add class sink::extension -->\n+  </li>\n+\n+  <li>GCC's diagnostic machinery has been substantially cleaned up in GCC 16.\n+    This should not affect plugins that use just the\n+    <code>diagnostic-core.h</code> header, but maintainers of plugins making\n+    more sophisticated uses of diagnostics may need to refer to the\n+    <a href=\"porting_to.html#plugins\">porting guide</a>.\n+  </li>\n+\n+</ul>\n+\n+<!-- .................................................................. -->\n+<h2 id=\"analyzer\">Improvements to Static Analyzer</h2>\n+<ul>\n+  <li>The analyzer is now usable on simple C++ examples, as it now handles\n+    C++'s Named Return Value Optimization and has some initial support for\n+    exceptions.  However due to scaling issues it is not likely to be usable\n+    on production C++ code in this release.\n+    <!-- commit a1922f0252b3b09016df76bd5b10119206935e37\n+\t analyzer: handle NRVO and DECL_BY_REFERENCE [PR111536] -->\n+    <!-- commit 7a39e0ca0652ff84a31efa3c7d4c7a78d9bb95ae\n+\t analyzer: initial implementation of exception handling [PR97111] -->\n+  </li>\n+  <li>With the added support for exception-handling, <code>-fanalyzer</code>\n+    assumes that a call to an external function not marked with attribute\n+    <code>nothrow</code> could throw an exception if <code>-fexceptions</code>\n+    is enabled.  GCC 16 adds a new option\n+    <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-fanalyzer-assume-nothrow\"><code>-fanalyzer-assume-nothrow</code></a>,\n+    for disabling this assumption.  This is intended as a workaround for\n+    projects where the exception-handling generates large numbers of new\n+    warnings, such as C code where <code>-fexceptions</code> is used for\n+    interoperability with C++ but where the C APIs in use are unlikely to\n+    throw exceptions.\n+    <!-- commit f1318516f07453e87814f6246acf567f684ac34f\n+\t analyzer: add option -fanalyzer-assume-nothrow [PR122623] -->\n+  </li>\n+  <li>The data structure used by <code>-fanalyzer</code> for representing\n+    the user's code has been rewritten in a way that makes it easier to\n+    understand and debug, and slightly improves locations used when reporting\n+    diagnostics.  This comes at the cost of increasing the memory usage of\n+    the analyzer.\n+    <!-- commit 0b786d961d4426db15b3f681f4e7c6fcaeb296c2\n+\t analyzer: reimplement supergraph to eliminate function_point and stmt_finder -->\n+  </li>\n+  <li>The data structure used by <code>-fanalyzer</code> for simulating the\n+    contents of memory in the user's program has been reimplemented.  The new\n+    implementation is faster and easier to maintain.\n+    <!-- commit 310a70ef6db45d2fd574daa77b5128cd1f4edbce\n+\t analyzer: reimplement binding_map using a \"spatial\" representation -->\n+  </li>\n+  <li>The analyzer has started to make use of GCC's <code>value_range</code>\n+    machinery, eliminating some false positives.\n+    <!-- commit 498fb8a24516b10897dfbe08bb8f7574b2d28839\n+\t analyzer: use value_range and range_op in eval_condition [PR98447] -->\n+  </li>\n+</ul>\n+\n+<!-- .................................................................. -->\n+<h2 id=\"libgdiagnostics\">Improvements to libgdiagnostics</h2>\n+<a href=\"https://gcc.gnu.org/wiki/libgdiagnostics\">libgdiagnostics</a> has gained 37 entrypoints:\n+<ul>\n+  <li>5 new entrypoints for working with logical locations\n+    <ul>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/logical-locations.html#c.diagnostic_logical_location_get_kind\"><code>diagnostic_logical_location_get_kind()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/logical-locations.html#c.diagnostic_logical_location_get_parent\" title=\"diagnostic_logical_location_get_parent\"><code>diagnostic_logical_location_get_parent()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/logical-locations.html#c.diagnostic_logical_location_get_short_name\" title=\"diagnostic_logical_location_get_short_name\"><code>diagnostic_logical_location_get_short_name()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/logical-locations.html#c.diagnostic_logical_location_get_fully_qualified_name\" title=\"diagnostic_logical_location_get_fully_qualified_name\"><code>diagnostic_logical_location_get_fully_qualified_name()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/logical-locations.html#c.diagnostic_logical_location_get_decorated_name\" title=\"diagnostic_logical_location_get_decorated_name\"><code>diagnostic_logical_location_get_decorated_name()</code></a></li>\n+    </ul>\n+  </li>\n+  <li>2 new entrypoints for supporting command-line options and SARIF playback\n+    <ul>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/diagnostic-manager.html#c.diagnostic_manager_add_sink_from_spec\" title=\"diagnostic_manager_add_sink_from_spec\"><code>diagnostic_manager_add_sink_from_spec()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/diagnostic-manager.html#c.diagnostic_manager_set_analysis_target\" title=\"diagnostic_manager_set_analysis_target\"><code>diagnostic_manager_set_analysis_target()</code></a></li>\n+    </ul>\n+  </li>\n+  <li>12 new entrypoints for working with directed graphs:\n+    <ul>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_manager_new_graph\" title=\"diagnostic_manager_new_graph\"><code>diagnostic_manager_new_graph()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_manager_take_global_graph\" title=\"diagnostic_manager_take_global_graph\"><code>diagnostic_manager_take_global_graph()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_take_graph\" title=\"diagnostic_take_graph\"><code>diagnostic_take_graph()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_graph_release\" title=\"diagnostic_graph_release\"><code>diagnostic_graph_release()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_graph_set_description\" title=\"diagnostic_graph_set_description\"><code>diagnostic_graph_set_description()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_graph_add_node\" title=\"diagnostic_graph_add_node\"><code>diagnostic_graph_add_node()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_graph_add_edge\" title=\"diagnostic_graph_add_edge\"><code>diagnostic_graph_add_edge()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_graph_get_node_by_id\" title=\"diagnostic_graph_get_node_by_id\"><code>diagnostic_graph_get_node_by_id()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_graph_get_edge_by_id\" title=\"diagnostic_graph_get_edge_by_id\"><code>diagnostic_graph_get_edge_by_id()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_node_set_label\" title=\"diagnostic_node_set_label\"><code>diagnostic_node_set_label()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_node_set_location\" title=\"diagnostic_node_set_location\"><code>diagnostic_node_set_location()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/graphs.html#c.diagnostic_node_set_logical_location\" title=\"diagnostic_node_set_logical_location\"><code>diagnostic_node_set_logical_location()</code></a></li>\n+    </ul>\n+  </li>\n+  <li>17 new entrypoints for building up text for a diagnostic via a buffer:\n+    <ul>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_new\" title=\"diagnostic_message_buffer_new\"><code>diagnostic_message_buffer_new()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_release\" title=\"diagnostic_message_buffer_release\"><code>diagnostic_message_buffer_release()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_append_str\" title=\"diagnostic_message_buffer_append_str\"><code>diagnostic_message_buffer_append_str()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_append_text\" title=\"diagnostic_message_buffer_append_text\"><code>diagnostic_message_buffer_append_text()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_append_byte\" title=\"diagnostic_message_buffer_append_byte\"><code>diagnostic_message_buffer_append_byte()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_append_printf\" title=\"diagnostic_message_buffer_append_printf\"><code>diagnostic_message_buffer_append_printf()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_append_event_id\" title=\"diagnostic_message_buffer_append_event_id\"><code>diagnostic_message_buffer_append_event_id()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_begin_url\" title=\"diagnostic_message_buffer_begin_url\"><code>diagnostic_message_buffer_begin_url()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_end_url\" title=\"diagnostic_message_buffer_end_url\"><code>diagnostic_message_buffer_end_url()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_begin_quote\" title=\"diagnostic_message_buffer_begin_quote\"><code>diagnostic_message_buffer_begin_quote()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_end_quote\" title=\"diagnostic_message_buffer_end_quote\"><code>diagnostic_message_buffer_end_quote()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_begin_color\" title=\"diagnostic_message_buffer_begin_color\"><code>diagnostic_message_buffer_begin_color()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_end_color\" title=\"diagnostic_message_buffer_end_color\"><code>diagnostic_message_buffer_end_color()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/message-buffers.html#c.diagnostic_message_buffer_dump\" title=\"diagnostic_message_buffer_dump\"><code>diagnostic_message_buffer_dump()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/diagnostics.html#c.diagnostic_finish_via_msg_buf\" title=\"diagnostic_finish_via_msg_buf\"><code>diagnostic_finish_via_msg_buf()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/physical-locations.html#c.diagnostic_add_location_with_label_via_msg_buf\" title=\"diagnostic_add_location_with_label_via_msg_buf\"><code>diagnostic_add_location_with_label_via_msg_buf()</code></a></li>\n+      <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/execution-paths.html#c.diagnostic_execution_path_add_event_via_msg_buf\" title=\"diagnostic_execution_path_add_event_via_msg_buf\"><code>diagnostic_execution_path_add_event_via_msg_buf()</code></a></p></li>\n+    </ul>\n+  </li>\n+  <li><a href=\"https://gcc.gnu.org/onlinedocs/libgdiagnostics/topics/physical-locations.html#c.diagnostic_manager_set_debug_physical_locations\" title=\"diagnostic_manager_set_debug_physical_locations\"><code>diagnostic_manager_set_debug_physical_locations()</code></a></li>\n+    <!--\n+2025-07-15: Added support for message buffers to libgdiagnostics (LIBGDIAGNOSTICS_ABI_4)\n+\n+2025-07-11: Added support for directed graphs to libgdiagnostics and sarif-replay (LIBGDIAGNOSTICS_ABI_3)\n+\n+2025-06-23: Added support for HTML output to libgdiagnostics, sarif-replay, and dg-lint (LIBGDIAGNOSTICS_ABI_2)\n+2025-05-06:\n+\n+    Added accessors for logical locations(LIBGDIAGNOSTICS_ABI_1)\n+\n+    SARIF output now captures nesting of logical locations (PR116176)\n+\n+    Added support for XML and JSON kinds of logical locations\n+\n+    sarif-replay now shows logical locations of errors within SARIF input using JSON pointer (PR117988)\n+    -->\n+\n+</ul>\n \n <!-- .................................................................. -->\n <h2>Other significant improvements</h2>\ndiff --git a/htdocs/gcc-16/porting_to.html b/htdocs/gcc-16/porting_to.html\nindex 6a6e047a..2ab0df6f 100644\n--- a/htdocs/gcc-16/porting_to.html\n+++ b/htdocs/gcc-16/porting_to.html\n@@ -294,5 +294,188 @@ usual alignment without capping the result.\n       (And Good Riddance) to -mt -and -D_REENTRANT</a>.</li>\n </ul>\n \n+<h2 id=\"plugins\">Changes affecting plugin authors</h2>\n+\n+<p>GCC's diagnostic machinery has been substantially cleaned up in GCC 16.\n+  Most of the implementation has been moved to a new\n+  <code>gcc/diagnostics/</code> subdirectory and <code>diagnostics::</code>\n+  namespace, with many fields becoming <code>private</code>.  This should\n+  not affect plugins that use just the <code>diagnostic-core.h</code> API,\n+  but plugins making more sophisticated uses of diagnostics may need\n+  updating.  The following tables list the types that have been renamed\n+  in GCC 16 and the header files that have been moved.</p>\n+\n+<table>\n+  <caption>Renamed types</caption>\n+  <thead>\n+    <tr>\n+      <th scope=\"col\">GCC 15 type</th>\n+      <th scope=\"col\">GCC 16 type</th>\n+      <th scope=\"col\">Notes</th>\n+    </tr>\n+  </thead>\n+  <tbody>\n+    <tr>\n+      <td><code>class diagnostic_buffer</code></td>  <td><code>class diagnostics::buffer</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_client_data_hooks</code></td>  <td><code>class diagnostics::client_data_hooks</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_client_plugin_info</code></td>  <td><code>class diagnostics::client_plugin_info</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_column_policy</code></td>  <td><code>class diagnostics::column_policy</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_context</code></td>  <td><code>class diagnostics::context</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>struct diagnostic_counters</code></td>  <td><code>struct diagnostics::counters</code></td> <td>New header: <code>diagnostics/counters.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_diagram</code></td>  <td><code>class diagnostics::diagram</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_event</code></td>  <td><code>class diagnostics::paths::event</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_event_id_t</code></td>  <td><code>class diagnostics::paths::event_id_t</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>struct diagnostic_info</code></td>  <td><code>struct diagnostics::diagnostic_info</code></td> <td>Fields have gained <code>m_</code> prefixes</td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_location_print_policy</code></td>  <td><code>class diagnostics::location_print_policy</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_metadata</code></td>  <td><code>class diagnostics::metadata</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_option_classifier</code></td>  <td><code>class diagnostics::option_classifier</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>struct diagnostic_option_id</code></td>  <td><code>struct diagnostics::option_id</code></td> <td>New header: <code>diagnostics/option-id.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_option_manager</code></td>  <td><code>class diagnostics::option_manager</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_output_file</code></td>  <td><code>class diagnostics::output_file</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_output_format</code></td>  <td><code>class diagnostics::sink</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_per_format_buffer</code></td>  <td><code>class diagnostics::per_sink_buffer</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>struct diagnostic_source_printing_options</code></td>  <td><code>struct diagnostics::source_printing_options</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_source_print_policy</code></td>  <td><code>class diagnostics::source_print_policy</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>enum diagnostic_t</code></td>  <td><code>enum class diagnostics::kind</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_text_output_format</code></td>  <td><code>class diagnostics::text_sink</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_thread</code></td>  <td><code>class diagnostics::paths::thread</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>typedef diagnostic_thread_id_t</code></td>  <td><code>typedef diagnostics::paths::thread_id_t</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_path</code></td>  <td><code>class diagnostics::paths::path</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class edit_context</code></td>  <td><code>class diagnostics::changes::change_set</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class logical_location</code></td>  <td><code>class diagnostics::logical_locations::key</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>enum logical_location_kind</code></td>  <td><code>enum diagnostics::logical_locations::kind</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class logical_location_manager</code></td>  <td><code>class diagnostics::logical_locations::manager</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class sarif_output_format</code></td>  <td><code>class diagnostics::sarif_sink</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class diagnostic_sarif_format_buffer</code></td>  <td><code>class diagnostics::sarif_sink_buffer</code></td> <td></td>\n+    </tr>\n+    <tr>\n+      <td><code>class option_manager</code></td>  <td><code>class diagnostics::option_id_manager</code></td> <td>New header: <code>diagnostics/option-id-manager.h</code></td>\n+    </tr>\n+  </tbody>\n+</table>\n+\n+<table>\n+  <caption>Header file changes</caption>\n+  <thead>\n+    <tr>\n+      <th scope=\"col\">GCC 15 header</th>\n+      <th scope=\"col\">GCC 16 header</th>\n+    </tr>\n+  </thead>\n+  <tbody>\n+    <tr>\n+      <td><code>diagnostic-buffer.h</code></td>  <td><code>diagnostics/buffering.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-client-data-hooks.h</code></td>  <td><code>diagnostics/client-data-hooks.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-color.h</code></td>  <td><code>diagnostics/color.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic.def</code></td>  <td><code>diagnostics/kind.def</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-diagram.h</code></td>  <td><code>diagnostics/diagram.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-format-html.h</code></td>  <td><code>diagnostics/html-sink.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-format-sarif.h</code></td>  <td><code>diagnostics/sarif-sink.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-format-text.h</code></td>  <td><code>diagnostics/text-sink.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-label-effects.h</code></td>  <td><code>diagnostics/source-printing-effects.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-macro-unwinding.h</code></td>  <td><code>diagnostics/macro-unwinding.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-metadata.h</code></td>  <td><code>diagnostics/metadata.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-output-file.h</code></td>  <td><code>diagnostics/output-file.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-path.h</code></td>  <td><code>diagnostics/paths.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>diagnostic-url.h</code></td>  <td><code>diagnostics/url.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>edit-context.h</code></td>  <td><code>diagnostics/changes.h</code></td>\n+    </tr>\n+    <tr>\n+      <td>File cache types of <code>input.h</code></td>  <td><code>diagnostics/file-cache.h</code></td>\n+    </tr>\n+    <tr>\n+      <td><code>logical-locations.h</code></td>  <td><code>diagnostics/logical-locations.h</code></td>\n+    </tr>\n+  </tbody>\n+</table>\n+\n </body>\n </html>\n","prefixes":["pushed"]}