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:
@@ -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);
|
||||
|
||||
@@ -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) {});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user