C++ PATCH for c++/65043, missing narrowing warning with bool
Jason Merrill
jason@redhat.com
Tue Aug 21 11:50:00 GMT 2018
On Wed, Aug 15, 2018 at 11:30 AM, Marek Polacek <polacek@redhat.com> wrote:
> We weren't complaining about narrowing when converting to bool because
> standard_conversion wasn't setting check_narrowing for the converting to bool
> case; it only sets it at the end of the function. Moreover, check_narrowing
> wasn't catching real_type -> boolean_type at all, which is wrong;
> [dcl.init.list] says that a narrowing conversion is an implicit conversion from
> a floating-point type to an integer type, and bool is an integer type.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2018-08-14 Marek Polacek <polacek@redhat.com>
>
> PR c++/65043
> * call.c (standard_conversion): Set check_narrowing.
> * typeck2.c (check_narrowing): Use CP_INTEGRAL_TYPE_P rather
> than comparing with INTEGER_TYPE.
>
> * g++.dg/concepts/pr67595.C: Add dg-warning.
> * g++.dg/cpp0x/Wnarrowing11.C: New test.
> * g++.dg/cpp0x/Wnarrowing12.C: New test.
> * g++.dg/cpp0x/rv-cast5.C: Add static_cast.
>
> diff --git gcc/cp/call.c gcc/cp/call.c
> index 62654a9e407..ded279a0f43 100644
> --- gcc/cp/call.c
> +++ gcc/cp/call.c
> @@ -1387,6 +1387,8 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
> conv->rank = cr_pbool;
> if (NULLPTR_TYPE_P (from) && (flags & LOOKUP_ONLYCONVERTING))
> conv->bad_p = true;
> + if (flags & LOOKUP_NO_NARROWING)
> + conv->check_narrowing = true;
> return conv;
> }
Hmm, it might be better to fix this section to properly fall through
to the common check_narrowing code below. OK either way.
Jason
More information about the Gcc-patches
mailing list