aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorDaniel Marjamaki <daniel.marjamaki@evidente.se>2016-09-22 14:13:46 +0000
committerDaniel Marjamaki <daniel.marjamaki@evidente.se>2016-09-22 14:13:46 +0000
commitee5b5f52ba632ff4a6e1523aefd22bbe0ef9b0f7 (patch)
treea9195b16288d1a5f7ff7b0054b071ddb9352c8b4 /clang/lib/Sema/SemaChecking.cpp
parentba1598975ffe0a7d4f85845b3e77e60b49e25545 (diff)
downloadllvm-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.cpp7
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;