summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-07-23 23:24:25 +0000
committerReid Kleckner <reid@kleckner.net>2014-07-23 23:24:25 +0000
commit142dd46c2a3d820abbb021225b61c9f13633deff (patch)
tree917c3e4b96959767ba2b8589885ce6335b72b00a /clang
parentedc60376edcc86bbfac132306581b10f3948af69 (diff)
downloadbcm5719-llvm-142dd46c2a3d820abbb021225b61c9f13633deff.tar.gz
bcm5719-llvm-142dd46c2a3d820abbb021225b61c9f13633deff.zip
Add a missing Invalid check to SubobjectDesignator::isOnePastEnd()
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. llvm-svn: 213816
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ExprConstant.cpp2
-rw-r--r--clang/test/SemaCXX/warn-global-constructors.cpp6
2 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index b1d22658728..11789aa037f 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -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 &&
diff --git a/clang/test/SemaCXX/warn-global-constructors.cpp b/clang/test/SemaCXX/warn-global-constructors.cpp
index 90d8558666c..856826414a8 100644
--- a/clang/test/SemaCXX/warn-global-constructors.cpp
+++ b/clang/test/SemaCXX/warn-global-constructors.cpp
@@ -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;
+}
OpenPOWER on IntegriCloud