]> granicus.if.org Git - clang/commitdiff
Add a missing Invalid check to SubobjectDesignator::isOnePastEnd()
authorReid Kleckner <reid@kleckner.net>
Wed, 23 Jul 2014 23:24:25 +0000 (23:24 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 23 Jul 2014 23:24:25 +0000 (23:24 +0000)
The class seems to have an invariant that Entries is non-empty if
Invalid is false.  It appears this method was previously private, and
all internal uses checked Invalid.  Now there is an external caller, so
check Invalid to avoid array OOB underflow.

Fixes PR20420.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213816 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/SemaCXX/warn-global-constructors.cpp

index b1d22658728a3fe318ce879412bcec10edf1eafb..11789aa037f0f2199b40e9f8404f8316136219dd 100644 (file)
@@ -201,6 +201,8 @@ namespace {
 
     /// Determine whether this is a one-past-the-end pointer.
     bool isOnePastTheEnd() const {
+      if (Invalid)
+        return false;
       if (IsOnePastTheEnd)
         return true;
       if (MostDerivedArraySize &&
index 90d8558666c3b7a7a83f54bf520e6b92fbb8a7d8..856826414a8b3e284802fe3a104f15b1323cf059 100644 (file)
@@ -120,3 +120,9 @@ namespace pr19253 {
   };
   E e;
 }
+
+namespace pr20420 {
+// No warning is expected. This used to crash.
+void *array_storage[1];
+const int &global_reference = *(int *)array_storage;
+}