aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-02-14 09:07:09 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-02-14 09:07:09 +0000
commit8936f5310aba723f2fbc2b0106e74fd307e4c347 (patch)
treeb6993c8b6aa9f6c47acc0ef70f7cb54f6c33b079
parent31de5e4d91c8b348dd23ed2042983b9b057c882c (diff)
downloadgcc-8936f5310aba723f2fbc2b0106e74fd307e4c347.zip
gcc-8936f5310aba723f2fbc2b0106e74fd307e4c347.tar.gz
gcc-8936f5310aba723f2fbc2b0106e74fd307e4c347.tar.bz2
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
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/doc/xml/manual/intro.xml11
-rw-r--r--libstdc++-v3/include/bits/std_abs.h1
-rw-r--r--libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2735.cc48
4 files changed, 66 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index e8be1b8..6fcfcea 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml
index 28210cb..71050a0 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.
<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
diff --git a/libstdc++-v3/include/bits/std_abs.h b/libstdc++-v3/include/bits/std_abs.h
index 60a6542..8430010 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. <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
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 0000000..2a54201
--- /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
+// <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>();
+}