]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Fix up floating point conversion rank comparison for _Float32 and float if float...
authorJakub Jelinek <jakub@redhat.com>
Mon, 17 Jun 2024 16:53:21 +0000 (18:53 +0200)
committerJakub Jelinek <jakub@redhat.com>
Mon, 17 Jun 2024 16:53:21 +0000 (18:53 +0200)
commit8584c98f370cd91647c184ce58141508ca478a12
tree85e63ca5213a40895218f6e03e52e4de0bb79022
parent4f18f75c5648d0b46a72f18e321bec279a6964be
c++: Fix up floating point conversion rank comparison for _Float32 and float if float/double are same size [PR115511]

On AVR and SH with some options sizeof (float) == sizeof (double) and
the 2 types have the same set of values.
http://eel.is/c++draft/conv.rank#2.2 for this says that double still
has bigger rank than float and http://eel.is/c++draft/conv.rank#2.2
says that extended type with the same set of values as more than one
standard floating point type shall have the same rank as double.
I've implemented the latter rule as
   if (cnt > 1 && mv2 == long_double_type_node)
     return -2;
with the _Float64/double/long double case having same mode case (various
targets with -mlong-double-64) in mind.
But never thought there are actually targets where float and double
are the same, that needs handling too, if cnt > 1 (that is the extended
type mv1 has same set of values as 2 or 3 of float/double/long double)
and mv2 is float, we need to return 2, because mv1 in that case should
have same rank as double and double has bigger rank than float.

2024-06-17  Jakub Jelinek  <jakub@redhat.com>

PR target/111343
PR c++/115511
* typeck.cc (cp_compare_floating_point_conversion_ranks): If an
extended floating point type mv1 has same set of values as more
than one standard floating point type and mv2 is float, return 2.

* g++.dg/cpp23/ext-floating18.C: New test.
gcc/cp/typeck.cc
gcc/testsuite/g++.dg/cpp23/ext-floating18.C [new file with mode: 0644]