Message ID | 20220215100743.GM2646553@tucnak |
---|---|
State | New |
Headers | show |
Series | c-family: Fix up shorten_compare for decimal vs. non-decimal float comparison [PR104510] | expand |
On 2/15/22 05:07, Jakub Jelinek wrote: > Hi! > > The comment in shorten_compare says: > /* If either arg is decimal float and the other is float, fail. */ > but the callers of shorten_compare don't expect anything like failure > as a possibility from the function, callers require that the function > promotes the operands to the same type, whether the original selected > *restype_ptr one or some shortened. > So, if we choose not to shorten, we should still promote to the original > *restype_ptr. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? OK. > 2022-02-15 Jakub Jelinek <jakub@redhat.com> > > PR c/104510 > * c-common.cc (shorten_compare): Convert original arguments to > the original *restype_ptr when mixing binary and decimal float. > > * gcc.dg/dfp/pr104510.c: New test. > > --- gcc/c-family/c-common.cc.jj 2022-02-04 14:36:53.998619364 +0100 > +++ gcc/c-family/c-common.cc 2022-02-14 19:07:14.305068950 +0100 > @@ -3174,7 +3174,11 @@ shorten_compare (location_t loc, tree *o > else if (real1 && real2 > && (DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop0))) > || DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop1))))) > - return NULL_TREE; > + { > + type = *restype_ptr; > + primop0 = op0; > + primop1 = op1; > + } > > else if (real1 && real2 > && (TYPE_PRECISION (TREE_TYPE (primop0)) > --- gcc/testsuite/gcc.dg/dfp/pr104510.c.jj 2022-02-14 19:11:05.610860035 +0100 > +++ gcc/testsuite/gcc.dg/dfp/pr104510.c 2022-02-14 19:10:42.819176224 +0100 > @@ -0,0 +1,12 @@ > +/* PR c/104510 */ > +/* { dg-do compile } */ > +/* { dg-options "" } */ > + > +float f; > +_Decimal64 d; > + > +int > +foo (void) > +{ > + return d > (_Decimal32) (_Decimal64) f; > +} > > Jakub >
--- gcc/c-family/c-common.cc.jj 2022-02-04 14:36:53.998619364 +0100 +++ gcc/c-family/c-common.cc 2022-02-14 19:07:14.305068950 +0100 @@ -3174,7 +3174,11 @@ shorten_compare (location_t loc, tree *o else if (real1 && real2 && (DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop0))) || DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop1))))) - return NULL_TREE; + { + type = *restype_ptr; + primop0 = op0; + primop1 = op1; + } else if (real1 && real2 && (TYPE_PRECISION (TREE_TYPE (primop0)) --- gcc/testsuite/gcc.dg/dfp/pr104510.c.jj 2022-02-14 19:11:05.610860035 +0100 +++ gcc/testsuite/gcc.dg/dfp/pr104510.c 2022-02-14 19:10:42.819176224 +0100 @@ -0,0 +1,12 @@ +/* PR c/104510 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +float f; +_Decimal64 d; + +int +foo (void) +{ + return d > (_Decimal32) (_Decimal64) f; +}