<feed xmlns='http://www.w3.org/2005/Atom'>
<title>gcc.git/libcpp/include, branch master</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/'/>
<entry>
<title>libcpp: Improve locations for macros defined prior to PCH include [PR105608]</title>
<updated>2025-11-10T01:01:39+00:00</updated>
<author>
<name>Lewis Hyatt</name>
<email>lhyatt@gmail.com</email>
</author>
<published>2025-07-30T23:20:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=d538348556bd05fba13e41cb8497bda2eb086e63'/>
<id>d538348556bd05fba13e41cb8497bda2eb086e63</id>
<content type='text'>
It is permissible to define macros prior to including a PCH, as long as
these definitions are disjoint from or identical to the macros in the
PCH. The PCH loading process replaces all libcpp data structures with those
from the PCH, so it is necessary to remember the extra macros separately and
then restore them after loading the PCH, which all is handled by
cpp_save_state() and cpp_read_state() in libcpp/pch.cc. The restoration
process consists of pushing a buffer containing the macro definition and
then lexing it from there, similar to how a command-line -D option is
processed. The current implementation does not attempt to set up the
line_map for this process, and so the locations assigned to the macros are
often not meaningful. (Similar to what happened in the past with lexing the
tokens out of a _Pragma string, lexing out of a buffer rather than a file
produces "sorta" reasonable locations that are often close enough, but not
reliably correct.)

Fix that up by remembering enough additional information (more or less, an
expanded_location for each macro definition) to produce a reasonable
location for the newly restored macros.

One issue that came up is the treatment of command-line-defined macros. From
the perspective of the generic line_map data structures, the command-line
location is not distinguishable from other locations; it's just an ordinary
location created by the front ends with a fake file name by convention. (At
the moment, it is always the string `&lt;command-line&gt;', subject to
translation.)  Since libcpp needs to assign macros to that location, it
needs to know what location to use, so I added a new member
line_maps::cmdline_location for the front ends to set, similar to how
line_maps::builtin_location is handled.

This revealed a small issue, in c-opts.cc we have:

    /* All command line defines must have the same location.  */
      cpp_force_token_locations (parse_in, line_table-&gt;highest_line);

But contrary to the comment, all command line defines don't actually end up
with the same location anymore. This is because libcpp/lex.cc has been
expanded (r6-4873) to include range information on the returned
locations. That logic has never been respecting the request of
cpp_force_token_locations. I believe this was not intentional, and so I have
corrected that here. Prior to this patch, the range logic has been leading
to command-line macros all having similar locations in the same line map (or
ad-hoc locations based from there for sufficiently long tokens); with this
change, they all have exactly the same location and that location is
recorded in line_maps::cmdline_location.

With that change, then it works fine for pch.cc to restore macros whether
they came from the command-line or from the main file.

gcc/c-family/ChangeLog:

	PR preprocessor/105608
	* c-opts.cc (c_finish_options): Set new member
	line_table-&gt;cmdline_location.
	* c-pch.cc (c_common_read_pch): Adapt linemap usage to changes in
	libcpp pch.cc; it is now possible that the linemap is in a different
	file after returning from cpp_read_state().

libcpp/ChangeLog:

	PR preprocessor/105608
	* include/line-map.h: Add new member CMDLINE_LOCATION.
	* lex.cc (get_location_for_byte_range_in_cur_line): Do not expand
	the token location to include range information if token location
	override was requested.
	(warn_about_normalization): Likewise.
	(_cpp_lex_direct): Likewise.
	* pch.cc (struct saved_macro): New local struct.
	(struct save_macro_data): Change DEFNS vector to hold saved_macro
	rather than uchar*.
	(save_macros): Adapt to remember the location information for each
	saved macro in addition to the definition.
	(cpp_prepare_state): Likewise.
	(cpp_read_state): Use the saved location information to generate
	proper locations for the restored macros.

gcc/testsuite/ChangeLog:

	PR preprocessor/105608
	* g++.dg/pch/line-map-3.C: Remove xfails.
	* g++.dg/pch/line-map-4.C: New test.
	* g++.dg/pch/line-map-4.Hs: New test.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
It is permissible to define macros prior to including a PCH, as long as
these definitions are disjoint from or identical to the macros in the
PCH. The PCH loading process replaces all libcpp data structures with those
from the PCH, so it is necessary to remember the extra macros separately and
then restore them after loading the PCH, which all is handled by
cpp_save_state() and cpp_read_state() in libcpp/pch.cc. The restoration
process consists of pushing a buffer containing the macro definition and
then lexing it from there, similar to how a command-line -D option is
processed. The current implementation does not attempt to set up the
line_map for this process, and so the locations assigned to the macros are
often not meaningful. (Similar to what happened in the past with lexing the
tokens out of a _Pragma string, lexing out of a buffer rather than a file
produces "sorta" reasonable locations that are often close enough, but not
reliably correct.)

Fix that up by remembering enough additional information (more or less, an
expanded_location for each macro definition) to produce a reasonable
location for the newly restored macros.

One issue that came up is the treatment of command-line-defined macros. From
the perspective of the generic line_map data structures, the command-line
location is not distinguishable from other locations; it's just an ordinary
location created by the front ends with a fake file name by convention. (At
the moment, it is always the string `&lt;command-line&gt;', subject to
translation.)  Since libcpp needs to assign macros to that location, it
needs to know what location to use, so I added a new member
line_maps::cmdline_location for the front ends to set, similar to how
line_maps::builtin_location is handled.

This revealed a small issue, in c-opts.cc we have:

    /* All command line defines must have the same location.  */
      cpp_force_token_locations (parse_in, line_table-&gt;highest_line);

But contrary to the comment, all command line defines don't actually end up
with the same location anymore. This is because libcpp/lex.cc has been
expanded (r6-4873) to include range information on the returned
locations. That logic has never been respecting the request of
cpp_force_token_locations. I believe this was not intentional, and so I have
corrected that here. Prior to this patch, the range logic has been leading
to command-line macros all having similar locations in the same line map (or
ad-hoc locations based from there for sufficiently long tokens); with this
change, they all have exactly the same location and that location is
recorded in line_maps::cmdline_location.

With that change, then it works fine for pch.cc to restore macros whether
they came from the command-line or from the main file.

gcc/c-family/ChangeLog:

	PR preprocessor/105608
	* c-opts.cc (c_finish_options): Set new member
	line_table-&gt;cmdline_location.
	* c-pch.cc (c_common_read_pch): Adapt linemap usage to changes in
	libcpp pch.cc; it is now possible that the linemap is in a different
	file after returning from cpp_read_state().

libcpp/ChangeLog:

	PR preprocessor/105608
	* include/line-map.h: Add new member CMDLINE_LOCATION.
	* lex.cc (get_location_for_byte_range_in_cur_line): Do not expand
	the token location to include range information if token location
	override was requested.
	(warn_about_normalization): Likewise.
	(_cpp_lex_direct): Likewise.
	* pch.cc (struct saved_macro): New local struct.
	(struct save_macro_data): Change DEFNS vector to hold saved_macro
	rather than uchar*.
	(save_macros): Adapt to remember the location information for each
	saved macro in addition to the definition.
	(cpp_prepare_state): Likewise.
	(cpp_read_state): Use the saved location information to generate
	proper locations for the restored macros.

gcc/testsuite/ChangeLog:

	PR preprocessor/105608
	* g++.dg/pch/line-map-3.C: Remove xfails.
	* g++.dg/pch/line-map-4.C: New test.
	* g++.dg/pch/line-map-4.Hs: New test.
</pre>
</div>
</content>
</entry>
<entry>
<title>sarif output: add descriptions to fix-it hints (§3.55.2) [PR121986]</title>
<updated>2025-09-23T20:45:12+00:00</updated>
<author>
<name>David Malcolm</name>
<email>dmalcolm@redhat.com</email>
</author>
<published>2025-09-23T20:38:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=0d5af6a757051708d2dfa510b2ad84f083d7eddc'/>
<id>0d5af6a757051708d2dfa510b2ad84f083d7eddc</id>
<content type='text'>
SARIF "fix" objects SHOULD have a "description" property (§3.55.2) that
describes the proposed fix, but currently GCC's SARIF output doesn't
support this, and we don't capture this anywhere internally as we build
fix-it hints in the compiler.

