r277796 - Allow -1 to assign max value to unsigned bitfields.
Richard Trieu via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 4 19:39:30 PDT 2016
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}}
+}
More information about the cfe-commits
mailing list