summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-11-10 00:26:50 +0000
committerJohn McCall <rjmccall@apple.com>2010-11-10 00:26:50 +0000
commitfd81c5294794f85a02c3b032c3803a7b011a4dda (patch)
tree1a6d05e5cba18fdc4551f79377bb4a03b65af37f /clang/lib/Sema/SemaChecking.cpp
parent55c4cc76ce27d8211a3ea1c708a98509a253d640 (diff)
downloadbcm5719-llvm-fd81c5294794f85a02c3b032c3803a7b011a4dda.tar.gz
bcm5719-llvm-fd81c5294794f85a02c3b032c3803a7b011a4dda.zip
Tweak to bitfield-overflow warning: don't warn about storing
a positive value into a signed bitfield of the exact width of the value. llvm-svn: 118657
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index caaa08c0bc2..e69ebe2250d 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2612,7 +2612,14 @@ void AnalyzeAssignment(Sema &S, BinaryOperator *E) {
if (OriginalWidth > FieldWidth) {
llvm::APSInt TruncatedValue = Value;
TruncatedValue.trunc(FieldWidth);
- TruncatedValue.extend(OriginalWidth);
+
+ // It's fairly common to write values into signed bitfields
+ // that, if sign-extended, would end up becoming a different
+ // value. We don't want to warn about that.
+ if (Value.isSigned() && Value.isNegative())
+ TruncatedValue.sext(OriginalWidth);
+ else
+ TruncatedValue.zext(OriginalWidth);
if (Value != TruncatedValue) {
std::string PrettyValue = Value.toString(10);
OpenPOWER on IntegriCloud