Currently we can have zero or more instances of fixit_hint associated
with a diagnostic, each representing an edit of a range of the source
code. Ideally we would have an internal API that allowed for associating
multiple fixes with a diagnostic, each with a description worded in terms
of the source language (e.g. "Fix 'colour' mispelling of field 'color'"),
and each consisting of multiple edited ranges.

For now, this patch extends the sarif output sink so that it
autogenerates descriptions of fix-it hints for simple cases of
insertion, deletion, and replacement of a single range
(e.g. "Replace 'colour' with 'color'").

gcc/ChangeLog:
	PR diagnostics/121986
	* diagnostics/sarif-sink.cc: Include "intl.h".
	(sarif_builder::make_message_describing_fix_it_hint): New.
	(sarif_builder::make_fix_object): Attempt to auto-generate a
	description for fix-it hints.

gcc/testsuite/ChangeLog:
	PR diagnostics/121986
	* gcc.dg/sarif-output/extra-semicolon.c: New test.
	* gcc.dg/sarif-output/extra-semicolon.py: New test.
	* gcc.dg/sarif-output/missing-semicolon.py: Verify the description
	of the insertion fix-it hint.
	* libgdiagnostics.dg/test-fix-it-hint-c.py: Verify the description
	of the replacement fix-it hint.

libcpp/ChangeLog:
	PR diagnostics/121986
	* include/rich-location.h (fixit_hint::deletion_p): New accessor.
	(fixit_hint::replacement_p): New accessor.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
SARIF "fix" objects SHOULD have a "description" property (§3.55.2) that
describes the proposed fix, but currently GCC's SARIF output doesn't
support this, and we don't capture this anywhere internally as we build
fix-it hints in the compiler.

Currently we can have zero or more instances of fixit_hint associated
with a diagnostic, each representing an edit of a range of the source
code. Ideally we would have an internal API that allowed for associating
multiple fixes with a diagnostic, each with a description worded in terms
of the source language (e.g. "Fix 'colour' mispelling of field 'color'"),
and each consisting of multiple edited ranges.

For now, this patch extends the sarif output sink so that it
autogenerates descriptions of fix-it hints for simple cases of
insertion, deletion, and replacement of a single range
(e.g. "Replace 'colour' with 'color'").

gcc/ChangeLog:
	PR diagnostics/121986
	* diagnostics/sarif-sink.cc: Include "intl.h".
	(sarif_builder::make_message_describing_fix_it_hint): New.
	(sarif_builder::make_fix_object): Attempt to auto-generate a
	description for fix-it hints.

gcc/testsuite/ChangeLog:
	PR diagnostics/121986
	* gcc.dg/sarif-output/extra-semicolon.c: New test.
	* gcc.dg/sarif-output/extra-semicolon.py: New test.
	* gcc.dg/sarif-output/missing-semicolon.py: Verify the description
	of the insertion fix-it hint.
	* libgdiagnostics.dg/test-fix-it-hint-c.py: Verify the description
	of the replacement fix-it hint.

libcpp/ChangeLog:
	PR diagnostics/121986
	* include/rich-location.h (fixit_hint::deletion_p): New accessor.
	(fixit_hint::replacement_p): New accessor.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>diagnostics/libcpp: convert enum location_aspect to enum class</title>
<updated>2025-09-18T20:07:04+00:00</updated>
<author>
<name>David Malcolm</name>
<email>dmalcolm@redhat.com</email>
</author>
<published>2025-09-18T20:07:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=21fe45f111cf531c1a20cec837492d22addfa6c2'/>
<id>21fe45f111cf531c1a20cec837492d22addfa6c2</id>
<content type='text'>
Modernization; no functional change intended.

gcc/ChangeLog:
	* diagnostics/paths-output.cc: Update for conversion of
	location_aspect to enum class.
	* diagnostics/source-printing.cc: Likewise.
	* input.cc: Likewise.
	* input.h: Likewise.

libcpp/ChangeLog:
	* include/line-map.h (enum location_aspect): Convert to...
	(enum class location_aspect): ...this.
	* line-map.cc: Update for conversion of location_aspect to enum
	class.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Modernization; no functional change intended.

gcc/ChangeLog:
	* diagnostics/paths-output.cc: Update for conversion of
	location_aspect to enum class.
	* diagnostics/source-printing.cc: Likewise.
	* input.cc: Likewise.
	* input.h: Likewise.

libcpp/ChangeLog:
	* include/line-map.h (enum location_aspect): Convert to...
	(enum class location_aspect): ...this.
	* line-map.cc: Update for conversion of location_aspect to enum
	class.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>c++: Warn on #undef/#define of remaining cpp.predefined macros [PR120778]</title>
<updated>2025-08-15T20:31:27+00:00</updated>
<author>
<name>Jakub Jelinek</name>
<email>jakub@redhat.com</email>
</author>
<published>2025-08-15T20:31:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=cdd015c4ddbb1ae71eea1e44654cee5ca29a6c64'/>
<id>cdd015c4ddbb1ae71eea1e44654cee5ca29a6c64</id>
<content type='text'>
We already warn on #undef or pedwarn on #define (but not on #define
after #undef) of some builtin macros mentioned in cpp.predefined.

