[libc++] Fix header deprecations (#163356)

Currently, there are no diagnostics issued when including a deprecated
header, since the diagnostic is issued inside a system header. This
patch fixes that by using `#warning` instead, which also simplifies the
implementation of the deprecation warnings.
This commit is contained in:
Nikolas Klauser 2025-11-18 16:05:53 +01:00 committed by GitHub
parent f2b5d04f29
commit 75792d6077
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 29 additions and 85 deletions

View File

@ -546,6 +546,12 @@ typedef __char32_t char32_t;
# define _LIBCPP_DEPRECATED_(m)
# endif
# if defined(__DEPRECATED) && __DEPRECATED && !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS)
# define _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS 1
# else
# define _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS 0
# endif
# if !defined(_LIBCPP_CXX03_LANG)
# define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED
# else

View File

@ -26,18 +26,10 @@
# pragma GCC system_header
# endif
# if _LIBCPP_STD_VER >= 20
using __standard_header_ccomplex
_LIBCPP_DEPRECATED_("removed in C++20. Include <complex> instead.") _LIBCPP_NODEBUG = void;
using __use_standard_header_ccomplex _LIBCPP_NODEBUG = __standard_header_ccomplex;
# elif _LIBCPP_STD_VER >= 17
using __standard_header_ccomplex _LIBCPP_DEPRECATED_("Include <complex> instead.") _LIBCPP_NODEBUG = void;
using __use_standard_header_ccomplex _LIBCPP_NODEBUG = __standard_header_ccomplex;
# if _LIBCPP_STD_VER >= 17 && !__building_module(std) && _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS
# warning <ccomplex> is deprecated in C++17 and removed in C++20. Include <complex> instead.
# endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#endif // _LIBCPP_CCOMPLEX

View File

@ -24,13 +24,10 @@
# pragma GCC system_header
# endif
# if _LIBCPP_STD_VER >= 20
using __standard_header_ciso646
_LIBCPP_DEPRECATED_("removed in C++20. Include <version> instead.") _LIBCPP_NODEBUG = void;
using __use_standard_header_ciso646 _LIBCPP_NODEBUG = __standard_header_ciso646;
# if _LIBCPP_STD_VER >= 20 && !__building_module(std) && _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS
# warning <ciso646> is removed in C++20. Include <version> instead.
# endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#endif // _LIBCPP_CISO646

View File

@ -43,17 +43,10 @@ Macros:
# undef __alignof_is_defined
# define __alignof_is_defined 1
# if _LIBCPP_STD_VER >= 20
using __standard_header_cstdalign _LIBCPP_DEPRECATED_("removed in C++20.") _LIBCPP_NODEBUG = void;
using __use_standard_header_cstdalign _LIBCPP_NODEBUG = __standard_header_cstdalign;
# elif _LIBCPP_STD_VER >= 17
using __standard_header_cstdalign _LIBCPP_DEPRECATED _LIBCPP_NODEBUG = void;
using __use_standard_header_cstdalign _LIBCPP_NODEBUG = __standard_header_cstdalign;
# if _LIBCPP_STD_VER >= 17 && !__building_module(std) && _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS
# warning <cstdalign> is deprecated in C++17 and removed in C++20.
# endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#endif // _LIBCPP_CSTDALIGN

View File

@ -31,17 +31,10 @@ Macros:
# undef __bool_true_false_are_defined
# define __bool_true_false_are_defined 1
# if _LIBCPP_STD_VER >= 20
using __standard_header_cstdbool _LIBCPP_DEPRECATED_("removed in C++20.") _LIBCPP_NODEBUG = void;
using __use_standard_header_cstdbool _LIBCPP_NODEBUG = __standard_header_cstdbool;
# elif _LIBCPP_STD_VER >= 17
using __standard_header_cstdbool _LIBCPP_DEPRECATED _LIBCPP_NODEBUG = void;
using __use_standard_header_cstdbool _LIBCPP_NODEBUG = __standard_header_cstdbool;
# if _LIBCPP_STD_VER >= 17 && !__building_module(std) && _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS
# warning <cstdbool> is deprecated in C++17 and removed in C++20.
# endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#endif // _LIBCPP_CSTDBOOL

View File

@ -28,17 +28,8 @@
# pragma GCC system_header
# endif
# if _LIBCPP_STD_VER >= 20
using __standard_header_ctgmath
_LIBCPP_DEPRECATED_("removed in C++20. Include <cmath> and <complex> instead.") _LIBCPP_NODEBUG = void;
using __use_standard_header_ctgmath _LIBCPP_NODEBUG = __standard_header_ctgmath;
# elif _LIBCPP_STD_VER >= 17
using __standard_header_ctgmath _LIBCPP_DEPRECATED_("Include <cmath> and <complex> instead.") _LIBCPP_NODEBUG = void;
using __use_standard_header_ctgmath _LIBCPP_NODEBUG = __standard_header_ctgmath;
# if _LIBCPP_STD_VER >= 17 && !__building_module(std) && _LIBCPP_DIAGNOSE_DEPRECATED_HEADERS
# warning <ctgmath> is deprecated in C++17 and removed in C++20. Include <cmath> and <complex> instead.
# endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)

View File

@ -89,7 +89,7 @@ else:
// UNSUPPORTED: LIBCXX-FREEBSD-FIXME
// RUN: mkdir %t
// RUN: %{{cxx}} %s %{{flags}} %{{compile_flags}} --trace-includes -fshow-skipped-includes --preprocess > /dev/null 2> %t/trace-includes.txt
// RUN: %{{cxx}} %s %{{flags}} %{{compile_flags}} -Wno-deprecated --trace-includes -fshow-skipped-includes --preprocess > /dev/null 2> %t/trace-includes.txt
// RUN: %{{python}} %{{libcxx-dir}}/test/libcxx/transitive_includes/to_csv.py %t/trace-includes.txt > %t/actual_transitive_includes.csv
// RUN: cat %{{libcxx-dir}}/test/libcxx/transitive_includes/%{{cxx_std}}.csv | awk '/^{escaped_header} / {{ print }}' > %t/expected_transitive_includes.csv
// RUN: diff -w %t/expected_transitive_includes.csv %t/actual_transitive_includes.csv

View File

@ -14,12 +14,6 @@
// UNSUPPORTED: c++03, c++11, c++14
// UNSUPPORTED: clang-modules-build
#include "test_macros.h"
#include <ccomplex>
#if TEST_STD_VER >= 20
// expected-warning@ccomplex:* {{'__standard_header_ccomplex' is deprecated: removed in C++20. Include <complex> instead.}}
#else
// expected-warning@ccomplex:* {{'__standard_header_ccomplex' is deprecated: Include <complex> instead.}}
#endif
// expected-warning@ccomplex:* {{<ccomplex> is deprecated in C++17 and removed in C++20. Include <complex> instead.}}

View File

@ -15,4 +15,5 @@
// UNSUPPORTED: clang-modules-build
#include <ciso646>
// expected-warning@ciso646:* {{'__standard_header_ciso646' is deprecated: removed in C++20. Include <version> instead.}}
// expected-warning@ciso646:* {{<ciso646> is removed in C++20. Include <version> instead.}}

View File

@ -14,12 +14,6 @@
// UNSUPPORTED: c++03, c++11, c++14
// UNSUPPORTED: clang-modules-build
#include "test_macros.h"
#include <cstdalign>
#if TEST_STD_VER >= 20
// expected-warning@cstdalign:* {{'__standard_header_cstdalign' is deprecated: removed in C++20.}}
#else
// expected-warning@cstdalign:* {{'__standard_header_cstdalign' is deprecated}}
#endif
// expected-warning@cstdalign:* {{<cstdalign> is deprecated in C++17 and removed in C++20.}}

View File

@ -14,12 +14,6 @@
// UNSUPPORTED: c++03, c++11, c++14
// UNSUPPORTED: clang-modules-build
#include "test_macros.h"
#include <cstdbool>
#if TEST_STD_VER >= 20
// expected-warning@cstdbool:* {{'__standard_header_cstdbool' is deprecated: removed in C++20.}}
#else
// expected-warning@cstdbool:* {{'__standard_header_cstdbool' is deprecated}}
#endif
// expected-warning@cstdbool:* {{<cstdbool> is deprecated in C++17 and removed in C++20.}}

View File

@ -14,12 +14,6 @@
// UNSUPPORTED: c++03, c++11, c++14
// UNSUPPORTED: clang-modules-build
#include "test_macros.h"
#include <ctgmath>
#if TEST_STD_VER >= 20
// expected-warning@ctgmath:* {{'__standard_header_ctgmath' is deprecated: removed in C++20. Include <cmath> and <complex> instead.}}
#else
// expected-warning@ctgmath:* {{'__standard_header_ctgmath' is deprecated: Include <cmath> and <complex> instead.}}
#endif
// expected-warning@ctgmath:* {{<ctgmath> is deprecated in C++17 and removed in C++20. Include <cmath> and <complex> instead.}}

View File

@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
// REQUIRES: std-at-least-c++23
// REQUIRES: std-at-least-c++26
// <tuple>
@ -21,11 +21,6 @@
void test() {
// expected-error@*:* {{static assertion failed}}
// Turns to an error since C++26 (Disallow Binding a Returned Glvalue to a Temporary https://wg21.link/P2748R5).
#if TEST_STD_VER >= 26
// expected-error@tuple:* {{returning reference to local temporary object}}
#else
// expected-warning@tuple:* {{returning reference to local temporary object}}
#endif
std::ignore = std::make_from_tuple<const int&>(std::tuple<char>{});
}

View File

@ -99,7 +99,7 @@ def parseScript(test, preamble):
substitutions.append(
(
"%{verify}",
"%{cxx} %s %{flags} %{compile_flags} -fsyntax-only -Wno-error -Xclang -verify -Xclang -verify-ignore-unexpected=note -ferror-limit=0",
"%{cxx} %s %{flags} %{compile_flags} -U_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -fsyntax-only -Wno-error -Xclang -verify -Xclang -verify-ignore-unexpected=note -ferror-limit=0",
)
)
substitutions.append(("%{run}", "%{exec} %t.exe"))