]> granicus.if.org Git - clang/commitdiff
Enhance the -Wsign-compare handling to suppress the -Wsign-compare warning in the...
authorEli Friedman <eli.friedman@gmail.com>
Thu, 15 Dec 2011 02:41:52 +0000 (02:41 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Thu, 15 Dec 2011 02:41:52 +0000 (02:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146634 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/Sema/compare.c

index 5de124de4de071906ca0571fd754cd8aea01abc5..ebdc8321f70e6745904ad972f4415935b71c8258 100644 (file)
@@ -3257,7 +3257,7 @@ IntRange GetExprRange(ASTContext &C, Expr *E, unsigned MaxWidth) {
   // user has an explicit widening cast, we should treat the value as
   // being of the new, wider type.
   if (ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) {
-    if (CE->getCastKind() == CK_NoOp)
+    if (CE->getCastKind() == CK_NoOp || CE->getCastKind() == CK_LValueToRValue)
       return GetExprRange(C, CE->getSubExpr(), MaxWidth);
 
     IntRange OutputTypeRange = IntRange::forValueOfType(C, CE->getType());
index cd973d4885c7c141af470c4d597a8e3efe4bb01d..03aebb3a04620a425ac3622e615c23542f3e268c 100644 (file)
@@ -327,3 +327,9 @@ void test10(void) {
   b = (si == (ui = sl)); // expected-warning {{comparison of integers of different signs: 'int' and 'unsigned int'}}
   b = (si == (ui = sl&15));
 }
+
+// PR11572
+struct test11S { unsigned x : 30; };
+int test11(unsigned y, struct test11S *p) {
+  return y > (p->x >> 24); // no-warning
+}