diff options
author | Richard Trieu <rtrieu@google.com> | 2016-08-05 02:39:30 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2016-08-05 02:39:30 +0000 |
commit | 7561ed01cb762d336d60dc2b05faab6c948e11fd (patch) | |
tree | 860d64bcc17e554b261176f6935f726ce28849b6 /clang/lib/Sema/SemaChecking.cpp | |
parent | a425623dd9907bf5433e2bf0f64b7e0dcb2b4a8a (diff) | |
download | llvm-7561ed01cb762d336d60dc2b05faab6c948e11fd.zip llvm-7561ed01cb762d336d60dc2b05faab6c948e11fd.tar.gz llvm-7561ed01cb762d336d60dc2b05faab6c948e11fd.tar.bz2 |
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
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index a534ead..c716394 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -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; |