<div dir="ltr">I'd also note that -fsanitize=undefined will detect the error at runtime.</div><br><div class="gmail_quote"><div dir="ltr">On Fri, May 25, 2018 at 4:38 AM Hans Wennborg via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, May 22, 2018 at 6:17 PM, Jay K via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> This seems disappointing.<br>
><br>
> Casting any value to an integral type should yield a value within the range<br>
> of that integral type.<br>
<br>
As Tim pointed out, that's not what the standard says though.<br>
<br>
Trunk Clang (I'm not sure what version your Xcode Clang is based on)<br>
has a flag to disable this optimization:<br>
-fno-strict-float-cast-overflow<br>
<br>
 - Hans<br>
<br>
<br>
> The value can be anything, but it should be within range.<br>
><br>
> i.e. it should be as if I anded it with (type)~(type)0.<br>
><br>
><br>
> i.e. int i = (signed char)x;<br>
><br>
> assert(i >= -128 && i <= 127);<br>
><br>
><br>
> int i = (unsigned char)x;<br>
><br>
> assert(i >= 0 && i <= 255);<br>
><br>
><br>
> seem very reasonable, assuming there is no "trap"  before the assert.<br>
><br>
>  - Jay<br>
><br>
><br>
><br>
> ________________________________<br>
> From: Tim Northover <<a href="mailto:t.p.northover@gmail.com" target="_blank">t.p.northover@gmail.com</a>><br>
> Sent: Thursday, April 5, 2018 4:41 PM<br>
> To: Jay K<br>
> Cc: <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>; <a href="mailto:lewurm@gmail.com" target="_blank">lewurm@gmail.com</a><br>
> Subject: Re: [llvm-dev] double to unsigned char cast<br>
><br>
> Hi Jay,<br>
><br>
> On 5 April 2018 at 07:49, Jay K via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
> wrote:<br>
>> wrt<br>
>><br>
>> <a href="https://github.com/mono/mono/commit/fb91fce5d339bb9ffe507588f5bc1d8d6f244d9b" rel="noreferrer" target="_blank">https://github.com/mono/mono/commit/fb91fce5d339bb9ffe507588f5bc1d8d6f244d9b</a><br>
><br>
>><br>
>><br>
>> This doesn't seem right to me.<br>
><br>
> Nevertheless, it's what the standard says. C99 <a href="http://6.3.1.4" rel="noreferrer" target="_blank">6.3.1.4</a>: When a finite<br>
> value of real floating type is converted to an integer type other than<br>
> _Bool, the fractional part is discarded (i.e. the value is truncated<br>
> toward zero). If the value of the integral part cannot be represented<br>
> by the integer type, the behavior is undefined.<br>
><br>
> By definition any double you're allowed to convert to an unsigned char<br>
> doesn't need the "and".<br>
><br>
> Cheers.<br>
><br>
> Tim.<br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
><br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>