]> granicus.if.org Git - clang/commitdiff
PR11410: Extend diagnostic to cover all cases of aggregate initialization, not
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 3 Jun 2014 07:28:54 +0000 (07:28 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 3 Jun 2014 07:28:54 +0000 (07:28 +0000)
just the extremely specific case of a trailing array element that couldn't be
initialized because the default constructor for the element type is deleted.

Also reword the diagnostic to better match our other context diagnostics and to
prepare for the implementation of core issue 1070.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaInit.cpp
test/SemaCXX/cxx0x-initializer-constructor.cpp
test/SemaCXX/dcl_init_aggr.cpp
test/SemaCXX/new-delete-cxx0x.cpp

index 175a5a94a6cacbe1a2c957dd0a4561086ef928ab..b6f36d49db2a3cbc5471b4c8f7ae5470be006bf5 100644 (file)
@@ -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<
index 0dd040faff026711417c9f510925b75f03b6c117..db811456e2ea5d7fbefad82a04af72719d51ae02 100644 (file)
@@ -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;
       }
index 47afead305cbf7142be94f68823913a102964694..2dea40c0bd4f403eb05bef33509625c88c3be90f 100644 (file)
@@ -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}}
 }
index 8c5e654fca2eff87b1ca754cb909489e55044a4b..432c116466111c0a87c88bc2c0f7f3aa141a7752 100644 (file)
@@ -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 { };
index c404faba2a251622febefde1d7ec77401200b401..899cb4cda87a29efefe11c33beaefaf18180e26f 100644 (file)
@@ -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}}
 }