diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 175a5a94a6ca..b6f36d49db2a 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1490,9 +1490,9 @@ def warn_uninit_byref_blockvar_captured_by_block : Warning< InGroup, 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/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 0dd040faff02..db811456e2ea 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/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/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp index 47afead305cb..2dea40c0bd4f 100644 --- a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp +++ b/clang/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/clang/test/SemaCXX/dcl_init_aggr.cpp b/clang/test/SemaCXX/dcl_init_aggr.cpp index 8c5e654fca2e..432c11646611 100644 --- a/clang/test/SemaCXX/dcl_init_aggr.cpp +++ b/clang/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/clang/test/SemaCXX/new-delete-cxx0x.cpp b/clang/test/SemaCXX/new-delete-cxx0x.cpp index c404faba2a25..899cb4cda87a 100644 --- a/clang/test/SemaCXX/new-delete-cxx0x.cpp +++ b/clang/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}} }