.. Copyright (C) 2024-2025 Free Software Foundation, Inc. Originally contributed by David Malcolm This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .. default-domain:: c Tutorial part 4: adding notes ============================= Let's further extend the previous example to add a "note" to it. We want to generate output like this:: test-with-note.c:17:11: error: can't find 'foo.h' 17 | #include | ^~~~~ test-with-note.c:17:11: note: have you looked behind the couch? The "error" and "note" are both instances of :type:`diagnostic`. We want to let libgdiagnostics know that they are grouped together. The way to do this is to use :func:`diagnostic_manager_begin_group` and :func:`diagnostic_manager_end_group` around the "finish" calls to the diagnostics. .. literalinclude:: ../../../testsuite/libgdiagnostics.dg/test-error-with-note.c :language: c :start-after: /* begin quoted source */ :end-before: /* end quoted source */ On compiling and running the program, we should get the desired output:: test-with-note.c:17:11: error: can't find 'foo.h' 17 | #include | ^~~~~ test-with-note.c:17:11: note: have you looked behind the couch? The grouping doesn't affect text output sinks, but a :doc:`SARIF sink <../topics/sarif>` will group the note within the error (via the ``relatedLocations`` property of ``result`` objects; see SARIF v2.1.0 `ยง3.27.22 `_). In the above, the note had the same physical location as the error (``loc_range``). This can be useful for splitting up a message into two parts to make localization easier, but they could have different locations, such as in:: test.xml:10:2: error: 'foo' is not valid here test.xml:5:1: note: within element 'bar' where each :type:`diagnostic` had its own :type:`diagnostic_physical_location`. In :doc:`the next tutorial <05-warnings>` we'll look at issuing warnings, rather than errors.