rjmccall added a comment.

In D63856#1561132 <https://reviews.llvm.org/D63856#1561132>, @erik.pilkington 
wrote:

> In D63856#1561112 <https://reviews.llvm.org/D63856#1561112>, @rjmccall wrote:
>
> > In D63856#1560213 <https://reviews.llvm.org/D63856#1560213>, 
> > @erik.pilkington wrote:
> >
> > > In D63856#1560180 <https://reviews.llvm.org/D63856#1560180>, @rjmccall 
> > > wrote:
> > >
> > > > This only applies to relational operators, right?  I'm a little 
> > > > uncomfortable with calling this "tautological" since it's not like it's 
> > > > *undefined behavior* to have `(BOOL) 2`, it's just *unwise*.  But as 
> > > > long as we aren't warning about reasonable idioms that are intended to 
> > > > handle unfortunate situations — like other code that might have left a 
> > > > non-`{0,1}` value in the `BOOL` — I think this is fine.
> > >
> > >
> > > I think the party line is that it is undefined behaviour (in some sense), 
> > > since UBSan will happily crash if you try to load a non-boolean value 
> > > from a BOOL.
> >
> >
> > What?  Since when?
>
>
> https://reviews.llvm.org/D27607


Interesting; I'm not sure I find that convincing.  Probably the least 
convincing part is where it links to its own behavioral documentation as 
justification for doing what it does.  But okay, I guess we do this.

>>> It is a bit unfortunate that "defensive" code will start warning here 
>>> though :/. Maybe we can try to detect and permit something like `B < NO || 
>>> B > YES`, or emit a note with some canonical way of checking for 
>>> non-boolean BOOLs. Even if we end up having to disable it default, I think 
>>> its still a good diagnostic to have. A warning on stores to BOOL would 
>>> probably be a lot higher value, though.
>> 
>> I'm not sure this is a problem because I'm not sure there's any reason to 
>> write defensive code besides `B != NO` or `B == NO`.  It's potentially 
>> problematic if someone writes `B == YES`, though.
> 
> I was thinking about something like the following, which probably isn't worth 
> warning on. Another way of handling it would be only emitting the diagnostic 
> if `!InRange`. Not exactly sure how common that pattern actually is though.
> 
>   void myAPI(BOOL DoAThing) {
>     if (DoAThing > YES || DoAThing < NO) DoAThing = YES;
>     // ...
>   }

I don't think it's a problem to warn about this; this is just a silly way of 
writing `if (DoAThing != NO) { DoAThing = YES; }`.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63856/new/

https://reviews.llvm.org/D63856



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to