mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
The use of #pragma GCC system_header in libstdc++ has led to bugs going undetected for a while due to the silencing of compiler warnings that would have revealed them promptly, and also interferes with warnings about problematic template instantiations induced by user code. But removing it, or even compiling with -Wsystem-header, is also problematic due to warnings about deliberate uses of extensions. So this patch adds #pragma GCC diagnostic as needed to suppress these warnings. The change to acinclude.m4 changes -Wabi to warn only in comparison to ABI 19, to avoid lots of warnings that we now mangle concept requirements, which are in any case still experimental. I checked for any other changes against ABI v15, and found only the <format> lambda mangling, which we can ignore. This also enables -Wsystem-headers while building the library, so we see any warnings not silenced by these #pragmas. libstdc++-v3/ChangeLog: * include/bits/algorithmfwd.h: * include/bits/allocator.h: * include/bits/codecvt.h: * include/bits/concept_check.h: * include/bits/cpp_type_traits.h: * include/bits/hashtable.h: * include/bits/iterator_concepts.h: * include/bits/ostream_insert.h: * include/bits/ranges_base.h: * include/bits/regex_automaton.h: * include/bits/std_abs.h: * include/bits/stl_algo.h: * include/c_compatibility/fenv.h: * include/c_compatibility/inttypes.h: * include/c_compatibility/stdint.h: * include/ext/concurrence.h: * include/ext/type_traits.h: * testsuite/ext/type_traits/add_unsigned_floating_neg.cc: * testsuite/ext/type_traits/add_unsigned_integer_neg.cc: * testsuite/ext/type_traits/remove_unsigned_floating_neg.cc: * testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: * include/bits/basic_ios.tcc: * include/bits/basic_string.tcc: * include/bits/fstream.tcc: * include/bits/istream.tcc: * include/bits/locale_classes.tcc: * include/bits/locale_facets.tcc: * include/bits/ostream.tcc: * include/bits/regex_compiler.tcc: * include/bits/sstream.tcc: * include/bits/streambuf.tcc: * configure: Regenerate. * include/bits/c++config: * include/c/cassert: * include/c/cctype: * include/c/cerrno: * include/c/cfloat: * include/c/climits: * include/c/clocale: * include/c/cmath: * include/c/csetjmp: * include/c/csignal: * include/c/cstdarg: * include/c/cstddef: * include/c/cstdio: * include/c/cstdlib: * include/c/cstring: * include/c/ctime: * include/c/cwchar: * include/c/cwctype: * include/c_global/climits: * include/c_global/cmath: * include/c_global/cstddef: * include/c_global/cstdlib: * include/decimal/decimal: * include/ext/rope: * include/std/any: * include/std/charconv: * include/std/complex: * include/std/coroutine: * include/std/format: * include/std/iomanip: * include/std/limits: * include/std/numbers: * include/tr1/functional: * include/tr1/tuple: * include/tr1/type_traits: * libsupc++/compare: * libsupc++/new: Add #pragma GCC diagnostic to suppress undesired warnings. * acinclude.m4: Change -Wabi version from 2 to 19. gcc/ChangeLog: * ginclude/stdint-wrap.h: Add #pragma GCC diagnostic to suppress undesired warnings. * gsyslimits.h: Likewise.
161 lines
4.8 KiB
C++
161 lines
4.8 KiB
C++
// -*- C++ -*- C library enhancements header.
|
|
|
|
// Copyright (C) 2016-2024 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library is free
|
|
// software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option)
|
|
// any later version.
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
/** @file include/bits/std_abs.h
|
|
* This is an internal header file, included by other library headers.
|
|
* Do not attempt to use it directly. @headername{cmath, cstdlib}
|
|
*/
|
|
|
|
#ifndef _GLIBCXX_BITS_STD_ABS_H
|
|
#define _GLIBCXX_BITS_STD_ABS_H
|
|
|
|
#pragma GCC system_header
|
|
|
|
#include <bits/c++config.h>
|
|
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wpedantic" // include_next
|
|
#pragma GCC diagnostic ignored "-Wlong-long"
|
|
|
|
#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
|
|
#include_next <stdlib.h>
|
|
#ifdef __CORRECT_ISO_CPP_MATH_H_PROTO
|
|
# include_next <math.h>
|
|
#endif
|
|
#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
|
|
|
|
#undef abs
|
|
|
|
extern "C++"
|
|
{
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
{
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
|
|
using ::abs;
|
|
|
|
#ifndef __CORRECT_ISO_CPP_STDLIB_H_PROTO
|
|
inline long
|
|
abs(long __i) { return __builtin_labs(__i); }
|
|
#endif
|
|
|
|
#ifdef _GLIBCXX_USE_LONG_LONG
|
|
inline long long
|
|
abs(long long __x) { return __builtin_llabs (__x); }
|
|
#endif
|
|
|
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
|
// 2192. Validity and return type of std::abs(0u) is unclear
|
|
// 2294. <cstdlib> should declare abs(double)
|
|
// 2735. std::abs(short), std::abs(signed char) and others should return int
|
|
|
|
#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
|
|
inline _GLIBCXX_CONSTEXPR double
|
|
abs(double __x)
|
|
{ return __builtin_fabs(__x); }
|
|
|
|
inline _GLIBCXX_CONSTEXPR float
|
|
abs(float __x)
|
|
{ return __builtin_fabsf(__x); }
|
|
|
|
inline _GLIBCXX_CONSTEXPR long double
|
|
abs(long double __x)
|
|
{ return __builtin_fabsl(__x); }
|
|
#endif
|
|
|
|
#if defined(__GLIBCXX_TYPE_INT_N_0)
|
|
__extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
|
|
abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
|
|
#endif
|
|
#if defined(__GLIBCXX_TYPE_INT_N_1)
|
|
__extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
|
|
abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
|
|
#endif
|
|
#if defined(__GLIBCXX_TYPE_INT_N_2)
|
|
__extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
|
|
abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
|
|
#endif
|
|
#if defined(__GLIBCXX_TYPE_INT_N_3)
|
|
__extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
|
|
abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
|
|
#endif
|
|
|
|
#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
|
|
constexpr _Float16
|
|
abs(_Float16 __x)
|
|
{ return _Float16(__builtin_fabsf(__x)); }
|
|
#endif
|
|
|
|
#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
|
|
constexpr _Float32
|
|
abs(_Float32 __x)
|
|
{ return __builtin_fabsf(__x); }
|
|
#endif
|
|
|
|
#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
|
|
constexpr _Float64
|
|
abs(_Float64 __x)
|
|
{ return __builtin_fabs(__x); }
|
|
#endif
|
|
|
|
#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
|
|
constexpr _Float128
|
|
abs(_Float128 __x)
|
|
{ return __builtin_fabsl(__x); }
|
|
#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
|
|
constexpr _Float128
|
|
abs(_Float128 __x)
|
|
{ return __builtin_fabsf128(__x); }
|
|
#endif
|
|
|
|
#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
|
|
constexpr __gnu_cxx::__bfloat16_t
|
|
abs(__gnu_cxx::__bfloat16_t __x)
|
|
{ return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); }
|
|
#endif
|
|
|
|
#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
|
|
__extension__ inline _GLIBCXX_CONSTEXPR
|
|
__float128
|
|
abs(__float128 __x)
|
|
{
|
|
#if defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
|
|
return __builtin_fabsl(__x);
|
|
#elif defined(_GLIBCXX_HAVE_FLOAT128_MATH)
|
|
return __builtin_fabsf128(__x);
|
|
#else
|
|
// Assume that __builtin_signbit works for __float128.
|
|
return __builtin_signbit(__x) ? -__x : __x;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
} // namespace
|
|
} // extern "C++"
|
|
|
|
#pragma GCC diagnostic pop
|
|
|
|
#endif // _GLIBCXX_BITS_STD_ABS_H
|