summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-10-08 22:15:49 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-10-08 22:15:49 +0000
commit8ae5b0a18b9e564891f6e6bdd25e66dbe7d6a4a7 (patch)
tree9c52ef08583db53f947fc7c973c6c544a0bf8619
parent01249503fee8570f3d233accac5ec38cfb54ea9c (diff)
downloadbcm5719-llvm-8ae5b0a18b9e564891f6e6bdd25e66dbe7d6a4a7.tar.gz
bcm5719-llvm-8ae5b0a18b9e564891f6e6bdd25e66dbe7d6a4a7.zip
Fix up error reporting when object cannot be constructed
because of missing default constructor of a member. Fixes pr5154. llvm-svn: 83583
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td3
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp5
-rw-r--r--clang/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp2
-rw-r--r--clang/test/SemaCXX/default-constructor-initializers.cpp6
4 files changed, 9 insertions, 7 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 9d39389f519..fdd644235e5 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -720,8 +720,9 @@ def err_param_default_argument_member_template_redecl : Error<
"default arguments cannot be added to an out-of-line definition of a member "
"of a %select{class template|class template partial specialization|nested "
"class in a template}0">;
+def note_field_decl : Note<"member is declared here">;
def err_defining_default_ctor : Error<
- "cannot define the implicit default constructor for %0, because %select{base class|member}1 "
+ "cannot define the implicit default constructor for %0, because %select{base class|member's type}1 "
"%2 does not have any default constructor">;
def note_previous_class_decl : Note<
"%0 declared here">;
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index e00cbf8978b..abe20408ccd 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -2852,7 +2852,7 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
MarkDeclarationReferenced(CurrentLocation, BaseCtor);
else {
Diag(CurrentLocation, diag::err_defining_default_ctor)
- << Context.getTagDeclType(ClassDecl) << 1
+ << Context.getTagDeclType(ClassDecl) << 0
<< Context.getTagDeclType(BaseClassDecl);
Diag(BaseClassDecl->getLocation(), diag::note_previous_class_decl)
<< Context.getTagDeclType(BaseClassDecl);
@@ -2874,8 +2874,9 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
MarkDeclarationReferenced(CurrentLocation, FieldCtor);
else {
Diag(CurrentLocation, diag::err_defining_default_ctor)
- << Context.getTagDeclType(ClassDecl) << 0 <<
+ << Context.getTagDeclType(ClassDecl) << 1 <<
Context.getTagDeclType(FieldClassDecl);
+ Diag((*Field)->getLocation(), diag::note_field_decl);
Diag(FieldClassDecl->getLocation(), diag::note_previous_class_decl)
<< Context.getTagDeclType(FieldClassDecl);
err = true;
diff --git a/clang/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp b/clang/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
index a09cccd1fd0..8d91068f9b9 100644
--- a/clang/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
+++ b/clang/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
@@ -13,7 +13,7 @@ struct X { // expected-note{{here}}
void g() { }
struct Inner {
- T value;
+ T value; // expected-note {{member is declared here}}
};
static T value;
diff --git a/clang/test/SemaCXX/default-constructor-initializers.cpp b/clang/test/SemaCXX/default-constructor-initializers.cpp
index a6db6a7d9a4..6cbb978dbb9 100644
--- a/clang/test/SemaCXX/default-constructor-initializers.cpp
+++ b/clang/test/SemaCXX/default-constructor-initializers.cpp
@@ -11,15 +11,15 @@ struct X2 : X1 { // expected-note {{'struct X2' declared here}} \
struct X3 : public X2 {
};
-X3 x3; // expected-error {{cannot define the implicit default constructor for 'struct X3', because member 'struct X2' does not have any default constructor}}
+X3 x3; // expected-error {{cannot define the implicit default constructor for 'struct X3', because base class 'struct X2' does not have any default constructor}}
struct X4 {
- X2 x2;
+ X2 x2; // expected-note {{member is declared here}}
X2 & rx2; // expected-note {{declared at}}
};
-X4 x4; // expected-error {{cannot define the implicit default constructor for 'struct X4', because base class 'struct X2' does not have any default constructor}} \
+X4 x4; // expected-error {{cannot define the implicit default constructor for 'struct X4', because member's type 'struct X2' does not have any default constructor}} \
// expected-error {{cannot define the implicit default constructor for 'struct X4', because reference member 'rx2' cannot be default-initialized}}
OpenPOWER on IntegriCloud