[PATCH] clang warning when division of two integer literals loses precision

Matt Arsenault arsenm2 at gmail.com
Wed Jan 8 17:42:03 PST 2014


On Aug 24, 2013, at 1:43 PM, Tobias Grosser <tobias at grosser.es> wrote:

> On 08/24/2013 03:51 AM, Yaron Keren wrote:
>> Hello,
>> 
>> Attached is a patch I made to make clang warn where division of two integer
>> literals loses precision. For instance:
>> 
>> double x = 1/2;
>> 
>> Which results in x being 0. This is not the programmer's intention.
>> While experienced users will know to code 1.0/2 to force floating division,
>> new C/C++ programmers will fall in this trap.
>> 
>> The patch computes the reminder in the division operation and if only if it
>> is non-zero, warns and suggests a fix.
>> 
>> This is the first code I write for LLVM so please review it carefully.
>> Specifically, I was not sure whether to create another warning group
>> in DiagnosticSemaKinds.td or reuse an existing one. Maybe the group should
>> be renamed from "DivZero" to "DivProblems".
> 
> Wow. This seems really helpful!
> 
> As Matt suggested, please resubmit this patch to cfe-commits and add a test case.
> 
> +//
> +  // check for integer constant division by integer constant
> 
> Also the comment seems misformatted. Remove the '//', start with an uppercase letter and finish the sentence with a point.
> 
> Also, here is an interesting test case that you may want to consider.
> 
> int foo(float b) {
> 	float a = 1/2 + b;
> }
> 
> Suggesting here to transform this into
> 
> int foo(float b) {
> 	float a = 1.0/2 + b;
> }
> 
> may not be what the user actually wants, as this promotes the whole expression to 'double'. Possibly the following is more in line.
> 
> int foo(float b) {
> 	float a = 1.0f/2 + b;
> }
> 
> Cheers,
> Tobias
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

This seems to have been forgotten, so I guess I’ll adopt it. This adds a test, fixes test failures and adds a new warning group for it. I haven’t yet been able to figure out how get the parent expression to check if it’s a cast to float to add the f in the warning message.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140108/d8f6eeed/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-warning-when-division-of-two-integer-literals-lo.patch
Type: application/octet-stream
Size: 6664 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140108/d8f6eeed/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140108/d8f6eeed/attachment-0001.html>


More information about the llvm-commits mailing list