diff options
author | Daniel Marjamaki <daniel.marjamaki@evidente.se> | 2016-09-22 14:13:46 +0000 |
---|---|---|
committer | Daniel Marjamaki <daniel.marjamaki@evidente.se> | 2016-09-22 14:13:46 +0000 |
commit | ee5b5f52ba632ff4a6e1523aefd22bbe0ef9b0f7 (patch) | |
tree | a9195b16288d1a5f7ff7b0054b071ddb9352c8b4 /clang/lib/Sema/SemaChecking.cpp | |
parent | ba1598975ffe0a7d4f85845b3e77e60b49e25545 (diff) | |
download | llvm-ee5b5f52ba632ff4a6e1523aefd22bbe0ef9b0f7.zip llvm-ee5b5f52ba632ff4a6e1523aefd22bbe0ef9b0f7.tar.gz llvm-ee5b5f52ba632ff4a6e1523aefd22bbe0ef9b0f7.tar.bz2 |
Fix Wbitfield-constant-conversion false positives
Summary:
The diagnostic did not handle ~ well. An expression such as ~0 is often used when 'all ones' is needed.
Differential Revision: https://reviews.llvm.org/D24232
llvm-svn: 282156
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 0604c5a..119fe8c 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -8006,11 +8006,10 @@ bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init, unsigned OriginalWidth = Value.getBitWidth(); unsigned FieldWidth = Bitfield->getBitWidthValue(S.Context); - if (Value.isSigned() && Value.isNegative()) + 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 (UO->getOpcode() == UO_Minus || UO->getOpcode() == UO_Not) + OriginalWidth = Value.getMinSignedBits(); if (OriginalWidth <= FieldWidth) return false; |