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