summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2015-09-23 16:03:53 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2015-09-23 16:03:53 +0000
commitc4284e3aad1299adcbc66ffe02f632c79fd40663 (patch)
tree8a838abc00cb66741f6635a038e3515e4d61efdd
parentff08e926ba8dee4111adf7f7df72905de7a610ea (diff)
downloadbcm5719-llvm-c4284e3aad1299adcbc66ffe02f632c79fd40663.tar.gz
bcm5719-llvm-c4284e3aad1299adcbc66ffe02f632c79fd40663.zip
[Sema] Don't create an invalid source range for overlong initializer lists.
We took both source locations from the end of the initializer list what the code below doesn't expect. This can lead to a crash when rendering the diagnostic (PR24816). Assert that we have more than one element in a scalar initializer with too many elements. llvm-svn: 248391
-rw-r--r--clang/lib/Sema/SemaInit.cpp6
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp4
2 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index de11666747a..74db24f28dc 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -7047,10 +7047,12 @@ bool InitializationSequence::Diagnose(Sema &S,
SourceRange R;
auto *InitList = dyn_cast<InitListExpr>(Args[0]);
- if (InitList && InitList->getNumInits() == 1)
+ if (InitList && InitList->getNumInits() >= 1) {
R = SourceRange(InitList->getInit(0)->getLocEnd(), InitList->getLocEnd());
- else
+ } else {
+ assert(Args.size() > 1 && "Expected multiple initializers!");
R = SourceRange(Args.front()->getLocEnd(), Args.back()->getLocEnd());
+ }
R.setBegin(S.getLocForEndOfToken(R.getBegin()));
if (Kind.isCStyleOrFunctionalCast())
diff --git a/clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp b/clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp
index 0e9a97d5bb0..1b01a351f78 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp
@@ -129,3 +129,7 @@ namespace array_addressof {
using T = int[5];
T *p = &T{1,2,3,4,5}; // expected-error {{taking the address of a temporary object of type 'T' (aka 'int [5]')}}
}
+
+namespace PR24816 {
+ struct { int i; } ne = {{0, 1}}; // expected-error{{excess elements in scalar initializer}}
+}
OpenPOWER on IntegriCloud