[PATCH] D15814: Implicit conversion from float->bool

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 30 17:00:18 PST 2015


On Dec 30, 2015 11:53 AM, "Aaron Ballman" <aaron.ballman at gmail.com> wrote:
>
> On Wed, Dec 30, 2015 at 12:30 PM, Richard Smith <richard at metafoo.co.uk>
wrote:
> > On Dec 30, 2015 6:34 AM, "Aaron Ballman" <aaron.ballman at gmail.com>
wrote:
> >>
> >> aaron.ballman closed this revision.
> >> aaron.ballman added a comment.
> >>
> >> Thanks! I've commit in r256643.
> >>
> >>
> >> ================
> >> Comment at: test/SemaCXX/warn-literal-conversion.cpp:49-50
> >> @@ +48,4 @@
> >> +  // values.
> >> +  bool b3 = 0.0f;
> >> +  bool b4 = 0.0;
> >> +}
> >> ----------------
> >> rsmith wrote:
> >> > What about
> >> >
> >> >   bool b5 = 1.0;
> >> >   bool b6 = 2.0;
> >> >
> >> > ? Arguably any `float` -> `bool` conversion changes the value
(because
> >> > `true` and `false` are not values of type `float`), so it wouldn't be
> >> > completely unreasonable to warn even if the literal is `0.0`.
> >> Except those conversions won't cause confusion to the user, so I'm not
> >> certain what we gain by diagnosing. Given that some mental models
expect
> >> 0.99 to convert to 0, which converts to false (because bool is an
integral
> >> type, so it "must" do the usual integral truncation dance), it makes
sense
> >> to tell the user "no no no, that converts to true." I'm less convinced
about
> >> the utility of warning on things like `bool b = 1.99f' where it
changes the
> >> value from 1.99 to true. Perhaps this should be changed to only
diagnose
> >> when converting through an integer would result in a different value
that
> >> converting through the float?
> >
> > Let me ask a slightly different question: when would it ever be
reasonable
> > and intentional to initialize a bool from a floating-point *literal*?
For
> > integers, people use things like
> >
> >   int n = 1e6;
> >
> > which is why we don't complain if the literal is exactly representable
in
> > the integer type. I can't imagine any similar cases for bool.
>
> I see what you're getting at now, and I agree that it wouldn't be
> particularly reasonable. However, I think that there are two things to
> warn about: initializing from a literal in general, and initializing
> from a literal where the resulting Boolean value may be surprising.
> While we're at it: is there ever a time where it's reasonable to
> initialize a bool from a literal of type other than an integer or
> bool? For instance:
>
> bool b1 = L'1';
> bool b2 = '1';
> bool b3 = 1.0f;
> bool b4 = nullptr; // -Wnull-conversion catches this
>
> I think it makes sense for all of these to diagnose under
> -Wliteral-conversion, but drop the "changes value" clause.
>
> bool b5 = 0.01;
> bool b6 = '0';
> bool b7 = L'0';
>
> I think it makes sense for these to diagnose under
> -Wliteral-conversion, but with the changes value clause.

That makes sense to me. IIRC, we have seen initialization of a bool from a
string literal "true" or -- worse -- "false" a few times.

> ~Aaron
>
> >
> >>
> >> http://reviews.llvm.org/D15814
> >>
> >>
> >>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151230/a38f90ba/attachment.html>


More information about the cfe-commits mailing list