From 8936f5310aba723f2fbc2b0106e74fd307e4c347 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 14 Feb 2019 09:07:09 +0000 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 6 +++ libstdc++-v3/doc/xml/manual/intro.xml | 11 +++++ libstdc++-v3/include/bits/std_abs.h | 1 + .../26_numerics/headers/cstdlib/dr2735.cc | 48 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2735.cc 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(); +}