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
96 file get_file () const;
97
99};
100
101/* Wrapper around a const diagnostic_logical_location *. */
102
104{
105public:
106 logical_location () : m_inner (nullptr) {}
107
109 : m_inner (logical_loc)
110 {}
111
113};
114
115/* RAII class around a diagnostic_execution_path *. */
116
118{
119public:
120 execution_path () : m_inner (nullptr), m_owned (false) {}
121
125
130
131 execution_path (const execution_path &other) = delete;
132 execution_path &operator= (const execution_path &other) = delete;
133
135 : m_inner (other.m_inner),
136 m_owned (other.m_owned)
137 {
138 other.m_inner = nullptr;
139 other.m_owned = false;
140 }
141
143 {
144 m_inner = other.m_inner;
145 m_owned = other.m_owned;
146 other.m_inner = nullptr;
147 other.m_owned = false;
148 return *this;
149 }
150
156
158 add_event (physical_location physical_loc,
159 logical_location logical_loc,
160 unsigned stack_depth,
161 const char *fmt, ...)
163
165 add_event_va (physical_location physical_loc,
166 logical_location logical_loc,
167 unsigned stack_depth,
168 const char *fmt,
169 va_list *args)
171
174};
175
176/* RAII class for starting/ending a group within a diagnostic_manager. */
177
178class group
179{
180public:
181 group (manager &mgr);
182 ~group ();
183
184private:
186};
187
188/* Wrapper around a diagnostic *. */
189
191{
192public:
194
195 void
196 set_cwe (unsigned cwe_id);
197
198 void
199 add_rule (const char *title, const char *url);
200
201 void
202 set_location (physical_location loc);
203
204 void
205 add_location (physical_location loc);
206
207 void
208 add_location_with_label (physical_location loc,
209 const char *text);
210
211 void
212 set_logical_location (logical_location loc);
213
214 void
215 add_fix_it_hint_insert_before (physical_location loc,
216 const char *addition);
217 void
218 add_fix_it_hint_insert_after (physical_location loc,
219 const char *addition);
220 void
221 add_fix_it_hint_replace (physical_location loc,
222 const char *replacement);
223 void
224 add_fix_it_hint_delete (physical_location loc);
225
226 void
227 take_execution_path (execution_path path);
228
229 void
230 finish (const char *fmt, ...)
233
234 void
235 finish_va (const char *fmt, va_list *args)
238
240};
241
242/* Wrapper around a diagnostic_manager *, possibly with ownership. */
243
245{
246public:
249 m_owned (true)
250 {
251 }
252 manager (diagnostic_manager *inner, bool owned)
253 : m_inner (inner),
254 m_owned (owned)
255 {
256 }
258 {
259 if (m_owned)
261 }
262
263 manager (const manager &other) = delete;
264 manager (manager &&other)
265 : m_inner (other.m_inner),
266 m_owned (other.m_owned)
267 {
268 other.m_inner = nullptr;
269 }
270
271 void
272 set_tool_name (const char *value)
273 {
275 }
276
277 void
278 set_full_name (const char *value)
279 {
281 }
282
283 void
284 set_version_string (const char *value)
285 {
287 }
288
289 void
290 set_version_url (const char *value)
291 {
293 }
294
296 add_text_sink (FILE *dst_stream,
297 enum diagnostic_colorize colorize)
298 {
299 return text_sink
300 (diagnostic_manager_add_text_sink (m_inner, dst_stream, colorize));
301 }
302
303 void
304 add_sarif_sink (FILE *dst_stream,
305 file main_input_file,
306 enum diagnostic_sarif_version version)
307 {
309 main_input_file.m_inner,
310 version);
311 }
312
313 void
314 write_patch (FILE *dst_stream)
315 {
317 }
318
319 /* Location management. */
320
321 file
322 new_file (const char *name,
323 const char *sarif_source_language)
326
327 void
329 FILE *out);
330
333
336 line_num_t line_num,
337 column_num_t column_num);
338
341 physical_location loc_start,
342 physical_location loc_end);
343
344 void
346 FILE *out);
347
350 logical_location parent,
351 const char *short_name,
352 const char *fully_qualified_name,
353 const char *decorated_name);
354
355 void
357 FILE *out);
358
361
364
365
368};
369
370// Implementation
371
372// class file
373
374inline void
375file::set_buffered_content (const char *data, size_t sz)
376{
378}
379
380// class physical_location
381
382inline file
387
388// class execution_path
389
392 logical_location logical_loc,
393 unsigned stack_depth,
394 const char *fmt, ...)
395{
396 va_list args;
397 va_start (args, fmt);
398 diagnostic_event_id result = add_event_va (physical_loc,
399 logical_loc,
400 stack_depth,
401 fmt, &args);
402 va_end (args);
403
404 return result;
405}
406
409 logical_location logical_loc,
410 unsigned stack_depth,
411 const char *fmt,
412 va_list *args)
413{
415 physical_loc.m_inner,
416 logical_loc.m_inner,
417 stack_depth,
418 fmt,
419 args);
420}
421
422// class group
423
424inline
426: m_mgr (mgr)
427{
429}
430
431inline
436
437// class diagnostic
438
439inline void
440diagnostic::set_cwe (unsigned cwe_id)
441{
442 diagnostic_set_cwe (m_inner, cwe_id);
443}
444
445inline void
446diagnostic::add_rule (const char *title, const char *url)
447{
448 diagnostic_add_rule (m_inner, title, url);
449}
450
451inline void
456
457inline void
463
464inline void
469
470inline void
475
476inline void
477diagnostic::add_fix_it_hint_insert_before (physical_location loc,
478 const char *addition)
479{
481 loc.m_inner,
482 addition);
483}
484
485inline void
486diagnostic::add_fix_it_hint_insert_after (physical_location loc,
487 const char *addition)
488{
490 loc.m_inner,
491 addition);
492}
493
494inline void
495diagnostic::add_fix_it_hint_replace (physical_location loc,
496 const char *replacement)
497{
499 loc.m_inner,
501}
502
503inline void
504diagnostic::add_fix_it_hint_delete (physical_location loc)
505{
507 loc.m_inner);
508}
509
510inline void
517
518inline void
519diagnostic::finish (const char *fmt, ...)
520{
521 va_list ap;
522 va_start (ap, fmt);
524 va_end (ap);
525}
526
527inline void
528diagnostic::finish_va (const char *fmt, va_list *args)
529{
530 diagnostic_finish_va (m_inner, fmt, args);
531}
532
533// class manager
534
535inline file
536manager::new_file (const char *name,
537 const char *sarif_source_language)
538{
539 return file
540 (diagnostic_manager_new_file (m_inner, name, sarif_source_language));
541}
542
552
555 line_num_t line_num,
556 column_num_t column_num)
557{
558 return physical_location
560 f.m_inner,
561 line_num,
562 column_num));
563}
564
567 physical_location loc_start,
568 physical_location loc_end)
569{
570 return physical_location
572 loc_caret.m_inner,
573 loc_start.m_inner,
574 loc_end.m_inner));
575}
576
577inline void
585inline logical_location
587 logical_location parent,
588 const char *short_name,
589 const char *fully_qualified_name,
590 const char *decorated_name)
591{
592 return logical_location
594 kind,
595 parent.m_inner,
596 short_name,
597 fully_qualified_name,
598 decorated_name));
599}
600
601inline void
609
610inline execution_path
615
616inline diagnostic
621
622} // namespace libgdiagnostics
623
624#endif // #ifndef LIBGDIAGNOSTICSPP_H
Definition genoutput.cc:150
Definition libgdiagnostics++.h:191
diagnostic(::diagnostic *d)
Definition libgdiagnostics++.h:193
void void ::diagnostic *const m_inner
Definition libgdiagnostics++.h:239
Definition libgdiagnostics++.h:118
execution_path(const diagnostic_execution_path *path)
Definition libgdiagnostics++.h:126
execution_path()
Definition libgdiagnostics++.h:120
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:408
execution_path(const execution_path &other)=delete
diagnostic_event_id diagnostic_event_id diagnostic_execution_path * m_inner
Definition libgdiagnostics++.h:172
execution_path(execution_path &&other)
Definition libgdiagnostics++.h:134
execution_path & operator=(const execution_path &other)=delete
bool m_owned
Definition libgdiagnostics++.h:173
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:391
~execution_path()
Definition libgdiagnostics++.h:151
execution_path(diagnostic_execution_path *path)
Definition libgdiagnostics++.h:122
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:375
diagnostic_file * m_inner
Definition libgdiagnostics++.h:82
file()
Definition libgdiagnostics++.h:75
Definition libgdiagnostics++.h:179
manager & m_mgr
Definition libgdiagnostics++.h:185
group(manager &mgr)
Definition libgdiagnostics++.h:425
~group()
Definition libgdiagnostics++.h:432
Definition libgdiagnostics++.h:104
const diagnostic_logical_location * m_inner
Definition libgdiagnostics++.h:112
logical_location(const diagnostic_logical_location *logical_loc)
Definition libgdiagnostics++.h:108
logical_location()
Definition libgdiagnostics++.h:106
Definition libgdiagnostics++.h:245
manager(diagnostic_manager *inner, bool owned)
Definition libgdiagnostics++.h:252
execution_path new_execution_path()
Definition libgdiagnostics++.h:611
~manager()
Definition libgdiagnostics++.h:257
manager(manager &&other)
Definition libgdiagnostics++.h:264
physical_location new_location_from_file_and_line(file f, diagnostic_line_num_t line_num)
Definition libgdiagnostics++.h:544
diagnostic_manager * m_inner
Definition libgdiagnostics++.h:366
manager()
Definition libgdiagnostics++.h:247
void set_tool_name(const char *value)
Definition libgdiagnostics++.h:272
physical_location new_location_from_file_line_column(file f, line_num_t line_num, column_num_t column_num)
Definition libgdiagnostics++.h:554
void debug_dump(file f, FILE *out)
diagnostic begin_diagnostic(enum diagnostic_level level)
Definition libgdiagnostics++.h:617
file new_file(const char *name, const char *sarif_source_language) LIBGDIAGNOSTICS_PARAM_CAN_BE_NULL(3)
Definition libgdiagnostics++.h:536
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:566
void set_version_string(const char *value)
Definition libgdiagnostics++.h:284
void write_patch(FILE *dst_stream)
Definition libgdiagnostics++.h:314
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:586
text_sink add_text_sink(FILE *dst_stream, enum diagnostic_colorize colorize)
Definition libgdiagnostics++.h:296
void add_sarif_sink(FILE *dst_stream, file main_input_file, enum diagnostic_sarif_version version)
Definition libgdiagnostics++.h:304
bool m_owned
Definition libgdiagnostics++.h:367
void set_version_url(const char *value)
Definition libgdiagnostics++.h:290
void set_full_name(const char *value)
Definition libgdiagnostics++.h:278
Definition libgdiagnostics++.h:88
file get_file() const
Definition libgdiagnostics++.h:383
const diagnostic_physical_location * m_inner
Definition libgdiagnostics++.h:98
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
static struct path_prefix cpath path
Definition collect2.cc:514
void diagnostic_manager_release(diagnostic_manager *diag_mgr)
Definition libgdiagnostics.cc:1159
void diagnostic_manager_set_full_name(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1179
diagnostic_text_sink * diagnostic_manager_add_text_sink(diagnostic_manager *diag_mgr, FILE *dst_stream, enum diagnostic_colorize colorize)
Definition libgdiagnostics.cc:1215
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:1432
void diagnostic_add_location(diagnostic *diag, const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:1571
void diagnostic_add_fix_it_hint_delete(diagnostic *diag, const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:1656
void diagnostic_manager_write_patch(diagnostic_manager *diag_mgr, FILE *dst_stream)
Definition libgdiagnostics.cc:1298
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:1265
void diagnostic_text_sink_set_labelled_source_colorization_enabled(diagnostic_text_sink *text_sink, int value)
Definition libgdiagnostics.cc:1253
void diagnostic_manager_end_group(diagnostic_manager *diag_mgr)
Definition libgdiagnostics.cc:1516
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:1387
void diagnostic_add_rule(diagnostic *diag, const char *title, const char *url)
Definition libgdiagnostics.cc:1547
diagnostic * diagnostic_begin(diagnostic_manager *diag_mgr, enum diagnostic_level level)
Definition libgdiagnostics.cc:1525
void diagnostic_text_sink_set_colorize(diagnostic_text_sink *text_sink, enum diagnostic_colorize colorize)
Definition libgdiagnostics.cc:1242
diagnostic_manager * diagnostic_manager_new(void)
Definition libgdiagnostics.cc:1151
void diagnostic_set_location(diagnostic *diag, const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:1559
void diagnostic_add_fix_it_hint_insert_before(diagnostic *diag, const diagnostic_physical_location *loc, const char *addition)
Definition libgdiagnostics.cc:1608
void diagnostic_manager_debug_dump_logical_location(const diagnostic_manager *diag_mgr, const diagnostic_logical_location *loc, FILE *out)
Definition libgdiagnostics.cc:1449
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:1732
diagnostic_file * diagnostic_physical_location_get_file(const diagnostic_physical_location *physical_loc)
Definition libgdiagnostics.cc:1782
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:1371
void diagnostic_manager_set_version_url(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1203
void diagnostic_file_set_buffered_content(diagnostic_file *file, const char *buf, size_t sz)
Definition libgdiagnostics.cc:1323
void diagnostic_set_logical_location(diagnostic *diag, const diagnostic_logical_location *logical_loc)
Definition libgdiagnostics.cc:1597
void diagnostic_add_fix_it_hint_replace(diagnostic *diag, const diagnostic_physical_location *loc, const char *replacement)
Definition libgdiagnostics.cc:1640
void diagnostic_manager_debug_dump_location(const diagnostic_manager *diag_mgr, const diagnostic_physical_location *loc, FILE *out)
Definition libgdiagnostics.cc:1402
void diagnostic_manager_set_version_string(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1191
void diagnostic_add_location_with_label(diagnostic *diag, const diagnostic_physical_location *loc, const char *text)
Definition libgdiagnostics.cc:1583
diagnostic_file * diagnostic_manager_new_file(diagnostic_manager *diag_mgr, const char *name, const char *sarif_source_language)
Definition libgdiagnostics.cc:1310
void diagnostic_manager_begin_group(diagnostic_manager *diag_mgr)
Definition libgdiagnostics.cc:1507
void diagnostic_manager_set_tool_name(diagnostic_manager *diag_mgr, const char *value)
Definition libgdiagnostics.cc:1167
void diagnostic_set_cwe(diagnostic *diag, unsigned cwe_id)
Definition libgdiagnostics.cc:1536
void diagnostic_finish_va(diagnostic *diag, const char *gmsgid, va_list *args)
Definition libgdiagnostics.cc:1765
void diagnostic_execution_path_release(diagnostic_execution_path *path)
Definition libgdiagnostics.cc:1701
void diagnostic_add_fix_it_hint_insert_after(diagnostic *diag, const diagnostic_physical_location *loc, const char *addition)
Definition libgdiagnostics.cc:1624
void diagnostic_text_sink_set_source_printing_enabled(diagnostic_text_sink *text_sink, int value)
Definition libgdiagnostics.cc:1231
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:1358
diagnostic_execution_path * diagnostic_manager_new_execution_path(diagnostic_manager *manager)
Definition libgdiagnostics.cc:1679
void diagnostic_take_execution_path(diagnostic *diag, diagnostic_execution_path *path)
Definition libgdiagnostics.cc:1689
#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:775
Definition libgdiagnostics.cc:110
Definition libgdiagnostics.cc:167
Definition libgdiagnostics.cc:367
Definition libgdiagnostics.cc:143
Definition libgdiagnostics.cc:272
void add_location_with_label(const diagnostic_physical_location *loc, const char *text)
Definition libgdiagnostics.cc:881
void set_cwe(unsigned cwe_id)
Definition libgdiagnostics.cc:855
void set_location(const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:868
void take_execution_path(diagnostic_execution_path *path)
Definition libgdiagnostics.cc:911
void add_location(const diagnostic_physical_location *loc)
Definition libgdiagnostics.cc:874
void add_rule(const char *title, const char *url)
Definition libgdiagnostics.cc:860
void set_logical_location(const diagnostic_logical_location *logical_loc)
Definition libgdiagnostics.cc:893
Definition reload.cc:154
#define true
Definition system.h:887
#define false
Definition system.h:888