-fno-diagnostics-show-nesting や -fdiagnostics-plain-output で旧来表示に戻せるGCC 16の話題として、地味だけどかなりうれしい改善が入っています。
それは、エラーメッセージが読みやすくなったこと、そしてSARIF出力が強化されたことです。
正直、コンパイラの改善って派手さはないんですが、実際にコードを書いている人にとってはかなり効きます。
特にC++は、template や const の違いみたいな“ちょっとしたズレ”が、わりと大げさで分かりにくいエラーになりがちです。ここが少しでも見やすくなるなら、開発体験はかなり変わると思います。
元記事では、GCCのエラーメッセージには階層構造がある、と説明されています。
要するに、エラー本体の下に「候補はこれ」「この引数が違う」「ここが一致しない」といった情報がぶら下がっているイメージです。
GCC 15では、この階層を実験的オプションで箇条書き表示できました。
そしてGCC 16では、これがデフォルトになりました。
これ、かなり大事です。
なぜかというと、従来のコンパイラエラーは、必要な情報が全部あるのに、並び方が悪くて読みにくいことが多かったからです。
情報量そのものより、情報の整理の仕方が問題だったわけですね。

記事では、クラスの宣言と定義で void* と const void* が食い違っている例が紹介されています。
たとえば、宣言ではこうなっているのに、
void test(int i, int j, void *ptr, int k);
定義側でうっかり const void *ptr に変えてしまう、というミスです。
この手のミス、めちゃくちゃ「あるある」です。
人間は「だいたい同じ」と思ってしまうんですが、コンパイラは容赦なく別物として扱います。
GCC 15の表示でも、もちろんエラーは出ます。
ただ、候補の表示や関連情報が続けて出てきて、ぱっと見で「結局どこが本質なの?」となりやすい。
一方、GCC 16では、こんなふうに段階を追って示します。
void*const void* と一致していないこの形式だと、何がどうズレているかを順番に追えるので、かなり助かります。
個人的には、これは「賢いコンパイラ」感よりも、「気の利く先輩が横で見てくれている」感じに近いと思いました。
とはいえ、表示形式が変わると困る人もいます。
そのため、GCC 16では次のオプションで以前の表示に戻せます。
-fno-diagnostics-show-nesting-fdiagnostics-plain-outputこのあたり、移行への配慮がちゃんとしていて好印象です。
新機能を入れつつ、必要なら戻せる。こういう設計は現場でありがたいです。

もうひとつの話題が、SARIF output の更新です。
SARIFは、簡単に言うとコンパイラや静的解析ツールの結果を、機械が扱いやすい形で記録するためのフォーマットです。
普通のエラー出力は、人間が読むには向いています。
でも、CI/CD や IDE、セキュリティツールに渡して分析したいとなると、テキストを正規表現で無理やり解析するのはしんどい。
記事でもそこが問題として挙げられています。
コンパイラの機能が増えれば増えるほど、単純な文字列解析では対応しづらくなります。
エラーの構造、位置、関連する候補、補足情報などをきちんと扱おうとすると、テキストは意外と脆いんですよね。
そこでSARIFの出番です。
構造化されたデータとして出せれば、
といったことがやりやすくなります。

この手の機能は、単体で見ると「へえ」で終わりがちです。
でも実際には、開発フロー全体の自動化に効いてきます。
特に大きなコードベースでは、
「コンパイラが何を言っているか」を人間が毎回目視で読むだけでなく、ツールが自動で拾ってくれる価値が大きいです。
ここはかなり現代的な改善だと思います。
この記事を書いているのは、Red HatでGCCに関わっている David Malcolm さんです。
つまり、単なる機能紹介ではなく、実装した本人の視点が入っています。
そのせいか、話の筋がとても実務的です。
「この機能が新しいです」だけでなく、
という、現場目線の説明になっています。

個人的には、このタイプの記事はかなり好きです。
コンパイラの話って、難しい単語が並ぶとそれだけで身構えてしまうんですが、今回の内容は「開発者が本当に困るところ」をちゃんと掘っていて、実感が湧きやすいんですよね。
GCC 16は、見た目の華やかさは控えめでも、毎日の開発を確実にラクにする改善が入っています。
特にC++のエラー表示は、
「大量の文字列」から「整理された説明」へ寄っていて、かなり良い方向だと思います。
そしてSARIF出力の更新は、コンパイラを単なるエラー表示機ではなく、開発ツールチェーンの一部として扱う流れを後押しするものです。
こういう改善は、一見すると小粒です。
でも、毎日コードを書く人ほど効いてくる。そこがコンパイラ改善の面白いところではないでしょうか。
参考: New features in GCC 16: Improved error messages and SARIF output | Red Hat Developer