On Thu, Jan 17, 2013 at 10:06 AM, Dmitri Gribenko <[email protected]> wrote: > Hello David, > > On Wed, Jan 16, 2013 at 1:13 AM, David Greene <[email protected]> wrote: >> Author: greened >> Date: Tue Jan 15 17:13:47 2013 >> New Revision: 172570 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=172570&view=rev >> Log: >> Avoid unsigned Compare to int >> >> Cast arithmetic results to avoid comparison of an unsigned to an int. >> >> Modified: >> cfe/trunk/lib/CodeGen/CGExpr.cpp >> >> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=172570&r1=172569&r2=172570&view=diff >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Jan 15 17:13:47 2013 >> @@ -1191,7 +1191,7 @@ >> cast<llvm::LoadInst>(Val)->setAlignment(Info.StorageAlignment); >> >> if (Info.IsSigned) { >> - assert((Info.Offset + Info.Size) <= Info.StorageSize); >> + assert(static_cast<unsigned>(Info.Offset + Info.Size) <= >> Info.StorageSize); >> unsigned HighBits = Info.StorageSize - Info.Offset - Info.Size; >> if (HighBits) >> Val = Builder.CreateShl(Val, HighBits, "bf.shl"); > > Which version of gcc do you use? > > I tested gcc 4.4, 4.6, 4.7 with -W -Wall -Wextra on > > int f(unsigned a, unsigned b, unsigned c) { > if (a + b <= c) > return 42; > return 0; > } > > and I don't see any warnings.
This is due to GCC's misimplementation of bitfields (they implement a resolution to a WG14 defect report which the C committee decided not to ratify). They treat the bitwidth as being part of the type, and then the usual arithmetic conversions for 'unsigned:16 + unsigned:15' give 'int' as the type of the LHS of the <=. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
