diff options
author | Nikola Smiljanic <popizdeh@gmail.com> | 2014-05-30 01:28:28 +0000 |
---|---|---|
committer | Nikola Smiljanic <popizdeh@gmail.com> | 2014-05-30 01:28:28 +0000 |
commit | e27de09de83d902078eff15f1018494b53ac119c (patch) | |
tree | 8753a4e6339755e7ab9374ea4538e9787e5af147 | |
parent | cc28bc1816460cb9225e89a213d608dbfd0e8735 (diff) | |
download | bcm5719-llvm-e27de09de83d902078eff15f1018494b53ac119c.tar.gz bcm5719-llvm-e27de09de83d902078eff15f1018494b53ac119c.zip |
PR11410 - Confusing diagnostic when trailing array element tries to call deleted default constructor
llvm-svn: 209869
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 11 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx0x-initializer-constructor.cpp | 11 |
3 files changed, 22 insertions, 3 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 209f4259b93..758bf23c30d 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1490,6 +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_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 9ef43cc81f6..0dd040faff0 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/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<RecordType>()) { 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/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp index 75b2341f3b6..47afead305c 100644 --- a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp +++ b/clang/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}} +} |