gcc/libstdc++-v3/testsuite/18_support/headers
Jonathan Wakely af062510f4
libstdc++: Remove #warning from <ciso646> for C++17 [PR120187]
Although <ciso646> was removed from C++20, it was not formally
deprecated in C++17. In contrast, <ctgmath>, <cstdalign>, etc. were
formally deprecated in C++17 before being removed in C++20.

Due to the widespread convention of including <ciso646> to detect
implementation-specific macros (such as _GLIBCXX_RELEASE) it causes
quite a lot of noise to issue deprecation warnings in C++17 mode. The
recommendation to include <version> instead does work for recent
compilers, even in C++17 mode, but isn't portable to older compilers
that don't provide <version> yet (e.g. GCC 8).

There are also potential objections to including <version> pre-C++20
when it wasn't defined by the standard. I don't have much sympathy for
this position, because including <ciso646> for implementation-specific
macros wasn't part of the C++17 standard either. It's no more
non-standard to rely on <version> being present and defining those
macros than to rely on <ciso646> defining them, and __has_include can be
used to detect whether <version> is present. However, <ciso646> is being
used in the wild by popular libraries like Abseil and we can't change
versions of those that have already been released.

This removes the #warning in <ciso646> for C++17 mode, so that we only
emit diagnostics for C++20 and later. With this change, including
<ciso646> in C++20 or later gives an error if _GLIBCXX_USE_DEPRECATED is
defined to zero, otherwise a warning if -Wdeprecated is enabled,
otherwise no diagnostic is given.

This also adds "@since C++11 (removed in C++20)" to the Doxygen @file
comments in all the relevant headers.

The test for <ciso646> needs to be updated to no longer expect a warning
for c++17_only. A new test is added to ensure that we get a warning
instead of an error when -D_GLIBCXX_USE_DEPRECATED=0 is not used.

libstdc++-v3/ChangeLog:

	PR libstdc++/120187
	* include/c_global/ciso646: Only give deprecated warning for
	C++20 and later.
	* include/c_global/ccomplex: Add @since to Doxygen comment.
	* include/c_global/cstdalign: Likewise.
	* include/c_global/cstdbool: Likewise.
	* include/c_global/ctgmath: Likewise.
	* testsuite/18_support/headers/ciso646/macros.cc: Remove
	dg-warning for c++17_only effective target.
	* testsuite/18_support/headers/ciso646/macros-2.cc: New test.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
2025-05-12 12:28:24 +01:00
..
cfloat Update copyright years. 2025-01-02 11:59:57 +01:00
ciso646 libstdc++: Remove #warning from <ciso646> for C++17 [PR120187] 2025-05-12 12:28:24 +01:00
climits Update copyright years. 2025-01-02 11:59:57 +01:00
csetjmp Update copyright years. 2025-01-02 11:59:57 +01:00
csignal Update copyright years. 2025-01-02 11:59:57 +01:00
cstdalign libstdc++: Deprecate useless <cxxx> compatibility headers for C++17 2024-11-06 12:47:19 +00:00
cstdarg Update copyright years. 2025-01-02 11:59:57 +01:00
cstdbool Update copyright years. 2025-01-02 11:59:57 +01:00
cstddef Update copyright years. 2025-01-02 11:59:57 +01:00
cstdint Update copyright years. 2025-01-02 11:59:57 +01:00
cstdlib Update copyright years. 2025-01-02 11:59:57 +01:00
ctime Update copyright years. 2025-01-02 11:59:57 +01:00
exception Update copyright years. 2025-01-02 11:59:57 +01:00
limits Update copyright years. 2025-01-02 11:59:57 +01:00
new Update copyright years. 2025-01-02 11:59:57 +01:00
stdfloat Update copyright years. 2025-01-02 11:59:57 +01:00
typeinfo Update copyright years. 2025-01-02 11:59:57 +01:00
version Update copyright years. 2025-01-02 11:59:57 +01:00