diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e8be1b86630..6fcfcea1099 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2019-02-14 Jonathan Wakely + + * doc/xml/manual/intro.xml: Document LWG 2735 status. + * include/bits/std_abs.h: Add comment about LWG 2735. + * testsuite/26_numerics/headers/cstdlib/dr2735.cc: New test. + 2019-02-13 Jonathan Wakely PR libstdc++/89345 diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml index 28210cb0862..71050a0cebc 100644 --- a/libstdc++-v3/doc/xml/manual/intro.xml +++ b/libstdc++-v3/doc/xml/manual/intro.xml @@ -1134,6 +1134,17 @@ requirements of the license of GCC. Define the value_compare typedef. + 2735: + std::abs(short), + std::abs(signed char) and others should return + int instead of double in order to be + compatible with C++98 and C + + + Resolved by the changes for + 2192. + + 2770: tuple_size<const T> specialization is not SFINAE compatible and breaks decomposition declarations diff --git a/libstdc++-v3/include/bits/std_abs.h b/libstdc++-v3/include/bits/std_abs.h index 60a65423c38..8430010b432 100644 --- a/libstdc++-v3/include/bits/std_abs.h +++ b/libstdc++-v3/include/bits/std_abs.h @@ -64,6 +64,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2192. Validity and return type of std::abs(0u) is unclear // 2294. 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 diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2735.cc b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2735.cc new file mode 100644 index 00000000000..2a542011fa6 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2735.cc @@ -0,0 +1,48 @@ +// Copyright (C) 2019 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. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-do compile } + +// NB: Don't include any other headers in this file. +// LWG 2735. std::abs(short), std::abs(signed char) and others should return +// int instead of double in order to be compatible with C++98 and C +#include + +template struct is_int { }; +template<> struct is_int { typedef int type; }; + +template +typename is_int::type +do_check(T t) +{ + return T(0); +} + +template +void check() +{ + do_check(std::abs(T(0))); +} + +void test() +{ + check(); + check(); + check(); + check(); + check(); +}