GCC Middle and Back End API Reference
libgdiagnostics++.h
Go to the documentation of this file.
1/* A C++ wrapper API around libgdiagnostics.h for emitting diagnostics.
2 Copyright (C) 2023-2025 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 3, or (at your option)
9any later version.
10
11GCC is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef LIBGDIAGNOSTICSPP_H
21#define LIBGDIAGNOSTICSPP_H
22
23#include "libgdiagnostics.h"
24
25namespace libgdiagnostics {
26
29
30class file;
33class execution_path;
34class group;
35class manager;
36class diagnostic;
37
38/* Wrapper around a borrowed diagnostic_text_sink *. */
39
69
70/* Wrapper around a diagnostic_file *. */
71
72class file
73{
74public:
75 file () : m_inner (nullptr) {}
77 file (const file &other) : m_inner (other.m_inner) {}
78 file &operator= (const file &other) { m_inner = other.m_inner; return *this; }
79
80 void set_buffered_content (const char *data, size_t sz);
81
83};
84
85/* Wrapper around a const diagnostic_physical_location *. */
86
88{
89public:
90 physical_location () : m_inner (nullptr) {}
91
93 : m_inner (location)
94 {}
95
97};
98
99/* Wrapper around a const diagnostic_logical_location *. */
100
102{
103public:
104 logical_location () : m_inner (nullptr) {}
105
107 : m_inner (logical_loc)
108 {}
109
111};
112
113/* RAII class around a diagnostic_execution_path *. */
114
116{
117public:
118 execution_path () : m_inner (nullptr), m_owned (false) {}
119
123
125 : m_inner (const_cast<diagnostic_execution_path *> (path)),
126 m_owned (false)
127 {}
128
129 execution_path (const execution_path &other) = delete;
130 execution_path &operator= (const execution_path &other) = delete;
131
133 : m_inner (other.m_inner),
134 m_owned (other.m_owned)
135 {
136 other.m_inner = nullptr;
137 other.m_owned = false;
138 }
139
141 {
142 m_inner = other.m_inner;
143 m_owned = other.m_owned;
144 other.m_inner = nullptr;
145 other.m_owned = false;
146 return *this;
147 }
148
154
156 add_event (physical_location physical_loc,
157 logical_location logical_loc,
158 unsigned stack_depth,
159 const char *fmt, ...)
161
163 add_event_va (physical_location physical_loc,
164 logical_location logical_loc,
165 unsigned stack_depth,
166 const char *fmt,
167 va_list *args)
169
172};
173
174/* RAII class for starting/ending a group within a diagnostic_manager. */
175
176class group
177{
178public:
179 group (manager &mgr);
180 ~group ();
181
182private:
184};
185
186/* Wrapper around a diagnostic *. */
187
189{
190public:
191 diagnostic (::diagnostic *d) : m_inner (d) {}
192
193 void
194 set_cwe (unsigned cwe_id);
195
196 void
197 add_rule (const char *title, const char *url);
198
199 void
200 set_location (physical_location loc);
201
202 void
203 add_location_with_label (physical_location loc,
204 const char *text);
205
206 void
207 set_logical_location (logical_location loc);
208
209 void
210 add_fix_it_hint_insert_before (physical_location loc,
211 const char *addition);
212 void
213 add_fix_it_hint_insert_after (physical_location loc,
214 const char *addition);
215 void
216 add_fix_it_hint_replace (physical_location loc,
217 const char *replacement);
218 void
219 add_fix_it_hint_delete (physical_location loc);
220
221 void
222 take_execution_path (execution_path path);
223
224 void
225 finish (const char *fmt, ...)
228
229 void
230 finish_va (const char *fmt, va_list *args)
233
234 ::diagnostic * const m_inner;
235};
236
237/* Wrapper around a diagnostic_manager *, possibly with ownership. */
238
240{
241public:
243 : m_inner (diagnostic_manager_new ()),
244 m_owned (true)
245 {
246 }
247 manager (diagnostic_manager *inner, bool owned)
248 : m_inner (inner),
249 m_owned (owned)
250 {
251 }
253 {
254 if (m_owned)
256 }
257
258 manager (const manager &other) = delete;
259 manager (manager &&other)
260 : m_inner (other.m_inner),
261 m_owned (other.m_owned)
262 {
263 other.m_inner = nullptr;
264 }
265
266 void
267 set_tool_name (const char *value)
268 {
269 diagnostic_manager_set_tool_name (m_inner, value);
270 }
271
272 void
273 set_full_name (const char *value)
274 {
275 diagnostic_manager_set_full_name (m_inner, value);
276 }
277
278 void
279 set_version_string (const char *value)
280 {
282 }
283
284 void
285 set_version_url (const char *value)
286 {
287 diagnostic_manager_set_version_url (m_inner, value);
288 }
289
291 add_text_sink (FILE *dst_stream,
292 enum diagnostic_colorize colorize)
293 {
294 return text_sink
295 (diagnostic_manager_add_text_sink (m_inner, dst_stream, colorize));
296 }
297
298 void
299 add_sarif_sink (FILE *dst_stream,
300 file main_input_file,
301 enum diagnostic_sarif_version version)
302 {
303 diagnostic_manager_add_sarif_sink (m_inner, dst_stream,
304 main_input_file.m_inner,
305 version);
306 }
307
308 void
309 write_patch (FILE *dst_stream)
310 {
311 diagnostic_manager_write_patch (m_inner, dst_stream);
312 }
313
314 /* Location management. */
315
316 file
317 new_file (const char *name,
318 const char *sarif_source_language)
321
322 void
323 debug_dump (file f,
324 FILE *out);
325
327 new_location_from_file_and_line (file f, diagnostic_line_num_t line_num);
328
330 new_location_from_file_line_column (file f,
331 line_num_t line_num,
332 column_num_t column_num);
333
335 new_location_from_range (physical_location loc_caret,
336 physical_location loc_start,
337 physical_location loc_end);
338
339 void
340 debug_dump (physical_location loc,
341 FILE *out);
342
344 new_logical_location (enum diagnostic_logical_location_kind_t kind,
345 logical_location parent,
346 const char *short_name,
347 const char *fully_qualified_name,
348 const char *decorated_name);
349
350 void
351 debug_dump (logical_location loc,
352 FILE *out);
353
355 new_execution_path ();
356
358 begin_diagnostic (enum diagnostic_level level);
359
360
362 bool m_owned;
363};
364
365// Implementation
366
367// class file
368
369inline void
370file::set_buffered_content (const char *data, size_t sz)
371{
373}
374
375// class execution_path
376
378execution_path::add_event (physical_location physical_loc,
379 logical_location logical_loc,
380 unsigned stack_depth,
381 const char *fmt, ...)
382{
383 va_list args;
384 va_start (args, fmt);
385 diagnostic_event_id result = add_event_va (physical_loc,
386 logical_loc,
387 stack_depth,
388 fmt, &args);
389 va_end (args);
390
391 return result;
392}
393
395execution_path::add_event_va (physical_location physical_loc,
396 logical_location logical_loc,
397 unsigned stack_depth,
398 const char *fmt,
399 va_list *args)
400{
402 physical_loc.m_inner,
403 logical_loc.m_inner,
404 stack_depth,
405 fmt,
406 args);
407}
408
409// class group
410
411inline
412group::group (manager &mgr)
413: m_mgr (mgr)
414{
416}
417
418inline
423
424// class diagnostic
425
426inline void
427diagnostic::set_cwe (unsigned cwe_id)
428{
429 diagnostic_set_cwe (m_inner, cwe_id);
430}
431
432inline void
433diagnostic::add_rule (const char *title, const char *url)
434{
435 diagnostic_add_rule (m_inner, title, url);
436}
437
438inline void
443
444inline void
450
451inline void
456
457inline void
458diagnostic::add_fix_it_hint_insert_before (physical_location loc,
459 const char *addition)
460{
462 loc.m_inner,
463 addition);
464}
465
466inline void
467diagnostic::add_fix_it_hint_insert_after (physical_location loc,
468 const char *addition)
469{
471 loc.m_inner,
472 addition);
473}
474
475inline void
476diagnostic::add_fix_it_hint_replace (physical_location loc,
477 const char *replacement)
478{
480 loc.m_inner,
482}
483
484inline void
485diagnostic::add_fix_it_hint_delete (physical_location loc)
486{
488 loc.m_inner);
489}
490
491inline void
493{
495 path.m_inner);
496 path.m_owned = false;
497}
498
499inline void
500diagnostic::finish (const char *fmt, ...)
501{
502 va_list ap;
503 va_start (ap, fmt);
505 va_end (ap);
506}
507
508inline void
509diagnostic::finish_va (const char *fmt, va_list *args)
510{
511 diagnostic_finish_va (m_inner, fmt, args);
512}
513
514// class manager
515
516inline file
517manager::new_file (const char *name,
518 const char *sarif_source_language)
519{
520 return file
521 (diagnostic_manager_new_file (m_inner, name, sarif_source_language));
522}
523
533
536 line_num_t line_num,
537 column_num_t column_num)
538{
539 return physical_location
541 f.m_inner,
542 line_num,
543 column_num));
544}
545
548 physical_location loc_start,
549 physical_location loc_end)
550{
551 return physical_location
553 loc_caret.m_inner,
554 loc_start.m_inner,
555 loc_end.m_inner));
556}
557
558inline void
566inline logical_location
568 logical_location parent,
569 const char *short_name,
570 const char *fully_qualified_name,
571 const char *decorated_name)
572{
573 return logical_location
575 kind,
576 parent.m_inner,
577 short_name,
578 fully_qualified_name,
579 decorated_name));
580}
581
582inline void
590
591inline execution_path
596
597inline diagnostic
602
603} // namespace libgdiagnostics
604
605#endif // #ifndef LIBGDIAGNOSTICSPP_H
Definition genoutput.cc:150
Definition libgdiagnostics++.h:189
diagnostic(::diagnostic *d)
Definition libgdiagnostics++.h:191
void void ::diagnostic *const m_inner
Definition libgdiagnostics++.h:234
Definition libgdiagnostics++.h:116
execution_path(const diagnostic_execution_path *path)
Definition libgdiagnostics++.h:124
execution_path()
Definition libgdiagnostics++.h:118
diagnostic_event_id diagnostic_event_id add_event_va(physical_location physical_loc, logical_location logical_loc, unsigned stack_depth, const char *fmt, va_list *args) LIBGDIAGNOSTICS_PARAM_GCC_FORMAT_STRING(5
Definition libgdiagnostics++.h:395
execution_path(const execution_path &other)=delete
diagnostic_event_id diagnostic_event_id diagnostic_execution_path * m_inner
Definition libgdiagnostics++.h:170
execution_path(execution_path &&other)
Definition libgdiagnostics++.h:132
execution_path & operator=(const execution_path &other)=delete
bool m_owned
Definition libgdiagnostics++.h:171
diagnostic_event_id add_event(physical_location physical_loc, logical_location logical_loc, unsigned stack_depth, const char *fmt,...) LIBGDIAGNOSTICS_PARAM_GCC_FORMAT_STRING(5
Definition libgdiagnostics++.h:378
~execution_path()
Definition libgdiagnostics++.h:149
execution_path(diagnostic_execution_path *path)
Definition libgdiagnostics++.h:120
Definition libgdiagnostics++.h:73
file(diagnostic_file *file)
Definition libgdiagnostics++.h:76
file(const file &other)
Definition libgdiagnostics++.h:77
file & operator=(const file &other)
Definition libgdiagnostics++.h:78
void set_buffered_content(const char *data, size_t sz)
Definition libgdiagnostics++.h:370
diagnostic_file * m_inner
Definition libgdiagnostics++.h:82
file()
Definition libgdiagnostics++.h:75
Definition libgdiagnostics++.h:177
manager & m_mgr
Definition libgdiagnostics++.h:183
~group()
Definition libgdiagnostics++.h:419
Definition libgdiagnostics++.h:102
const diagnostic_logical_location * m_inner
Definition libgdiagnostics++.h:110
logical_location(const diagnostic_logical_location *logical_loc)
Definition libgdiagnostics++.h:106
logical_location()
Definition libgdiagnostics++.h:104
Definition libgdiagnostics++.h:240
manager(diagnostic_manager *inner, bool owned)
Definition libgdiagnostics++.h:247
execution_path new_execution_path()
Definition libgdiagnostics++.h:592
~manager()
Definition libgdiagnostics++.h:252
manager(manager &&other)
Definition libgdiagnostics++.h:259
physical_location new_location_from_file_and_line(file f, diagnostic_line_num_t line_num)
Definition libgdiagnostics++.h:525
diagnostic_manager * m_inner
Definition libgdiagnostics++.h:361
manager()
Definition libgdiagnostics++.h:242
void set_tool_name(const char *value)
Definition libgdiagnostics++.h:267
physical_location new_location_from_file_line_column(file f, line_num_t line_num, column_num_t column_num)
Definition libgdiagnostics++.h:535
void debug_dump(file f, FILE *out)
diagnostic begin_diagnostic(enum diagnostic_level level)
Definition libgdiagnostics++.h:598
file new_file(const char *name, const char *sarif_source_language) LIBGDIAGNOSTICS_PARAM_CAN_BE_NULL(3)
Definition libgdiagnostics++.h:517
manager(const manager &other)=delete
physical_location new_location_from_range(physical_location loc_caret, physical_location loc_start, physical_location loc_end)
Definition libgdiagnostics++.h:547
void set_version_string(const char *value)
Definition libgdiagnostics++.h:279
void write_patch(FILE *dst_stream)
Definition libgdiagnostics++.h:309
logical_location new_logical_location(enum diagnostic_logical_location_kind_t kind, logical_location parent, const char *short_name, const char *fully_qualified_name, const char *decorated_name)
Definition libgdiagnostics++.h:567
text_sink add_text_sink(FILE *dst_stream, enum diagnostic_colorize colorize)
Definition libgdiagnostics++.h:291
void add_sarif_sink(FILE *dst_stream, file main_input_file, enum diagnostic_sarif_version version)
Definition libgdiagnostics++.h:299
void set_version_url(const char *value)
Definition libgdiagnostics++.h:285
void set_full_name(const char *value)
Definition libgdiagnostics++.h:273
Definition libgdiagnostics++.h:88
const diagnostic_physical_location * m_inner
Definition libgdiagnostics++.h:96
physical_location()
Definition libgdiagnostics++.h:90
physical_location(const diagnostic_physical_location *location)
Definition libgdiagnostics++.h:92
Definition libgdiagnostics++.h:41
void set_labelled_source_colorization_enabled(int value)
Definition libgdiagnostics++.h:61
void set_source_printing_enabled(int value)
Definition libgdiagnostics++.h:49
void set_colorize(enum diagnostic_colorize colorize)
Definition libgdiagnostics++.h:55
diagnostic_text_sink * m_inner
Definition libgdiagnostics++.h:67
text_sink(diagnostic_text_sink *inner)
Definition libgdiagnostics++.h:43
void diagnostic_manager_release(diagnostic_manager *diag_mgr)
Definition libgdiagnostics.cc:1137
void diagnostic_manager_set_full_name(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1157
diagnostic_text_sink * diagnostic_manager_add_text_sink(diagnostic_manager *diag_mgr, FILE *dst_stream, enum diagnostic_colorize colorize)
Definition libgdiagnostics.cc:1193
const diagnostic_logical_location * diagnostic_manager_new_logical_location(diagnostic_manager *diag_mgr, enum diagnostic_logical_location_kind_t kind, const diagnostic_logical_location *parent, const char *short_name, const char *fully_qualified_name, const char *decorated_name)
Definition libgdiagnostics.cc:1410
void diagnostic_add_fix_it_hint_delete(diagnostic *diag, const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:1634
void diagnostic_manager_write_patch(diagnostic_manager *diag_mgr, FILE *dst_stream)
Definition libgdiagnostics.cc:1276
void diagnostic_manager_add_sarif_sink(diagnostic_manager *diag_mgr, FILE *dst_stream, const diagnostic_file *main_input_file, enum diagnostic_sarif_version version)
Definition libgdiagnostics.cc:1243
void diagnostic_text_sink_set_labelled_source_colorization_enabled(diagnostic_text_sink *text_sink, int value)
Definition libgdiagnostics.cc:1231
void diagnostic_manager_end_group(diagnostic_manager *diag_mgr)
Definition libgdiagnostics.cc:1494
const diagnostic_physical_location * diagnostic_manager_new_location_from_range(diagnostic_manager *diag_mgr, const diagnostic_physical_location *loc_caret, const diagnostic_physical_location *loc_start, const diagnostic_physical_location *loc_end)
Definition libgdiagnostics.cc:1365
void diagnostic_add_rule(diagnostic *diag, const char *title, const char *url)
Definition libgdiagnostics.cc:1525
diagnostic * diagnostic_begin(diagnostic_manager *diag_mgr, enum diagnostic_level level)
Definition libgdiagnostics.cc:1503
void diagnostic_text_sink_set_colorize(diagnostic_text_sink *text_sink, enum diagnostic_colorize colorize)
Definition libgdiagnostics.cc:1220
diagnostic_manager * diagnostic_manager_new(void)
Definition libgdiagnostics.cc:1129
void diagnostic_set_location(diagnostic *diag, const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:1537
void diagnostic_add_fix_it_hint_insert_before(diagnostic *diag, const diagnostic_physical_location *loc, const char *addition)
Definition libgdiagnostics.cc:1586
void diagnostic_manager_debug_dump_logical_location(const diagnostic_manager *diag_mgr, const diagnostic_logical_location *loc, FILE *out)
Definition libgdiagnostics.cc:1427
diagnostic_event_id diagnostic_execution_path_add_event_va(diagnostic_execution_path *path, const diagnostic_physical_location *physical_loc, const diagnostic_logical_location *logical_loc, unsigned stack_depth, const char *gmsgid, va_list *args)
Definition libgdiagnostics.cc:1710
const diagnostic_physical_location * diagnostic_manager_new_location_from_file_line_column(diagnostic_manager *diag_mgr, const diagnostic_file *file, diagnostic_line_num_t line_num, diagnostic_column_num_t column_num)
Definition libgdiagnostics.cc:1349
void diagnostic_manager_set_version_url(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1181
void diagnostic_file_set_buffered_content(diagnostic_file *file, const char *buf, size_t sz)
Definition libgdiagnostics.cc:1301
void diagnostic_set_logical_location(diagnostic *diag, const diagnostic_logical_location *logical_loc)
Definition libgdiagnostics.cc:1575
void diagnostic_add_fix_it_hint_replace(diagnostic *diag, const diagnostic_physical_location *loc, const char *replacement)
Definition libgdiagnostics.cc:1618
void diagnostic_manager_debug_dump_location(const diagnostic_manager *diag_mgr, const diagnostic_physical_location *loc, FILE *out)
Definition libgdiagnostics.cc:1380
void diagnostic_manager_set_version_string(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1169
void diagnostic_add_location_with_label(diagnostic *diag, const diagnostic_physical_location *loc, const char *text)
Definition libgdiagnostics.cc:1561
diagnostic_file * diagnostic_manager_new_file(diagnostic_manager *diag_mgr, const char *name, const char *sarif_source_language)
Definition libgdiagnostics.cc:1288
void diagnostic_manager_begin_group(diagnostic_manager *diag_mgr)
Definition libgdiagnostics.cc:1485
void diagnostic_manager_set_tool_name(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1145
void diagnostic_set_cwe(diagnostic *diag, unsigned cwe_id)
Definition libgdiagnostics.cc:1514
void diagnostic_finish_va(diagnostic *diag, const char *gmsgid, va_list *args)
Definition libgdiagnostics.cc:1743
void diagnostic_execution_path_release(diagnostic_execution_path *path)
Definition libgdiagnostics.cc:1679
void diagnostic_add_fix_it_hint_insert_after(diagnostic *diag, const diagnostic_physical_location *loc, const char *addition)
Definition libgdiagnostics.cc:1602
void diagnostic_text_sink_set_source_printing_enabled(diagnostic_text_sink *text_sink, int value)
Definition libgdiagnostics.cc:1209
const diagnostic_physical_location * diagnostic_manager_new_location_from_file_and_line(diagnostic_manager *diag_mgr, const diagnostic_file *file, diagnostic_line_num_t linenum)
Definition libgdiagnostics.cc:1336
diagnostic_execution_path * diagnostic_manager_new_execution_path(diagnostic_manager *manager)
Definition libgdiagnostics.cc:1657
void diagnostic_take_execution_path(diagnostic *diag, diagnostic_execution_path *path)
Definition libgdiagnostics.cc:1667
#define LIBGDIAGNOSTICS_PARAM_CAN_BE_NULL(ARG_NUM)
Definition libgdiagnostics.h:50
int diagnostic_event_id
Definition libgdiagnostics.h:215
#define LIBGDIAGNOSTICS_PARAM_GCC_FORMAT_STRING(FMT_ARG_NUM, ARGS_ARG_NUM)
Definition libgdiagnostics.h:53
#define LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL(ARG_NUM)
Definition libgdiagnostics.h:47
diagnostic_logical_location_kind_t
Definition libgdiagnostics.h:163
unsigned int diagnostic_line_num_t
Definition libgdiagnostics.h:148
diagnostic_sarif_version
Definition libgdiagnostics.h:90
diagnostic_colorize
Definition libgdiagnostics.h:81
unsigned int diagnostic_column_num_t
Definition libgdiagnostics.h:149
diagnostic_level
Definition libgdiagnostics.h:203
struct diagnostic diagnostic
Definition libgdiagnostics.h:200
Definition libgdiagnostics++.h:25
diagnostic_line_num_t line_num_t
Definition libgdiagnostics++.h:27
diagnostic_column_num_t column_num_t
Definition libgdiagnostics++.h:28
static void const char va_list ap
Definition read-md.cc:205
Definition libgdiagnostics.cc:765
Definition libgdiagnostics.cc:110
Definition libgdiagnostics.cc:165
Definition libgdiagnostics.cc:365
Definition libgdiagnostics.cc:143
Definition libgdiagnostics.cc:270
Definition libgdiagnostics.cc:824
void add_location_with_label(const diagnostic_physical_location *loc, const char *text)
Definition libgdiagnostics.cc:871
void set_cwe(unsigned cwe_id)
Definition libgdiagnostics.cc:845
void set_location(const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:858
void take_execution_path(diagnostic_execution_path *path)
Definition libgdiagnostics.cc:901
void add_rule(const char *title, const char *url)
Definition libgdiagnostics.cc:850
void set_logical_location(const diagnostic_logical_location *logical_loc)
Definition libgdiagnostics.cc:883
Definition reload.cc:154
#define true
Definition system.h:887
#define false
Definition system.h:888