]> granicus.if.org Git - clang/commitdiff
Fix crash on invalid initialization with std::initializer_list
authorReid Kleckner <rnk@google.com>
Wed, 9 Dec 2015 23:18:38 +0000 (23:18 +0000)
committerReid Kleckner <rnk@google.com>
Wed, 9 Dec 2015 23:18:38 +0000 (23:18 +0000)
It is possible for CheckListElementTypes to fail without filling in any
initializer list elements.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255176 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp

index 0f60ad10a3e3398cfad995df05698eb52a28cc6b..ba1f140a9e1a69002a1b43264b74c280ad4e646a 100644 (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);
index 3d119643710ea76af944a2bef76da450415b1213..060a0f236b4e787a903f52ba6449c3464a8aad6a 100644 (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) {});
+  }
+}