This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: PING [PATCH] Fix PR libstdc++/54036, problem negating DFP NaNs
- From: Peter Bergner <bergner at vnet dot ibm dot com>
- To: Paolo Carlini <paolo dot carlini at oracle dot com>
- Cc: Janis Johnson <janis_johnson at mentor dot com>, gcc-patches at gcc dot gnu dot org, libstdc++ at gcc dot gnu dot org
- Date: Wed, 1 Aug 2012 18:53:35 -0500
- Subject: Re: PING [PATCH] Fix PR libstdc++/54036, problem negating DFP NaNs
- References: <20120731174612.2f6fb986db4a93c56e9da485@vnet.ibm.com> <50193D2D.1000106@oracle.com> <50194A40.8010505@mentor.com>
On Wed, 1 Aug 2012 08:24:48 -0700 Janis Johnson wrote:
> On 08/01/2012 07:29 AM, Paolo Carlini wrote:
> > On 08/01/2012 12:46 AM, Peter Bergner wrote:
> >> I'd like to ping the following libstdc++ DFP patch that fixes PR54036:
> >>
> >> http://gcc.gnu.org/ml/gcc-patches/2012-07/msg00959.html
> > I think the patch is essentially Ok, but I would recommend giving Janis
> > a chance to comment (say 24/48 h).
>
> It looks fine to me.
>
> > Note that the patch only touches libstdc++-v3 code, thus the testcases
> > should be added to libstdc++-v3/testsuite/decimal and the patch itself
> > was missing a CC to libstdc++@.
>
> I agree.
So just to be sure, like the patch below?
Also, is this ok for the 4.6 and 4.7 release branches?
Peter
libstdc++-v3/
PR libstdc++/54036
* include/decimal/decimal.h (_DEFINE_DECIMAL_UNARY_OP): Use _Op as
a unary operator.
libstdc++-v3/testsuite/
PR libstdc++/54036
* decimal/pr54036-1.cc: New test.
* decimal/pr54036-2.cc: Likewise.
* decimal/pr54036-3.cc: Likewise.
Index: libstdc++-v3/include/decimal/decimal.h
===================================================================
--- libstdc++-v3/include/decimal/decimal.h (revision 189599)
+++ libstdc++-v3/include/decimal/decimal.h (working copy)
@@ -288,7 +288,7 @@
inline _Tp operator _Op(_Tp __rhs) \
{ \
_Tp __tmp; \
- __tmp.__setval(0 _Op __rhs.__getval()); \
+ __tmp.__setval(_Op __rhs.__getval()); \
return __tmp; \
}
Index: libstdc++-v3/testsuite/decimal/pr54036-1.cc
===================================================================
--- libstdc++-v3/testsuite/decimal/pr54036-1.cc (revision 0)
+++ libstdc++-v3/testsuite/decimal/pr54036-1.cc (revision 0)
@@ -0,0 +1,56 @@
+#include <decimal/decimal>
+using namespace std;
+
+decimal::decimal32
+__attribute__ ((noinline))
+my_nan32 (void)
+{
+ decimal::decimal32 z = 0;
+ decimal::decimal32 v = z/z;
+ return v;
+}
+
+decimal::decimal32
+__attribute__ ((noinline))
+my_inf32 (void)
+{
+ decimal::decimal32 o = 1;
+ decimal::decimal32 z = 0;
+ decimal::decimal32 v = o/z;
+ return v;
+}
+
+int
+main (void)
+{
+ decimal::decimal32 v;
+
+ v = my_nan32 ();
+ if (!__builtin_isnand32 (v.__getval ()))
+ __builtin_abort ();
+ if (__builtin_signbitd32 (v.__getval ()))
+ __builtin_abort ();
+
+ v = -v;
+
+ if (!__builtin_isnand32 (v.__getval ()))
+ __builtin_abort ();
+ if (!__builtin_signbitd32 (v.__getval ()))
+ __builtin_abort ();
+
+ v = my_inf32 ();
+ if (!__builtin_isinfd32 (v.__getval ()))
+ __builtin_abort ();
+ if (__builtin_signbitd32 (v.__getval ()))
+ __builtin_abort ();
+
+ v = -v;
+
+ if (!__builtin_isinfd32 (v.__getval ()))
+ __builtin_abort ();
+ if (!__builtin_signbitd32 (v.__getval ()))
+ __builtin_abort ();
+
+ return 0;
+}
+
Index: libstdc++-v3/testsuite/decimal/pr54036-2.cc
===================================================================
--- libstdc++-v3/testsuite/decimal/pr54036-2.cc (revision 0)
+++ libstdc++-v3/testsuite/decimal/pr54036-2.cc (revision 0)
@@ -0,0 +1,56 @@
+#include <decimal/decimal>
+using namespace std;
+
+decimal::decimal64
+__attribute__ ((noinline))
+my_nan64 (void)
+{
+ decimal::decimal64 z = 0;
+ decimal::decimal64 v = z/z;
+ return v;
+}
+
+decimal::decimal64
+__attribute__ ((noinline))
+my_inf64 (void)
+{
+ decimal::decimal64 o = 1;
+ decimal::decimal64 z = 0;
+ decimal::decimal64 v = o/z;
+ return v;
+}
+
+int
+main (void)
+{
+ decimal::decimal64 v;
+
+ v = my_nan64 ();
+ if (!__builtin_isnand64 (v.__getval ()))
+ __builtin_abort ();
+ if (__builtin_signbitd64 (v.__getval ()))
+ __builtin_abort ();
+
+ v = -v;
+
+ if (!__builtin_isnand64 (v.__getval ()))
+ __builtin_abort ();
+ if (!__builtin_signbitd64 (v.__getval ()))
+ __builtin_abort ();
+
+ v = my_inf64 ();
+ if (!__builtin_isinfd64 (v.__getval ()))
+ __builtin_abort ();
+ if (__builtin_signbitd64 (v.__getval ()))
+ __builtin_abort ();
+
+ v = -v;
+
+ if (!__builtin_isinfd64 (v.__getval ()))
+ __builtin_abort ();
+ if (!__builtin_signbitd64 (v.__getval ()))
+ __builtin_abort ();
+
+ return 0;
+}
+
Index: libstdc++-v3/testsuite/decimal/pr54036-3.cc
===================================================================
--- libstdc++-v3/testsuite/decimal/pr54036-3.cc (revision 0)
+++ libstdc++-v3/testsuite/decimal/pr54036-3.cc (revision 0)
@@ -0,0 +1,56 @@
+#include <decimal/decimal>
+using namespace std;
+
+decimal::decimal128
+__attribute__ ((noinline))
+my_nan128 (void)
+{
+ decimal::decimal128 z = 0;
+ decimal::decimal128 v = z/z;
+ return v;
+}
+
+decimal::decimal128
+__attribute__ ((noinline))
+my_inf128 (void)
+{
+ decimal::decimal128 o = 1;
+ decimal::decimal128 z = 0;
+ decimal::decimal128 v = o/z;
+ return v;
+}
+
+int
+main (void)
+{
+ decimal::decimal128 v;
+
+ v = my_nan128 ();
+ if (!__builtin_isnand128 (v.__getval ()))
+ __builtin_abort ();
+ if (__builtin_signbitd128 (v.__getval ()))
+ __builtin_abort ();
+
+ v = -v;
+
+ if (!__builtin_isnand128 (v.__getval ()))
+ __builtin_abort ();
+ if (!__builtin_signbitd128 (v.__getval ()))
+ __builtin_abort ();
+
+ v = my_inf128 ();
+ if (!__builtin_isinfd128 (v.__getval ()))
+ __builtin_abort ();
+ if (__builtin_signbitd128 (v.__getval ()))
+ __builtin_abort ();
+
+ v = -v;
+
+ if (!__builtin_isinfd128 (v.__getval ()))
+ __builtin_abort ();
+ if (!__builtin_signbitd128 (v.__getval ()))
+ __builtin_abort ();
+
+ return 0;
+}
+