The C++26 P2843R3 paper changes it from (compile time) undefined behavior
to ill-formed.  The following patch arranges for warning (for #undef)
and pedwarn (on #define) for the remaining cpp.predefined macros.
__cpp_* feature test macros only for C++20 which added some of them
to cpp.predefined, in earlier C++ versions it was just an extension and
for pedantic diagnostic I think we don't need to diagnose anything,
__STDCPP_* and __cplusplus macros for all C++ versions where they appeared.

Like the earlier posted -Wkeyword-macro diagnostics (which is done
regardless whether the identifier is defined as a macro or not, obviously
most likely none of the keywords are defined as macros initially), this
one also warns on #undef when a macro isn't defined or later #define
after #undef.

2025-08-15  Jakub Jelinek  &lt;jakub@redhat.com&gt;

	PR preprocessor/120778
	PR target/121520
gcc/c-family/
	* c-cppbuiltin.cc (c_cpp_builtins): Implement C++26 DR 2581.  Add
	cpp_define_warn lambda and use it as well as cpp_warn where needed.
	In the if (c_dialect_cxx ()) block with __cpp_* predefinitions add
	cpp_define lambda.  Formatting fixes.
gcc/c/
	* c-decl.cc (c_init_decl_processing): Use cpp_warn instead of
	cpp_lookup and NODE_WARN bit setting.
gcc/cp/
	* lex.cc (cxx_init): Remove warn_on lambda.  Use cpp_warn instead of
	cpp_lookup and NODE_WARN bit setting or warn_on.
gcc/testsuite/
	* g++.dg/DRs/dr2581-1.C: New test.
	* g++.dg/DRs/dr2581-2.C: New test.
	* c-c++-common/cpp/pr92296-2.c: Expect warnings also on defining
	special macros after undefining them.
libcpp/
	* include/cpplib.h (struct cpp_options): Add
	suppress_builtin_macro_warnings member.
	(cpp_warn): New inline functions.
	* init.cc (cpp_create_reader): Clear suppress_builtin_macro_warnings.
	(cpp_init_builtins): Call cpp_warn on __cplusplus, __STDC__,
	__STDC_VERSION__, __STDC_MB_MIGHT_NEQ_WC__ and
	__STDCPP_STRICT_POINTER_SAFETY__ when appropriate.
	* directives.cc (do_undef): Warn on undefining NODE_WARN macros if
	not cpp_keyword_p.  Don't emit any NODE_WARN related diagnostics
	if CPP_OPTION (pfile, suppress_builtin_macro_warnings).
	(cpp_define, _cpp_define_builtin, cpp_undef): Temporarily set
	CPP_OPTION (pfile, suppress_builtin_macro_warnings) around
	run_directive calls.
	* macro.cc (_cpp_create_definition): Warn on defining NODE_WARN
	macros if they weren't previously defined and not cpp_keyword_p.
	Ignore NODE_WARN for diagnostics if
	CPP_OPTION (pfile, suppress_builtin_macro_warnings).
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
We already warn on #undef or pedwarn on #define (but not on #define
after #undef) of some builtin macros mentioned in cpp.predefined.

The C++26 P2843R3 paper changes it from (compile time) undefined behavior
to ill-formed.  The following patch arranges for warning (for #undef)
and pedwarn (on #define) for the remaining cpp.predefined macros.
__cpp_* feature test macros only for C++20 which added some of them
to cpp.predefined, in earlier C++ versions it was just an extension and
for pedantic diagnostic I think we don't need to diagnose anything,
__STDCPP_* and __cplusplus macros for all C++ versions where they appeared.

Like the earlier posted -Wkeyword-macro diagnostics (which is done
regardless whether the identifier is defined as a macro or not, obviously
most likely none of the keywords are defined as macros initially), this
one also warns on #undef when a macro isn't defined or later #define
after #undef.

2025-08-15  Jakub Jelinek  &lt;jakub@redhat.com&gt;

	PR preprocessor/120778
	PR target/121520
gcc/c-family/
	* c-cppbuiltin.cc (c_cpp_builtins): Implement C++26 DR 2581.  Add
	cpp_define_warn lambda and use it as well as cpp_warn where needed.
	In the if (c_dialect_cxx ()) block with __cpp_* predefinitions add
	cpp_define lambda.  Formatting fixes.
gcc/c/
	* c-decl.cc (c_init_decl_processing): Use cpp_warn instead of
	cpp_lookup and NODE_WARN bit setting.
gcc/cp/
	* lex.cc (cxx_init): Remove warn_on lambda.  Use cpp_warn instead of
	cpp_lookup and NODE_WARN bit setting or warn_on.
gcc/testsuite/
	* g++.dg/DRs/dr2581-1.C: New test.
	* g++.dg/DRs/dr2581-2.C: New test.
	* c-c++-common/cpp/pr92296-2.c: Expect warnings also on defining
	special macros after undefining them.
libcpp/
	* include/cpplib.h (struct cpp_options): Add
	suppress_builtin_macro_warnings member.
	(cpp_warn): New inline functions.
	* init.cc (cpp_create_reader): Clear suppress_builtin_macro_warnings.
	(cpp_init_builtins): Call cpp_warn on __cplusplus, __STDC__,
	__STDC_VERSION__, __STDC_MB_MIGHT_NEQ_WC__ and
	__STDCPP_STRICT_POINTER_SAFETY__ when appropriate.
	* directives.cc (do_undef): Warn on undefining NODE_WARN macros if
	not cpp_keyword_p.  Don't emit any NODE_WARN related diagnostics
	if CPP_OPTION (pfile, suppress_builtin_macro_warnings).
	(cpp_define, _cpp_define_builtin, cpp_undef): Temporarily set
	CPP_OPTION (pfile, suppress_builtin_macro_warnings) around
	run_directive calls.
	* macro.cc (_cpp_create_definition): Warn on defining NODE_WARN
	macros if they weren't previously defined and not cpp_keyword_p.
	Ignore NODE_WARN for diagnostics if
	CPP_OPTION (pfile, suppress_builtin_macro_warnings).
</pre>
</div>
</content>
</entry>
<entry>
<title>c++, c: Introduce -Wkeyword-macro warning/pedwarn - part of C++26 P2843R3 [PR120778]</title>
<updated>2025-08-07T06:47:44+00:00</updated>
<author>
<name>Jakub Jelinek</name>
<email>jakub@redhat.com</email>
</author>
<published>2025-08-07T06:47:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=64859dc6e2948616439b500b5d9ffb2635b45ae8'/>
<id>64859dc6e2948616439b500b5d9ffb2635b45ae8</id>
<content type='text'>
The following patch introduces a -Wkeyword-macro warning that clang has
since 2014 to implement part of C++26 P2843R3 Preprocessing is never undefined
paper.
The relevant change in the paper is moving [macro.names]/2 paragraph to
https://eel.is/c++draft/cpp.replace.general#9 :
"A translation unit shall not #define or #undef names lexically identical to
keywords, to the identifiers listed in Table 4, or to the attribute-tokens
described in [dcl.attr], except that the names likely and unlikely may be
defined as function-like macros."

Now, my understanding of the paper is that in [macro.names] and surrounding
sections the word shall bears different meaning from [cpp.replace.general],
where only the latter location implies ill-formed, diagnostic required.

The warning in clang when introduced diagnosed all #define/#undef directives
on keywords, but shortly after introduction has been changed not to
diagnose #undef at all (with "#undef a keyword is generally harmless but used
often in configuration scripts" message) and later on even the #define
part tweaked - not warn about say
  #define inline
(or const, extern, static), or
  #define keyword keyword
or
  #define keyword __keyword
or
  #define keyword __keyword__
Later on the warning has been moved to be only pedantic diagnostic unless
requested by users.  Clearly some code in the wild does e.g.
  #define private public
and similar games, or e.g. Linux kernel (sure, C) does
  #define inline __inline__ __attribute__((__always_inline__))
etc.
Now, I believe at least with the current C++26 wording such exceptions
aren't allowed (unless it is changed to IFNDR).  But given that this is just
pedantic stuff, the following patch makes the warning off by default for
C and C++ before C++26 and even for C++26 it enables it by default only
if -pedantic/-pedantic-errors (in that case it pedwarns, otherwise it
warns).  And it diagnoses both #define and #undef without exceptions.

From what I can see, all the current NODE_WARN cases are macros starting
with __ with one exception (_Pragma).  As the NODE_* flags seem to be a
limited resource, I chose to just use NODE_WARN as well and differentiate
on the node names (if they don't start with __ or _P, they are considered
to be -Wkeyword-macro registered ones, otherwise old NODE_WARN cases,
typically builtin macros or __STDC* macros).

2025-08-07  Jakub Jelinek  &lt;jakub@redhat.com&gt;

	PR preprocessor/120778
gcc/
	* doc/invoke.texi (Wkeyword-macro): Document.
gcc/c-family/
	* c.opt (Wkeyword-macro): New option.
	* c.opt.urls: Regenerate.
	* c-common.h (cxx_dialect): Comment formatting fix.
	* c-opts.cc (c_common_post_options): Default to
	-Wkeyword-macro for C++26 if pedantic.
gcc/c/
	* c-decl.cc (c_init_decl_processing): Mark cpp nodes corresponding
	to keywords as NODE_WARN if warn_keyword_macro.
gcc/cp/
	* lex.cc (cxx_init): Mark cpp nodes corresponding
	to keywords, identifiers with special meaning and standard
	attribute identifiers as NODE_WARN if warn_keyword_macro.
gcc/testsuite/
	* gcc.dg/Wkeyword-macro-1.c: New test.
	* gcc.dg/Wkeyword-macro-2.c: New test.
	* gcc.dg/Wkeyword-macro-3.c: New test.
	* gcc.dg/Wkeyword-macro-4.c: New test.
	* gcc.dg/Wkeyword-macro-5.c: New test.
	* gcc.dg/Wkeyword-macro-6.c: New test.
	* gcc.dg/Wkeyword-macro-7.c: New test.
	* gcc.dg/Wkeyword-macro-8.c: New test.
	* gcc.dg/Wkeyword-macro-9.c: New test.
	* g++.dg/warn/Wkeyword-macro-1.C: New test.
	* g++.dg/warn/Wkeyword-macro-2.C: New test.
	* g++.dg/warn/Wkeyword-macro-3.C: New test.
	* g++.dg/warn/Wkeyword-macro-4.C: New test.
	* g++.dg/warn/Wkeyword-macro-5.C: New test.
	* g++.dg/warn/Wkeyword-macro-6.C: New test.
	* g++.dg/warn/Wkeyword-macro-7.C: New test.
	* g++.dg/warn/Wkeyword-macro-8.C: New test.
	* g++.dg/warn/Wkeyword-macro-9.C: New test.
	* g++.dg/warn/Wkeyword-macro-10.C: New test.
	* g++.dg/opt/pr82577.C: Don't #define register to nothing for
	C++17 and later.  Instead define reg macro to nothing for C++17
	and later or to register and use it instead of register.
	* g++.dg/modules/atom-preamble-3.C: Add -Wno-keyword-macro to
	dg-additional-options.
	* g++.dg/template/sfinae17.C (static_assert): Rename macro to ...
	(my_static_assert): ... this.
	(main): Use my_static_assert instead of static_assert.
libcpp/
	* include/cpplib.h (struct cpp_options): Add cpp_warn_keyword_macro.
	(enum cpp_warning_reason): Add CPP_W_KEYWORD_MACRO enumerator.
	(cpp_keyword_p): New inline function.
	* directives.cc (do_undef): Support -Wkeyword-macro diagnostics.
	* macro.cc (warn_of_redefinition): Ignore NODE_WARN flag on nodes
	registered for -Wkeyword-macro.
	(_cpp_create_definition): Support -Wkeyword-macro diagnostics.
	Formatting fixes.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The following patch introduces a -Wkeyword-macro warning that clang has
since 2014 to implement part of C++26 P2843R3 Preprocessing is never undefined
paper.
The relevant change in the paper is moving [macro.names]/2 paragraph to
https://eel.is/c++draft/cpp.replace.general#9 :
"A translation unit shall not #define or #undef names lexically identical to
keywords, to the identifiers listed in Table 4, or to the attribute-tokens
described in [dcl.attr], except that the names likely and unlikely may be
defined as function-like macros."

Now, my understanding of the paper is that in [macro.names] and surrounding
sections the word shall bears different meaning from [cpp.replace.general],
where only the latter location implies ill-formed, diagnostic required.

The warning in clang when introduced diagnosed all #define/#undef directives
on keywords, but shortly after introduction has been changed not to
diagnose #undef at all (with "#undef a keyword is generally harmless but used
often in configuration scripts" message) and later on even the #define
part tweaked - not warn about say
  #define inline
(or const, extern, static), or
  #define keyword keyword
or
  #define keyword __keyword
or
  #define keyword __keyword__
Later on the warning has been moved to be only pedantic diagnostic unless
requested by users.  Clearly some code in the wild does e.g.
  #define private public
and similar games, or e.g. Linux kernel (sure, C) does
  #define inline __inline__ __attribute__((__always_inline__))
etc.
Now, I believe at least with the current C++26 wording such exceptions
aren't allowed (unless it is changed to IFNDR).  But given that this is just
pedantic stuff, the following patch makes the warning off by default for
C and C++ before C++26 and even for C++26 it enables it by default only
if -pedantic/-pedantic-errors (in that case it pedwarns, otherwise it
warns).  And it diagnoses both #define and #undef without exceptions.

From what I can see, all the current NODE_WARN cases are macros starting
with __ with one exception (_Pragma).  As the NODE_* flags seem to be a
limited resource, I chose to just use NODE_WARN as well and differentiate
on the node names (if they don't start with __ or _P, they are considered
to be -Wkeyword-macro registered ones, otherwise old NODE_WARN cases,
typically builtin macros or __STDC* macros).

2025-08-07  Jakub Jelinek  &lt;jakub@redhat.com&gt;

	PR preprocessor/120778
gcc/
	* doc/invoke.texi (Wkeyword-macro): Document.
gcc/c-family/
	* c.opt (Wkeyword-macro): New option.
	* c.opt.urls: Regenerate.
	* c-common.h (cxx_dialect): Comment formatting fix.
	* c-opts.cc (c_common_post_options): Default to
	-Wkeyword-macro for C++26 if pedantic.
gcc/c/
	* c-decl.cc (c_init_decl_processing): Mark cpp nodes corresponding
	to keywords as NODE_WARN if warn_keyword_macro.
gcc/cp/
	* lex.cc (cxx_init): Mark cpp nodes corresponding
	to keywords, identifiers with special meaning and standard
	attribute identifiers as NODE_WARN if warn_keyword_macro.
gcc/testsuite/
	* gcc.dg/Wkeyword-macro-1.c: New test.
	* gcc.dg/Wkeyword-macro-2.c: New test.
	* gcc.dg/Wkeyword-macro-3.c: New test.
	* gcc.dg/Wkeyword-macro-4.c: New test.
	* gcc.dg/Wkeyword-macro-5.c: New test.
	* gcc.dg/Wkeyword-macro-6.c: New test.
	* gcc.dg/Wkeyword-macro-7.c: New test.
	* gcc.dg/Wkeyword-macro-8.c: New test.
	* gcc.dg/Wkeyword-macro-9.c: New test.
	* g++.dg/warn/Wkeyword-macro-1.C: New test.
	* g++.dg/warn/Wkeyword-macro-2.C: New test.
	* g++.dg/warn/Wkeyword-macro-3.C: New test.
	* g++.dg/warn/Wkeyword-macro-4.C: New test.
	* g++.dg/warn/Wkeyword-macro-5.C: New test.
	* g++.dg/warn/Wkeyword-macro-6.C: New test.
	* g++.dg/warn/Wkeyword-macro-7.C: New test.
	* g++.dg/warn/Wkeyword-macro-8.C: New test.
	* g++.dg/warn/Wkeyword-macro-9.C: New test.
	* g++.dg/warn/Wkeyword-macro-10.C: New test.
	* g++.dg/opt/pr82577.C: Don't #define register to nothing for
	C++17 and later.  Instead define reg macro to nothing for C++17
	and later or to register and use it instead of register.
	* g++.dg/modules/atom-preamble-3.C: Add -Wno-keyword-macro to
	dg-additional-options.
	* g++.dg/template/sfinae17.C (static_assert): Rename macro to ...
	(my_static_assert): ... this.
	(main): Use my_static_assert instead of static_assert.
libcpp/
	* include/cpplib.h (struct cpp_options): Add cpp_warn_keyword_macro.
	(enum cpp_warning_reason): Add CPP_W_KEYWORD_MACRO enumerator.
	(cpp_keyword_p): New inline function.
	* directives.cc (do_undef): Support -Wkeyword-macro diagnostics.
	* macro.cc (warn_of_redefinition): Ignore NODE_WARN flag on nodes
	registered for -Wkeyword-macro.
	(_cpp_create_definition): Support -Wkeyword-macro diagnostics.
	Formatting fixes.
</pre>
</div>
</content>
</entry>
<entry>
<title>diagnostics: introduce diagnostics/source-printing.cc</title>
<updated>2025-07-25T19:13:37+00:00</updated>
<author>
<name>David Malcolm</name>
<email>dmalcolm@redhat.com</email>
</author>
<published>2025-07-25T19:13:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=e31ec9ee65386a7cf978c204e123b9a97eb9c296'/>
<id>e31ec9ee65386a7cf978c204e123b9a97eb9c296</id>
<content type='text'>
Move diagnostic-show-locus.cc to diagnostics/source-printing.cc

Move diagnostic-label-effects.h to diagnostics/source-printing-effects.h

Move selftest-diagnostic-show-locus.h
  to diagnostics/selftest-source-printing.h

No functional change intended.

gcc/ChangeLog:
	* Makefile.in (OBJS): Replace diagnostic-show-locus.o with
	diagnostics/source-printing.o.
	* diagnostic.h (class diagnostic_source_effect_info): Replace
	with...
	(class diagnotics::source_effect_info): ...this.
	* diagnostics/paths-output.cc: Likewise.  Update for move of
	"diagnostic-label-effects.h" to
	"diagnostics/source-printing-effects.h".
	* diagnostics/sarif-sink.cc: Update for move of
	"selftest-diagnostic-show-locus.h" to
	"diagnostics/selftest-source-printing.h".
	* selftest-diagnostic-show-locus.h: Move to...
	* diagnostics/selftest-source-printing.h: ...here.
	* diagnostic-label-effects.h: Move to...
	* diagnostics/source-printing-effects.h: ...here, updating
	for above changes.
	* diagnostic-show-locus.cc: Move to...
	* diagnostics/source-printing.cc: ...here.
	* gcc-rich-location.h: Likewise.
	* selftest-run-tests.cc: Likewise.
	* selftest.h: Likewise.

gcc/testsuite/ChangeLog:
	* g++.dg/plugin/show-template-tree-color-labels.C: Update for
	moves to "source-printing".
	* gcc.dg/plugin/diagnostic-test-show-locus.py: Likewise.

libcpp/ChangeLog:
	* include/cpplib.h: Update for moves to "source-printing".
	* include/rich-location.h (class label_effects): Move to...
	(class diagnostics::label_effects): ...here.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Move diagnostic-show-locus.cc to diagnostics/source-printing.cc

Move diagnostic-label-effects.h to diagnostics/source-printing-effects.h

Move selftest-diagnostic-show-locus.h
  to diagnostics/selftest-source-printing.h

No functional change intended.

gcc/ChangeLog:
	* Makefile.in (OBJS): Replace diagnostic-show-locus.o with
	diagnostics/source-printing.o.
	* diagnostic.h (class diagnostic_source_effect_info): Replace
	with...
	(class diagnotics::source_effect_info): ...this.
	* diagnostics/paths-output.cc: Likewise.  Update for move of
	"diagnostic-label-effects.h" to
	"diagnostics/source-printing-effects.h".
	* diagnostics/sarif-sink.cc: Update for move of
	"selftest-diagnostic-show-locus.h" to
	"diagnostics/selftest-source-printing.h".
	* selftest-diagnostic-show-locus.h: Move to...
	* diagnostics/selftest-source-printing.h: ...here.
	* diagnostic-label-effects.h: Move to...
	* diagnostics/source-printing-effects.h: ...here, updating
	for above changes.
	* diagnostic-show-locus.cc: Move to...
	* diagnostics/source-printing.cc: ...here.
	* gcc-rich-location.h: Likewise.
	* selftest-run-tests.cc: Likewise.
	* selftest.h: Likewise.

gcc/testsuite/ChangeLog:
	* g++.dg/plugin/show-template-tree-color-labels.C: Update for
	moves to "source-printing".
	* gcc.dg/plugin/diagnostic-test-show-locus.py: Likewise.

libcpp/ChangeLog:
	* include/cpplib.h: Update for moves to "source-printing".
	* include/rich-location.h (class label_effects): Move to...
	(class diagnostics::label_effects): ...here.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>diagnostics: introduce namespace diagnostics::paths</title>
<updated>2025-07-25T19:13:36+00:00</updated>
<author>
<name>David Malcolm</name>
<email>dmalcolm@redhat.com</email>
</author>
<published>2025-07-25T19:13:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=5b64ba693f5cbc8ecb57ec10a248c137434237a7'/>
<id>5b64ba693f5cbc8ecb57ec10a248c137434237a7</id>
<content type='text'>
Move more diagnostic-specific code from gcc/ to gcc/diagnostics/

No functional change intended.

contrib/ChangeLog:
	* filter-clang-warnings.py: Update for move of
	diagnostic-path-output.cc to diagnostics/paths-output.cc.

gcc/ChangeLog:
	* Makefile.in (OBJS): Replace lazy-diagnostic-path.o with
	diagnostics/lazy-paths.o.
	(OBJS-libcommon): Replace diagnostic-path.o with
	diagnostics/paths.o, diagnostic-path-output.o with
	diagnostics/paths-output.o, and selftest-diagnostic-path.o with
	diagnostics/selftest-paths.o.
	(EXTRA_BACKEND_OBJS): Replace lazy-diagnostic-path.o with
	diagnostics/lazy-paths.o.
	* diagnostic-format-html.cc: Update #include for
	"diagnostic-path.h" moving to "diagnostics/paths.h",
	diagnostic_thread_id_t to diagnostics::paths::thread_id_t,
	diagnostic_event_id_t to diagnostics::paths::event_id_t,
	diagnostic_path to diagnostics::paths::path, and
	diagnostic_thread to diagnostics::paths::thread, and
	diagnostic_event to diagnostics::paths::event.
	* diagnostic-format-html.h: Likewise.
	* diagnostic-format-sarif.cc: Likewise.  Update PROPERTY_PREFIX
	for threadFlowLocations from "gcc/diagnostic_event/" to
	"gcc/diagnostics/paths/event/".
	* diagnostic-format-text.cc: Likewise.
	* diagnostic-format-text.h: Likewise.
	* diagnostic.cc: Likewise.
	* diagnostic.h: Likewise.
	* diagnostic-event-id.h: Move to...
	* diagnostics/event-id.h: ...here, updating header guard.
	(diagnostics:paths:event_id_t): New typedef.
	(diagnostic_thread_id_t): Replace with...
	(diagnostics:paths:thread_id_t): New typedef.
	* lazy-diagnostic-path.cc: Move to...
	* diagnostics/lazy-paths.cc: ...here.  Update for above changes,
	lazy_diagnostic_path becomes diagnostics::paths::lazy_path.
	(lazy_diagnostic_path_cc_tests): Rename to...
	(diagnostics_lazy_paths_cc_tests): ...this.
	* lazy-diagnostic-path.h: Move to...
	* diagnostics/lazy-paths.h: ...here, updating header guard.
	Update for above changes.
	* diagnostic-path-output.cc: Move to...
	* diagnostics/paths-output.cc: ...here.  Update for above changes.
	(diagnostic_path_output_cc_tests): Rename to...
	(diagnostics_paths_output_cc_tests): ...this.
	* diagnostic-path.cc: Move to...
	* diagnostics/paths.cc: ...here.  Update for above changes.
	* diagnostic-path.h: Move to...
	* diagnostics/paths.h: ...here, updating header guard.
	Update #include for moving "diagnostic-event-id.h" to
	"diagnostics/event-id.h".
	(class diagnostic_event): Convert to...
	(class diagnostics::paths::event): ...this.
	(class diagnostic_thread): Convert to...
	(class diagnostics::paths::thread): ...this.
	(class diagnostic_path): Convert to...
	(class diagnostics::paths::path): ...this.
	* diagnostic-show-locus.cc: Update for above changes.
	* doc/analyzer.texi: Likewise.
	* selftest-diagnostic-path.cc: Move to...
	* diagnostics/selftest-paths.cc: ...here.  Update for
	above changes, and for "selftest-diagnostic-path.h" moving to
	"diagnostics/selftest-paths.h".
	* selftest-diagnostic-path.h: Move to...
	* diagnostics/selftest-paths.h: ...here, updating header guard.
	Update for above changes.
	* libgdiagnostics.cc: Update for above changes.
	* libsarifreplay.cc: Update property prefix for
	threadFlowLocations from "gcc/diagnostic_event/" to
	"gcc/diagnostics/paths/event/".
	* pretty-print-format-impl.h: Update for above changes.
	* pretty-print.cc: Likewise.
	* selftest-run-tests.cc (selftest::run_tests): Update for
	renaming of lazy_diagnostic_path_cc_tests to
	diagnostics_lazy_paths_cc_tests, and of
	diagnostic_path_output_cc_tests to
	diagnostics_paths_output_cc_tests.
	* selftest.h (lazy_diagnostic_path_cc_tests): Replace decl with...
	(diagnostics_lazy_paths_cc_tests): ...this.
	(diagnostic_path_output_cc_tests): Replace decl with...
	(diagnostics_paths_output_cc_tests): ...this.
	* simple-diagnostic-path.cc: Clarify that this relates to "tree"
	and thus shouldn't be in "diagnostics".  Update for above changes.
	* simple-diagnostic-path.h: Likewise.

gcc/analyzer/ChangeLog:
	* access-diagram.cc: Update for changes to diagnostic paths:
	"diagnostic-path.h" moving to "diagnostics/paths.h",
	"diagnostic-event-id.h" moving to "diagnostics/event-id.h",
	diagnostic_event_id_t to diagnostics::paths::event_id_t,
	diagnostic_path to diagnostics::paths::path, and
	diagnostic_event to diagnostics::paths::event.
	* access-diagram.h: Likewise.
	* analyzer.cc: Likewise.
	* bounds-checking.cc: Likewise.
	* call-info.cc: Likewise.
	* checker-event.cc: Likewise.
	* checker-event.h: Likewise.
	* checker-path.cc: Likewise.
	* checker-path.h: Likewise.
	* common.h: Likewise.
	* diagnostic-manager.cc: Likewise.
	* pending-diagnostic.cc: Likewise.
	* pending-diagnostic.h: Likewise.
	* program-point.cc: Likewise.
	* program-state.cc: Likewise.
	* region-model.cc: Likewise.
	* sm-fd.cc: Likewise.
	* sm-file.cc: Likewise.
	* sm-malloc.cc: Likewise.
	* sm-pattern-test.cc: Likewise.
	* sm-sensitive.cc: Likewise.
	* sm-signal.cc: Likewise.
	* sm-taint.cc: Likewise.
	* varargs.cc: Likewise.

gcc/testsuite/ChangeLog:
	* gcc.dg/plugin/analyzer_gil_plugin.cc: Update #include for
	"diagnostic-path.h" moving to "diagnostics/paths.h",
	diagnostic_thread_id_t to diagnostics::paths::thread_id_t,
	diagnostic_event_id_t to diagnostics::paths::event_id_t,
	diagnostic_path to diagnostics::paths::path, and
	diagnostic_thread to diagnostics::paths::thread, and
	diagnostic_event to diagnostics::paths::event.
	* gcc.dg/plugin/diagnostic_plugin_test_paths.cc: Likewise.
	* lib/sarif.py (get_state_graph): Update property prefix for
	threadFlowLocations from "gcc/diagnostic_event/" to
	"gcc/diagnostics/paths/event/".
	* gcc.dg/sarif-output/include-chain-2.h: Update comment.

libcpp/ChangeLog:
	* include/rich-location.h: Replace diagnostic_path with
	diagnostics::paths::path.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Move more diagnostic-specific code from gcc/ to gcc/diagnostics/

No functional change intended.

contrib/ChangeLog:
	* filter-clang-warnings.py: Update for move of
	diagnostic-path-output.cc to diagnostics/paths-output.cc.

gcc/ChangeLog:
	* Makefile.in (OBJS): Replace lazy-diagnostic-path.o with
	diagnostics/lazy-paths.o.
	(OBJS-libcommon): Replace diagnostic-path.o with
	diagnostics/paths.o, diagnostic-path-output.o with
	diagnostics/paths-output.o, and selftest-diagnostic-path.o with
	diagnostics/selftest-paths.o.
	(EXTRA_BACKEND_OBJS): Replace lazy-diagnostic-path.o with
	diagnostics/lazy-paths.o.
	* diagnostic-format-html.cc: Update #include for
	"diagnostic-path.h" moving to "diagnostics/paths.h",
	diagnostic_thread_id_t to diagnostics::paths::thread_id_t,
	diagnostic_event_id_t to diagnostics::paths::event_id_t,
	diagnostic_path to diagnostics::paths::path, and
	diagnostic_thread to diagnostics::paths::thread, and
	diagnostic_event to diagnostics::paths::event.
	* diagnostic-format-html.h: Likewise.
	* diagnostic-format-sarif.cc: Likewise.  Update PROPERTY_PREFIX
	for threadFlowLocations from "gcc/diagnostic_event/" to
	"gcc/diagnostics/paths/event/".
	* diagnostic-format-text.cc: Likewise.
	* diagnostic-format-text.h: Likewise.
	* diagnostic.cc: Likewise.
	* diagnostic.h: Likewise.
	* diagnostic-event-id.h: Move to...
	* diagnostics/event-id.h: ...here, updating header guard.
	(diagnostics:paths:event_id_t): New typedef.
	(diagnostic_thread_id_t): Replace with...
	(diagnostics:paths:thread_id_t): New typedef.
	* lazy-diagnostic-path.cc: Move to...
	* diagnostics/lazy-paths.cc: ...here.  Update for above changes,
	lazy_diagnostic_path becomes diagnostics::paths::lazy_path.
	(lazy_diagnostic_path_cc_tests): Rename to...
	(diagnostics_lazy_paths_cc_tests): ...this.
	* lazy-diagnostic-path.h: Move to...
	* diagnostics/lazy-paths.h: ...here, updating header guard.
	Update for above changes.
	* diagnostic-path-output.cc: Move to...
	* diagnostics/paths-output.cc: ...here.  Update for above changes.
	(diagnostic_path_output_cc_tests): Rename to...
	(diagnostics_paths_output_cc_tests): ...this.
	* diagnostic-path.cc: Move to...
	* diagnostics/paths.cc: ...here.  Update for above changes.
	* diagnostic-path.h: Move to...
	* diagnostics/paths.h: ...here, updating header guard.
	Update #include for moving "diagnostic-event-id.h" to
	"diagnostics/event-id.h".
	(class diagnostic_event): Convert to...
	(class diagnostics::paths::event): ...this.
	(class diagnostic_thread): Convert to...
	(class diagnostics::paths::thread): ...this.
	(class diagnostic_path): Convert to...
	(class diagnostics::paths::path): ...this.
	* diagnostic-show-locus.cc: Update for above changes.
	* doc/analyzer.texi: Likewise.
	* selftest-diagnostic-path.cc: Move to...
	* diagnostics/selftest-paths.cc: ...here.  Update for
	above changes, and for "selftest-diagnostic-path.h" moving to
	"diagnostics/selftest-paths.h".
	* selftest-diagnostic-path.h: Move to...
	* diagnostics/selftest-paths.h: ...here, updating header guard.
	Update for above changes.
	* libgdiagnostics.cc: Update for above changes.
	* libsarifreplay.cc: Update property prefix for
	threadFlowLocations from "gcc/diagnostic_event/" to
	"gcc/diagnostics/paths/event/".
	* pretty-print-format-impl.h: Update for above changes.
	* pretty-print.cc: Likewise.
	* selftest-run-tests.cc (selftest::run_tests): Update for
	renaming of lazy_diagnostic_path_cc_tests to
	diagnostics_lazy_paths_cc_tests, and of
	diagnostic_path_output_cc_tests to
	diagnostics_paths_output_cc_tests.
	* selftest.h (lazy_diagnostic_path_cc_tests): Replace decl with...
	(diagnostics_lazy_paths_cc_tests): ...this.
	(diagnostic_path_output_cc_tests): Replace decl with...
	(diagnostics_paths_output_cc_tests): ...this.
	* simple-diagnostic-path.cc: Clarify that this relates to "tree"
	and thus shouldn't be in "diagnostics".  Update for above changes.
	* simple-diagnostic-path.h: Likewise.

gcc/analyzer/ChangeLog:
	* access-diagram.cc: Update for changes to diagnostic paths:
	"diagnostic-path.h" moving to "diagnostics/paths.h",
	"diagnostic-event-id.h" moving to "diagnostics/event-id.h",
	diagnostic_event_id_t to diagnostics::paths::event_id_t,
	diagnostic_path to diagnostics::paths::path, and
	diagnostic_event to diagnostics::paths::event.
	* access-diagram.h: Likewise.
	* analyzer.cc: Likewise.
	* bounds-checking.cc: Likewise.
	* call-info.cc: Likewise.
	* checker-event.cc: Likewise.
	* checker-event.h: Likewise.
	* checker-path.cc: Likewise.
	* checker-path.h: Likewise.
	* common.h: Likewise.
	* diagnostic-manager.cc: Likewise.
	* pending-diagnostic.cc: Likewise.
	* pending-diagnostic.h: Likewise.
	* program-point.cc: Likewise.
	* program-state.cc: Likewise.
	* region-model.cc: Likewise.
	* sm-fd.cc: Likewise.
	* sm-file.cc: Likewise.
	* sm-malloc.cc: Likewise.
	* sm-pattern-test.cc: Likewise.
	* sm-sensitive.cc: Likewise.
	* sm-signal.cc: Likewise.
	* sm-taint.cc: Likewise.
	* varargs.cc: Likewise.

gcc/testsuite/ChangeLog:
	* gcc.dg/plugin/analyzer_gil_plugin.cc: Update #include for
	"diagnostic-path.h" moving to "diagnostics/paths.h",
	diagnostic_thread_id_t to diagnostics::paths::thread_id_t,
	diagnostic_event_id_t to diagnostics::paths::event_id_t,
	diagnostic_path to diagnostics::paths::path, and
	diagnostic_thread to diagnostics::paths::thread, and
	diagnostic_event to diagnostics::paths::event.
	* gcc.dg/plugin/diagnostic_plugin_test_paths.cc: Likewise.
	* lib/sarif.py (get_state_graph): Update property prefix for
	threadFlowLocations from "gcc/diagnostic_event/" to
	"gcc/diagnostics/paths/event/".
	* gcc.dg/sarif-output/include-chain-2.h: Update comment.

libcpp/ChangeLog:
	* include/rich-location.h: Replace diagnostic_path with
	diagnostics::paths::path.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>c++: modules and #pragma diagnostic</title>
<updated>2025-06-17T12:04:18+00:00</updated>
<author>
<name>Jason Merrill</name>
<email>jason@redhat.com</email>
</author>
<published>2024-11-20T15:20:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=a5933118f34a97463ffa765744eedf27b9c2c68f'/>
<id>a5933118f34a97463ffa765744eedf27b9c2c68f</id>
<content type='text'>
To respect the #pragma diagnostic lines in libstdc++ headers when compiling
with module std, we need to represent them in the module.

I think it's reasonable to give serializers direct access to the underlying
data, as here with get_classification_history.  This is a different approach
from how Jakub made PCH streaming members of diagnostic_option_classifier,
but it seems to me that modules handling belongs in module.cc.

libcpp/ChangeLog:

	* line-map.cc (linemap_location_from_module_p): Add.
	* include/line-map.h: Declare it.

gcc/ChangeLog:

	* diagnostic.h (diagnostic_option_classifier): Friend
	diagnostic_context.
	(diagnostic_context::get_classification_history): New.

gcc/cp/ChangeLog:

	* module.cc (module_state::write_diagnostic_classification): New.
	(module_state::write_begin): Call it.
	(module_state::read_diagnostic_classification): New.
	(module_state::read_initial): Call it.
	(dk_string, dump_dc_change): New.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/warn-spec-3_a.C: New test.
	* g++.dg/modules/warn-spec-3_b.C: New test.
	* g++.dg/modules/warn-spec-3_c.C: New test.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
To respect the #pragma diagnostic lines in libstdc++ headers when compiling
with module std, we need to represent them in the module.

I think it's reasonable to give serializers direct access to the underlying
data, as here with get_classification_history.  This is a different approach
from how Jakub made PCH streaming members of diagnostic_option_classifier,
but it seems to me that modules handling belongs in module.cc.

libcpp/ChangeLog:

	* line-map.cc (linemap_location_from_module_p): Add.
	* include/line-map.h: Declare it.

gcc/ChangeLog:

	* diagnostic.h (diagnostic_option_classifier): Friend
	diagnostic_context.
	(diagnostic_context::get_classification_history): New.

gcc/cp/ChangeLog:

	* module.cc (module_state::write_diagnostic_classification): New.
	(module_state::write_begin): Call it.
	(module_state::read_diagnostic_classification): New.
	(module_state::read_initial): Call it.
	(dk_string, dump_dc_change): New.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/warn-spec-3_a.C: New test.
	* g++.dg/modules/warn-spec-3_b.C: New test.
	* g++.dg/modules/warn-spec-3_c.C: New test.
</pre>
</div>
</content>
</entry>
<entry>
<title>diagnostics: make experimental-html sink prettier [PR116792]</title>
<updated>2025-06-11T00:06:38+00:00</updated>
<author>
<name>David Malcolm</name>
<email>dmalcolm@redhat.com</email>
</author>
<published>2025-06-11T00:06:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=cb1d203445c923aa64bca01b0ffb6d3d16a82130'/>
<id>cb1d203445c923aa64bca01b0ffb6d3d16a82130</id>
<content type='text'>
This patch to the "experimental-html" diagnostic sink:
* adds use of the PatternFly 3 CSS library (via an optional link
  in the generated html to a copy in a CDN)
* uses PatternFly's "alert" pattern to show severities for diagnostics,
  properly nesting "note" diagnostics for diagnostic groups.
  Example:
    before: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/before/diagnostic-ranges.c.html
     after: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/after/diagnostic-ranges.c.html

* adds initial support for logical locations and physical locations
* adds initial support for multi-level nested diagnostics such as those
  for C++ concepts diagnostics.  Ideally this would show a clickable
  disclosure widget to expand/collapse a level, but for now it uses
  nested &lt;ul&gt; elements with &lt;li&gt; for the child diagnostics.
  Example:
    before: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/before/nested-diagnostics-1.C.html
     after: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/after/nested-diagnostics-1.C.html

gcc/ChangeLog:
	PR other/116792
	* diagnostic-format-html.cc: Include "diagnostic-path.h" and
	"diagnostic-client-data-hooks.h".
	(html_builder::m_logical_loc_mgr): New field.
	(html_builder::m_cur_nesting_levels): New field.
	(html_builder::m_last_logical_location): New field.
	(html_builder::m_last_location): New field.
	(html_builder::m_last_expanded_location): New field.
	(HTML_STYLE): Add "white-space: pre;" to .source and .annotation.
	Add "gcc-quoted-text" CSS class.
	(html_builder::html_builder): Initialize the new fields.  If CSS
	is enabled, add CDN links to PatternFly 3 stylesheets.
	(html_builder::add_stylesheet): New.
	(html_builder::on_report_diagnostic): Add "alert" param to
	make_element_for_diagnostic, setting it by default, but unsetting
	it for nested diagnostics below the top level.  Use
	add_at_nesting_level for nested diagnostics.
	(add_nesting_level_attr): New.
	(html_builder::add_at_nesting_level): New.
	(get_pf_class_for_alert_div): New.
	(get_pf_class_for_alert_icon): New.
	(get_label_for_logical_location_kind): New.
	(add_labelled_value): New.
	(html_builder::make_element_for_diagnostic): Add leading comment.
	Add "alert" param.  Drop class="gcc-diagnostic" from &lt;div&gt; tag,
	instead adding the class for a PatternFly 3 alert if "alert" is
	true, and adding a &lt;span&gt; with an alert icon, both according to
	the diagnostic severity.  Add a severity prefix to the message for
	alerts.  Add any metadata/option text as suffixes to the message.
	Show any logical location.  Show any physical location.  Don't
	show the locus if the last location is unchanged within the
	diagnostic_group.  Wrap any execution path element in a
	&lt;div id="execution-path"&gt; and add a label to it.  Wrap any
	generated patch in a &lt;div id="suggested-fix"&gt; and add a label
	to it.
	(selftest::test_simple_log): Update expected HTML.

gcc/testsuite/ChangeLog:
	PR other/116792
	* gcc.dg/html-output/missing-semicolon.py: Update for changes
	to diagnostic elements.
	* gcc.dg/format/diagnostic-ranges-html.py: Likewise.
	* gcc.dg/plugin/diagnostic-test-metadata-html.py: Likewise.  Drop
	out-of-date comment.
	* gcc.dg/plugin/diagnostic-test-paths-2.py: Likewise.
	* gcc.dg/plugin/diagnostic-test-paths-4.py: Likewise.  Drop
	out-of-date comment.
	* gcc.dg/plugin/diagnostic-test-show-locus.py: Likewise.
	* lib/htmltest.py (get_diag_by_index): Update to use search by id.
	(get_message_within_diag): Update to use search by class.

libcpp/ChangeLog:
	PR other/116792
	* include/line-map.h (typedef expanded_location): Convert to...
	(struct expanded_location): ...this.
	(operator==): New decl, for expanded_location.
	(operator!=): Likewise.
	* line-map.cc (operator==): New decl, for expanded_location.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This patch to the "experimental-html" diagnostic sink:
* adds use of the PatternFly 3 CSS library (via an optional link
  in the generated html to a copy in a CDN)
* uses PatternFly's "alert" pattern to show severities for diagnostics,
  properly nesting "note" diagnostics for diagnostic groups.
  Example:
    before: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/before/diagnostic-ranges.c.html
     after: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/after/diagnostic-ranges.c.html

* adds initial support for logical locations and physical locations
* adds initial support for multi-level nested diagnostics such as those
  for C++ concepts diagnostics.  Ideally this would show a clickable
  disclosure widget to expand/collapse a level, but for now it uses
  nested &lt;ul&gt; elements with &lt;li&gt; for the child diagnostics.
  Example:
    before: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/before/nested-diagnostics-1.C.html
     after: https://dmalcolm.fedorapeople.org/gcc/2025-06-10/after/nested-diagnostics-1.C.html

gcc/ChangeLog:
	PR other/116792
	* diagnostic-format-html.cc: Include "diagnostic-path.h" and
	"diagnostic-client-data-hooks.h".
	(html_builder::m_logical_loc_mgr): New field.
	(html_builder::m_cur_nesting_levels): New field.
	(html_builder::m_last_logical_location): New field.
	(html_builder::m_last_location): New field.
	(html_builder::m_last_expanded_location): New field.
	(HTML_STYLE): Add "white-space: pre;" to .source and .annotation.
	Add "gcc-quoted-text" CSS class.
	(html_builder::html_builder): Initialize the new fields.  If CSS
	is enabled, add CDN links to PatternFly 3 stylesheets.
	(html_builder::add_stylesheet): New.
	(html_builder::on_report_diagnostic): Add "alert" param to
	make_element_for_diagnostic, setting it by default, but unsetting
	it for nested diagnostics below the top level.  Use
	add_at_nesting_level for nested diagnostics.
	(add_nesting_level_attr): New.
	(html_builder::add_at_nesting_level): New.
	(get_pf_class_for_alert_div): New.
	(get_pf_class_for_alert_icon): New.
	(get_label_for_logical_location_kind): New.
	(add_labelled_value): New.
	(html_builder::make_element_for_diagnostic): Add leading comment.
	Add "alert" param.  Drop class="gcc-diagnostic" from &lt;div&gt; tag,
	instead adding the class for a PatternFly 3 alert if "alert" is
	true, and adding a &lt;span&gt; with an alert icon, both according to
	the diagnostic severity.  Add a severity prefix to the message for
	alerts.  Add any metadata/option text as suffixes to the message.
	Show any logical location.  Show any physical location.  Don't
	show the locus if the last location is unchanged within the
	diagnostic_group.  Wrap any execution path element in a
	&lt;div id="execution-path"&gt; and add a label to it.  Wrap any
	generated patch in a &lt;div id="suggested-fix"&gt; and add a label
	to it.
	(selftest::test_simple_log): Update expected HTML.

gcc/testsuite/ChangeLog:
	PR other/116792
	* gcc.dg/html-output/missing-semicolon.py: Update for changes
	to diagnostic elements.
	* gcc.dg/format/diagnostic-ranges-html.py: Likewise.
	* gcc.dg/plugin/diagnostic-test-metadata-html.py: Likewise.  Drop
	out-of-date comment.
	* gcc.dg/plugin/diagnostic-test-paths-2.py: Likewise.
	* gcc.dg/plugin/diagnostic-test-paths-4.py: Likewise.  Drop
	out-of-date comment.
	* gcc.dg/plugin/diagnostic-test-show-locus.py: Likewise.
	* lib/htmltest.py (get_diag_by_index): Update to use search by id.
	(get_message_within_diag): Update to use search by class.

libcpp/ChangeLog:
	PR other/116792
	* include/line-map.h (typedef expanded_location): Convert to...
	(struct expanded_location): ...this.
	(operator==): New decl, for expanded_location.
	(operator!=): Likewise.
	* line-map.cc (operator==): New decl, for expanded_location.

Signed-off-by: David Malcolm &lt;dmalcolm@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>c-family: Improve location for -Wunknown-pragmas in a _Pragma [PR118838]</title>
<updated>2025-04-28T02:35:25+00:00</updated>
<author>
<name>Lewis Hyatt</name>
<email>lhyatt@gmail.com</email>
</author>
<published>2025-02-11T18:45:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.belthelziquor.com/gcc.git/commit/?id=78673484b4055b93207eee0efd60a434b0bf96ab'/>
<id>78673484b4055b93207eee0efd60a434b0bf96ab</id>
<content type='text'>
The warning for -Wunknown-pragmas is issued at the location provided by
libcpp to the def_pragma() callback. This location is
cpp_reader::directive_line, which is a location for the start of the line
only; it is also not a valid location in case the unknown pragma was lexed
from a _Pragma string. These factors make it impossible to suppress
-Wunknown-pragmas via _Pragma("GCC diagnostic...") directives on the same
source line, as in the PR and the test case. Address that by issuing the
warning at a better location returned by cpp_get_diagnostic_override_loc().
libcpp already maintains this location to handle _Pragma-related diagnostics
internally; it was needed also to make a publicly accessible version of it.

gcc/c-family/ChangeLog:

	PR c/118838
	* c-lex.cc (cb_def_pragma): Call cpp_get_diagnostic_override_loc()
	to get a valid location at which to issue -Wunknown-pragmas, in case
	it was triggered from a _Pragma.

libcpp/ChangeLog:

	PR c/118838
	* errors.cc (cpp_get_diagnostic_override_loc): New function.
	* include/cpplib.h (cpp_get_diagnostic_override_loc): Declare.

gcc/testsuite/ChangeLog:

	PR c/118838
	* c-c++-common/cpp/pragma-diagnostic-loc-2.c: New test.
	* g++.dg/gomp/macro-4.C: Adjust expected output.
	* gcc.dg/gomp/macro-4.c: Likewise.
	* gcc.dg/cpp/Wunknown-pragmas-1.c: Likewise.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The warning for -Wunknown-pragmas is issued at the location provided by
libcpp to the def_pragma() callback. This location is
cpp_reader::directive_line, which is a location for the start of the line
only; it is also not a valid location in case the unknown pragma was lexed
from a _Pragma string. These factors make it impossible to suppress
-Wunknown-pragmas via _Pragma("GCC diagnostic...") directives on the same
source line, as in the PR and the test case. Address that by issuing the
warning at a better location returned by cpp_get_diagnostic_override_loc().
libcpp already maintains this location to handle _Pragma-related diagnostics
internally; it was needed also to make a publicly accessible version of it.

gcc/c-family/ChangeLog:

	PR c/118838
	* c-lex.cc (cb_def_pragma): Call cpp_get_diagnostic_override_loc()
	to get a valid location at which to issue -Wunknown-pragmas, in case
	it was triggered from a _Pragma.

libcpp/ChangeLog:

	PR c/118838
	* errors.cc (cpp_get_diagnostic_override_loc): New function.
	* include/cpplib.h (cpp_get_diagnostic_override_loc): Declare.

gcc/testsuite/ChangeLog:

	PR c/118838
	* c-c++-common/cpp/pragma-diagnostic-loc-2.c: New test.
	* g++.dg/gomp/macro-4.C: Adjust expected output.
	* gcc.dg/gomp/macro-4.c: Likewise.
	* gcc.dg/cpp/Wunknown-pragmas-1.c: Likewise.
</pre>
</div>
</content>
</entry>
</feed>
