forked from OSchip/llvm-project
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. llvm-svn: 277796
This commit is contained in:
parent
a425623dd9
commit
7561ed01cb
|
@ -7827,6 +7827,12 @@ bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init,
|
|||
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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue