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