c-family: Fix up shorten_compare for decimal vs. non-decimal float comparison [PR104510]
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. 2022-02-16 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.
This commit is contained in:
parent
875e493bf5
commit
6e74122f0d
@ -3174,7 +3174,11 @@ shorten_compare (location_t loc, tree *op0_ptr, tree *op1_ptr,
|
||||
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))
|
||||
|
12
gcc/testsuite/gcc.dg/dfp/pr104510.c
Normal file
12
gcc/testsuite/gcc.dg/dfp/pr104510.c
Normal file
@ -0,0 +1,12 @@
|
||||
/* PR c/104510 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
float f;
|
||||
_Decimal64 d;
|
||||
|
||||
int
|
||||
foo (void)
|
||||
{
|
||||
return d > (_Decimal32) (_Decimal64) f;
|
||||
}
|
Loading…
Reference in New Issue
Block a user