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}} }