[Bug c++/108285] [13 Regression] error: conversion from ‘long double’ to ‘double’ may change value [-Werror=float-conversion] since r13-3291-g16ec267063c8ce60

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Jan 13 17:24:35 GMT 2023


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108285

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:3456db4de8940235b303ca38a689353854c9239f

commit r13-5152-g3456db4de8940235b303ca38a689353854c9239f
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Jan 13 18:23:57 2023 +0100

    c++: Avoid some false positive -Wfloat-conversion warnings with extended
precision [PR108285]

    On the following testcase trunk emits a false positive warning on ia32.
    convert_like_internal is there called with type of double and
    expr EXCESS_PRECISION_EXPR with float type with long double operand
    2.L * (long double) x.
    Now, for the code generation we do the right thing, cp_convert
    to double from that 2.L * (long double) x, but we call even
    cp_convert_and_check with that and that emits the -Wfloat-conversion
    warning.  Looking at what the C FE does in this case, it calls
    convert_and_check with the EXCESS_PRECISION_EXPR expression rather
    than its operand, and essentially uses the operand for code generation
    and EXCESS_PRECISION_EXPR itself for warnings.

    The following patch does that too for the C++ FE.

    2023-01-13  Jakub Jelinek  <jakub@redhat.com>

            PR c++/108285
            * cvt.cc (cp_convert_and_check): For EXCESS_PRECISION_EXPR
            use its operand except that for warning purposes use the original
            EXCESS_PRECISION_EXPR.
            * call.cc (convert_like_internal): Only look through
            EXCESS_PRECISION_EXPR when calling cp_convert, not when calling
            cp_convert_and_check.

            * g++.dg/warn/pr108285.C: New test.


More information about the Gcc-bugs mailing list