The following code produces a warning about precision loss in an int-to-float conversion:
$cat warn.cpp float f(float x, unsigned short y) { return x * y; } $g++ -Wconversion -c -o warn.o warn.cpp warn.cpp: In function float f(float, short unsigned int): warn.cpp:3: warning: conversion to float from int may alter its value $ The code snippet does not have an int-to-float conversion. It does have an unsigned short-to-float conversion according to the C++ standard, chapter 5 [expr] para 9: "[inapplicable note on long double and double...] Otherwise, if either operand is float, the other shall be converted to float [...]". Only after this rule, integral promotions are performed, which could promote the unsigned short to an int. Moreover, he conversion does not lose information since the 16 bits of the unsigned short fit amply in the float's mantissa. Not tested with other shorter-than-int types. This problem might apply there as well... -- Summary: Spurious integral promotion Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: zweije at xs4all dot nl GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41779