From: Nikola Smiljanic Date: Fri, 30 May 2014 01:28:28 +0000 (+0000) Subject: PR11410 - Confusing diagnostic when trailing array element tries to call deleted... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fb84f0cf5c1edebbaad4ebc920f310d7754a4861;p=clang PR11410 - Confusing diagnostic when trailing array element tries to call deleted default constructor git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209869 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 209f4259b9..758bf23c30 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1490,6 +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_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 9ef43cc81f..0dd040faff 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -429,9 +429,6 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity, bool &RequiresSecondPass) { assert((ILE->getType() != SemaRef.Context.VoidTy) && "Should not have void type"); - SourceLocation Loc = ILE->getLocStart(); - if (ILE->getSyntacticForm()) - Loc = ILE->getSyntacticForm()->getLocStart(); if (const RecordType *RType = ILE->getType()->getAs()) { const RecordDecl *RDecl = RType->getDecl(); @@ -489,6 +486,9 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity, } else ElementType = ILE->getType(); + SourceLocation Loc = ILE->getLocEnd(); + if (ILE->getSyntacticForm()) + Loc = ILE->getSyntacticForm()->getLocEnd(); for (unsigned Init = 0; Init != NumElements; ++Init) { if (hadError) @@ -505,6 +505,11 @@ 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); hadError = true; return; } diff --git a/test/SemaCXX/cxx0x-initializer-constructor.cpp b/test/SemaCXX/cxx0x-initializer-constructor.cpp index 75b2341f3b..47afead305 100644 --- a/test/SemaCXX/cxx0x-initializer-constructor.cpp +++ b/test/SemaCXX/cxx0x-initializer-constructor.cpp @@ -375,3 +375,14 @@ namespace PR19729 { }; B *p = new ({123}) B; } + +namespace PR11410 { + struct A { + A() = delete; // expected-note {{deleted here}} + A(int); + }; + + A a[3] = { + {1}, {2} + }; // expected-error {{call to deleted constructor}} expected-note {{implicitly default constructed}} +}