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.

Tested powerpc64le-linux, committed to trunk.


commit 32a397016958aad920289c895f4b65602d7aa46d
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu Feb 14 08:54:00 2019 +0000

    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.

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.
     <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 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. <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 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
+// <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>();
+}

Reply via email to