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);
|
unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
|
||||||
// Update the structured sub-object initializer so that it's ending
|
// Update the structured sub-object initializer so that it's ending
|
||||||
// range corresponds with the end of the last initializer it used.
|
// range corresponds with the end of the last initializer it used.
|
||||||
if (EndIndex < ParentIList->getNumInits()) {
|
if (EndIndex < ParentIList->getNumInits() &&
|
||||||
|
ParentIList->getInit(EndIndex)) {
|
||||||
SourceLocation EndLoc
|
SourceLocation EndLoc
|
||||||
= ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
|
= ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
|
||||||
StructuredSubobjectInitList->setRBraceLoc(EndLoc);
|
StructuredSubobjectInitList->setRBraceLoc(EndLoc);
|
||||||
|
|||||||
@@ -284,3 +284,28 @@ namespace ParameterPackNestedInitializerLists_PR23904c3 {
|
|||||||
|
|
||||||
void foo() { f({{0}}, {{'\0'}}); }
|
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