Document LWG 2735 status and add test

This DR was already resolved for GCC 7.1 by the implementation of DR
2192, but we didn't have an explicit test for the behaviour that 2735
guarantees.

	* 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.

From-SVN: r268867
This commit is contained in:
Jonathan Wakely 2019-02-14 09:07:09 +00:00 committed by Jonathan Wakely
parent 31de5e4d91
commit 8936f5310a
4 changed files with 66 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2019-02-14 Jonathan Wakely <jwakely@redhat.com>
* 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 <jwakely@redhat.com>
PR libstdc++/89345

View File

@ -1134,6 +1134,17 @@ requirements of the license of GCC.
<listitem><para>Define the <code>value_compare</code> typedef.
</para></listitem></varlistentry>
<varlistentry xml:id="manual.bugs.dr2735"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2735">2735</link>:
<emphasis><code>std::abs(short)</code>,
<code>std::abs(signed char)</code> and others should return
<code>int</code> instead of <code>double</code> in order to be
compatible with C++98 and C
</emphasis>
</term>
<listitem><para>Resolved by the changes for
<link linkend="manual.bugs.dr2192">2192</link>.
</para></listitem></varlistentry>
<varlistentry xml:id="manual.bugs.dr2770"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2770">2770</link>:
<emphasis><code>tuple_size&lt;const T&gt;</code> specialization is not
SFINAE compatible and breaks decomposition declarations

View File

@ -64,6 +64,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// _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

View File

@ -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
// <http://www.gnu.org/licenses/>.
// { 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 <cstdlib>
template<typename> struct is_int { };
template<> struct is_int<int> { typedef int type; };
template<typename T>
typename is_int<T>::type
do_check(T t)
{
return T(0);
}
template<typename T>
void check()
{
do_check(std::abs(T(0)));
}
void test()
{
check<short>();
check<unsigned short>();
check<char>();
check<signed char>();
check<unsigned char>();
}