summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikola Smiljanic <popizdeh@gmail.com>2014-05-30 01:28:28 +0000
committerNikola Smiljanic <popizdeh@gmail.com>2014-05-30 01:28:28 +0000
commite27de09de83d902078eff15f1018494b53ac119c (patch)
tree8753a4e6339755e7ab9374ea4538e9787e5af147
parentcc28bc1816460cb9225e89a213d608dbfd0e8735 (diff)
downloadbcm5719-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.td3
-rw-r--r--clang/lib/Sema/SemaInit.cpp11
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-constructor.cpp11
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}}
+}
OpenPOWER on IntegriCloud