[Bug 265181] Strange C++ error on armv6: it can't implicitly convert integer to float
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 13 Jul 2022 03:33:44 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=265181 Mark Millard <marklmi26-fbsd@yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |marklmi26-fbsd@yahoo.com --- Comment #1 from Mark Millard <marklmi26-fbsd@yahoo.com> --- (In reply to Yuri Victorovich from comment #0) The port does a patch that involves: @@ -983,7 +991,7 @@ char *Alsa_pcmi::play_floatre (const float *src, char while (nfrm--) { d = *src; - *((float *) dst) = __bswap_32 (d); + *((float *) dst) = bswap_32 (d); dst += _play_step; src += step; } @@ -1105,7 +1113,7 @@ const char *Alsa_pcmi::capt_floatre (const char *src, while (nfrm--) { d = *((float *) src); - *dst = __bswap_32 (d); + *dst = bswap_32 (d); dst += step; src += _capt_step; } I'll use Alsa_pcmi::play_floatre as the example to carry my points. The complaint is about (after expansion but with some text replaced by "MORE_NOT_SHOWN"): *((float *) dst) = ((((d) & 0xff000000U) >> 24) | MORE_NOT_SHOWN via: zita-alsa-pcmi.cc:994:28: error: invalid operands to binary expression ('float' and 'unsigned int') *((float *) dst) = bswap_32 (d); ^~~~~~~~~~~~ /usr/include/infiniband/byteswap.h:39:25: note: expanded from macro 'bswap_32' #define bswap_32 bswap32 ^ /usr/include/sys/endian.h:62:20: note: expanded from macro 'bswap32' #define bswap32(x) __bswap32(x) ^~~~~~~~~~~~ /usr/include/machine/endian.h:134:6: note: expanded from macro '__bswap32' __bswap32_constant(x) : \ ^~~~~~~~~~~~~~~~~~~~~ /usr/include/machine/endian.h:118:12: note: expanded from macro '__bswap32_constant' ((((x) & 0xff000000U) >> 24) | \ ~~~ ^ ~~~~~~~~~~~ But the original unpatched code is (note the type of d): char *Alsa_pcmi::play_floatre (const float *src, char *dst, int nfrm, int step) { float d; while (nfrm--) { d = *src; *((float *) dst) = __bswap_32 (d); dst += _play_step; src += step; } return dst; } So the end result after patching and expanding looks like: char *Alsa_pcmi::play_floatre (const float *src, char *dst, int nfrm, int step) { float d; while (nfrm--) { d = *src; *((float *) dst) = ((((d) & 0xff000000U) >> 24) | MORE_NOT_SHOWN; dst += _play_step; src += step; } return dst; } So d is if type float. So (d) is of type float. So (d) & 0xff000000U has & taking a mix of float on the left and unsigned int on the right. This is what the complaint is about. This is not an example of integer converting to float. For & the language rules are: QUOTE The operands shall be of integral or unscoped enumeration type. The usual arithmetic conversions (7.4) are performed. END QUOTE The rule in 7.4 relative to float is: QUOTE (after scoped enumeration, long double, and double for "either operand"): Otherwise, if either operand is float, the other shall be converted to float. END QUOTE Thus (d) & 0xff000000U turns into: (d) & static_cast<float>(0xff000000U) And then neither operand is an "integral or unscoped enumeration type". Thus the reported error. Looks like a correct message to me. -- You are receiving this mail because: You are the assignee for the bug.