]> granicus.if.org Git - clang/commitdiff
Fix assertion failure on -Warray-bounds for 32-bit builds of Clang.
authorTed Kremenek <kremenek@apple.com>
Fri, 18 Feb 2011 02:27:00 +0000 (02:27 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 18 Feb 2011 02:27:00 +0000 (02:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125821 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/SemaCXX/array-bounds.cpp

index 6b1013d82ddd57b4de94b1501b01c5ff5cab50b5..2cddac5f6674cddd4740394eee1ab78a7e4532a6 100644 (file)
@@ -3109,11 +3109,14 @@ void Sema::CheckArrayAccess(const clang::ArraySubscriptExpr *E) {
     return;
 
   if (!index.isNegative()) {
-    const llvm::APInt &size = ArrayTy->getSize();
+    llvm::APInt size = ArrayTy->getSize();
     if (!size.isStrictlyPositive())
       return;
     if (size.getBitWidth() > index.getBitWidth())
       index = index.sext(size.getBitWidth());
+    else if (size.getBitWidth() < index.getBitWidth())
+      size = size.sext(index.getBitWidth());
+
     if (index.slt(size))
       return;
 
index 8c22865e79d49e59e6f305046c00047ec8783bfd..0286c01d85ffddaede0e8ec899cfd81b152159df 100644 (file)
@@ -85,3 +85,9 @@ int test_no_warn_macro_unreachable() {
          ARR_IN_MACRO(1, arr, SIZE); // expected-warning{{array index of '10' indexes past the end of an array (that contains 10 elements)}}
 }
 
+// This exhibited an assertion failure for a 32-bit build of Clang.
+int test_pr9240() {
+  short array[100]; // expected-note {{array 'array' declared here}}
+  return array[(unsigned long long) 100]; // expected-warning {{array index of '100' indexes past the end of an array (that contains 100 elements)}}
+}
+