]> granicus.if.org Git - clang/commitdiff
Don't wanr about "negative shifts" in code that is unreachable. Fixes PR 5544.
authorTed Kremenek <kremenek@apple.com>
Tue, 1 Mar 2011 18:09:31 +0000 (18:09 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 1 Mar 2011 18:09:31 +0000 (18:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126762 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/shift.c

index 321e96f1e75f3bd71e729ec2d0d9b0795cee9283..bc2251a4e0e7bc28b18eb62b0dfa7af40f5f344a 100644 (file)
@@ -6641,7 +6641,9 @@ static void DiagnoseBadShiftValues(Sema& S, Expr *&lex, Expr *&rex,
     return;
 
   if (Right.isNegative()) {
-    S.Diag(Loc, diag::warn_shift_negative) << rex->getSourceRange();
+    S.DiagRuntimeBehavior(Loc, rex,
+                          S.PDiag(diag::warn_shift_negative)
+                            << rex->getSourceRange());
     return;
   }
   llvm::APInt LeftBits(Right.getBitWidth(),
index df6b1141bdfc7c82d81a28efb3daa426662c4dc7..d75b5462cf8fdb0a303c23fa9f0212c19332d834 100644 (file)
@@ -56,3 +56,7 @@ void test() {
 #define ashift 8
 enum { b = (a << ashift) };
 
+// Don't warn for negative shifts in code that is unreachable.
+void test_pr5544() {
+  (void) (((1) > 63 && (1) < 128 ? (((unsigned long long) 1)<<((1)-64)) : (unsigned long long) 0)); // no-warning
+}