Fix crash on invalid initialization with std::initializer_list

It is possible for CheckListElementTypes to fail without filling in any
initializer list elements.

llvm-svn: 255176
This commit is contained in:
Reid Kleckner
2015-12-09 23:18:38 +00:00
parent 5d2f7cfd44
commit 4a09e8872f
2 changed files with 27 additions and 1 deletions

View File

@@ -805,7 +805,8 @@ void InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity,
unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
// Update the structured sub-object initializer so that it's ending
// range corresponds with the end of the last initializer it used.
if (EndIndex < ParentIList->getNumInits()) {
if (EndIndex < ParentIList->getNumInits() &&
ParentIList->getInit(EndIndex)) {
SourceLocation EndLoc
= ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
StructuredSubobjectInitList->setRBraceLoc(EndLoc);

View File

@@ -284,3 +284,28 @@ namespace ParameterPackNestedInitializerLists_PR23904c3 {
void foo() { f({{0}}, {{'\0'}}); }
}
namespace update_rbrace_loc_crash {
// We used to crash-on-invalid on this example when updating the right brace
// location.
template <typename T, T>
struct A {};
template <typename T, typename F, int... I>
std::initializer_list<T> ExplodeImpl(F p1, A<int, I...>) {
// expected-error@+1 {{reference to type 'const update_rbrace_loc_crash::Incomplete' could not bind to an rvalue of type 'void'}}
return {p1(I)...};
}
template <typename T, int N, typename F>
void Explode(F p1) {
// expected-note@+1 {{in instantiation of function template specialization}}
ExplodeImpl<T>(p1, A<int, N>());
}
class Incomplete;
struct ContainsIncomplete {
const Incomplete &obstacle;
};
void f() {
// expected-note@+1 {{in instantiation of function template specialization}}
Explode<ContainsIncomplete, 4>([](int) {});
}
}