Author: rtrieu Date: Thu Aug 4 21:39:30 2016 New Revision: 277796 URL: http://llvm.org/viewvc/llvm-project?rev=277796&view=rev Log: Allow -1 to assign max value to unsigned bitfields.
Silence the -Wbitfield-constant-conversion warning for when -1 or other negative values are assigned to unsigned bitfields, provided that the bitfield is wider than the minimum number of bits needed to encode the negative value. Modified: cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/test/Sema/bitfield.c cfe/trunk/test/Sema/constant-conversion.c Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=277796&r1=277795&r2=277796&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Aug 4 21:39:30 2016 @@ -7827,6 +7827,12 @@ bool AnalyzeBitFieldAssignment(Sema &S, unsigned OriginalWidth = Value.getBitWidth(); unsigned FieldWidth = Bitfield->getBitWidthValue(S.Context); + if (Value.isSigned() && Value.isNegative()) + if (UnaryOperator *UO = dyn_cast<UnaryOperator>(OriginalInit)) + if (UO->getOpcode() == UO_Minus) + if (isa<IntegerLiteral>(UO->getSubExpr())) + OriginalWidth = Value.getMinSignedBits(); + if (OriginalWidth <= FieldWidth) return false; Modified: cfe/trunk/test/Sema/bitfield.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/bitfield.c?rev=277796&r1=277795&r2=277796&view=diff ============================================================================== --- cfe/trunk/test/Sema/bitfield.c (original) +++ cfe/trunk/test/Sema/bitfield.c Thu Aug 4 21:39:30 2016 @@ -64,7 +64,7 @@ typedef signed Signed; struct Test5 { unsigned n : 2; } t5; // Bitfield is unsigned -struct Test5 sometest5 = {-1}; // expected-warning {{implicit truncation from 'int' to bitfield changes value from -1 to 3}} +struct Test5 sometest5 = {-1}; typedef __typeof__(+t5.n) Signed; // ... but promotes to signed. typedef __typeof__(t5.n + 0) Signed; // Arithmetic promotes. Modified: cfe/trunk/test/Sema/constant-conversion.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/constant-conversion.c?rev=277796&r1=277795&r2=277796&view=diff ============================================================================== --- cfe/trunk/test/Sema/constant-conversion.c (original) +++ cfe/trunk/test/Sema/constant-conversion.c Thu Aug 4 21:39:30 2016 @@ -113,3 +113,15 @@ void test9() { char array_init[] = { 255, 127, 128, 129, 0 }; } + +void test10() { + struct S { + unsigned a : 4; + } s; + s.a = -1; + s.a = 15; + s.a = -8; + + s.a = -9; // expected-warning{{implicit truncation from 'int' to bitfield changes value from -9 to 7}} + s.a = 16; // expected-warning{{implicit truncation from 'int' to bitfield changes value from 16 to 0}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits