diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td
index 175a5a94a6cacbe1a2c957dd0a4561086ef928ab..b6f36d49db2a3cbc5471b4c8f7ae5470be006bf5 100644
--- a/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -1490,9 +1490,9 @@ def warn_uninit_byref_blockvar_captured_by_block : Warning<
   InGroup<Uninitialized>, DefaultIgnore;
 def note_block_var_fixit_add_initialization : Note<
   "maybe you meant to use __block %0">;
-def note_omitted_element_default_constructed : Note<
-  "initializer list shorter than initialized object, omitted element was "
-  "implicitly default constructed">;
+def note_in_omitted_aggregate_initializer : Note<
+  "in implicit initialization of %select{array element %1|field %1}0 "
+  "with omitted initializer">;
 def note_var_fixit_add_initialization : Note<
   "initialize the variable %0 to silence this warning">;
 def note_uninit_fixit_remove_cond : Note<
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 0dd040faff026711417c9f510925b75f03b6c117..db811456e2ea5d7fbefad82a04af72719d51ae02 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -391,6 +391,9 @@ void InitListChecker::FillInValueInitForField(unsigned Init, FieldDecl *Field,
     InitializationSequence InitSeq(SemaRef, MemberEntity, Kind, None);
     if (!InitSeq) {
       InitSeq.Diagnose(SemaRef, MemberEntity, Kind, None);
+      SemaRef.Diag(Field->getLocation(),
+                   diag::note_in_omitted_aggregate_initializer)
+        << /*field*/1 << Field;
       hadError = true;
       return;
     }
@@ -505,11 +508,8 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity,
       InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, None);
       if (!InitSeq) {
         InitSeq.Diagnose(SemaRef, ElementEntity, Kind, None);
-        if (NumInits < NumElements &&
-            InitSeq.getFailureKind() ==
-              InitializationSequence::FK_ConstructorOverloadFailed &&
-            InitSeq.getFailedOverloadResult() == OverloadingResult::OR_Deleted)
-          SemaRef.Diag(Loc, diag::note_omitted_element_default_constructed);
+        SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer)
+          << /*array element*/0 << Init;
         hadError = true;
         return;
       }
diff --git a/test/SemaCXX/cxx0x-initializer-constructor.cpp b/test/SemaCXX/cxx0x-initializer-constructor.cpp
index 47afead305cbf7142be94f68823913a102964694..2dea40c0bd4f403eb05bef33509625c88c3be90f 100644
--- a/test/SemaCXX/cxx0x-initializer-constructor.cpp
+++ b/test/SemaCXX/cxx0x-initializer-constructor.cpp
@@ -378,11 +378,28 @@ namespace PR19729 {
 
 namespace PR11410 {
   struct A {
-    A() = delete; // expected-note {{deleted here}}
+    A() = delete; // expected-note 2{{deleted here}}
     A(int);
   };
 
   A a[3] = {
     {1}, {2}
-  }; // expected-error {{call to deleted constructor}} expected-note {{implicitly default constructed}}
+  }; // expected-error {{call to deleted constructor}} \
+        expected-note {{in implicit initialization of array element 2 with omitted initializer}}
+
+  struct B {
+    A a; // expected-note {{in implicit initialization of field 'a'}}
+  } b = { // expected-error {{call to deleted constructor}}
+  };
+
+  struct C {
+    C(int = 0); // expected-note 2{{candidate}}
+    C(float = 0); // expected-note 2{{candidate}}
+  };
+  C c[3] = {
+    0, 1
+  }; // expected-error {{ambiguous}} expected-note {{in implicit initialization of array element 2}}
+  C c2[3] = {
+    [0] = 1, [2] = 3
+  }; // expected-error {{ambiguous}} expected-note {{in implicit initialization of array element 1}}
 }
diff --git a/test/SemaCXX/dcl_init_aggr.cpp b/test/SemaCXX/dcl_init_aggr.cpp
index 8c5e654fca2eff87b1ca754cb909489e55044a4b..432c116466111c0a87c88bc2c0f7f3aa141a7752 100644
--- a/test/SemaCXX/dcl_init_aggr.cpp
+++ b/test/SemaCXX/dcl_init_aggr.cpp
@@ -46,7 +46,7 @@ struct NoDefaultConstructor { // expected-note 3 {{candidate constructor (the im
 };
 struct TooFewError { // expected-error{{implicit default constructor for}}
   int a;
-  NoDefaultConstructor nodef; // expected-note{{member is declared here}}
+  NoDefaultConstructor nodef; // expected-note{{member is declared here}} expected-note 2{{in implicit initialization of field 'nodef'}}
 };
 TooFewError too_few_okay = { 1, 1 };
 TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}}
@@ -54,7 +54,7 @@ TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}}
 TooFewError too_few_okay2[2] = { 1, 1 }; // expected-note{{implicit default constructor for 'TooFewError' first required here}}
 TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}}
 
-NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}}
+NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}}
 
 // C++ [dcl.init.aggr]p8
 struct Empty { };
diff --git a/test/SemaCXX/new-delete-cxx0x.cpp b/test/SemaCXX/new-delete-cxx0x.cpp
index c404faba2a251622febefde1d7ec77401200b401..899cb4cda87a29efefe11c33beaefaf18180e26f 100644
--- a/test/SemaCXX/new-delete-cxx0x.cpp
+++ b/test/SemaCXX/new-delete-cxx0x.cpp
@@ -2,8 +2,8 @@
 
 void ugly_news(int *ip) {
   // These are ill-formed according to one reading of C++98, and at the least
-  // have undefined behavior. But they're well-formed, and defined to throw
-  // std::bad_array_new_length, in C++11.
+  // have undefined behavior.
+  // FIXME: They're ill-formed in C++11.
   (void)new int[-1]; // expected-warning {{array size is negative}}
   (void)new int[2000000000]; // expected-warning {{array is too large}}
 }
@@ -22,5 +22,12 @@ struct T { // expected-note 2 {{not viable}}
 void fn() {
   (void) new int[2] {1, 2};
   (void) new S[2] {1, 2};
-  (void) new T[2] {1, 2}; // expected-error {{no matching constructor}}
+  // C++11 [expr.new]p19:
+  //   If the new-expression creates an object or an array of objects of class
+  //   type, access and ambiguity control are done for the allocation function,
+  //   the deallocation function (12.5), and the constructor (12.1).
+  //
+  // Note that this happens even if the array bound is constant and the
+  // initializer initializes every array element.
+  (void) new T[2] {1, 2}; // expected-error {{no matching constructor}} expected-note {{in implicit initialization of array element 2}}
 }