]> granicus.if.org Git - clang/commitdiff
Fix up error reporting when object cannot be constructed
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 8 Oct 2009 22:15:49 +0000 (22:15 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 8 Oct 2009 22:15:49 +0000 (22:15 +0000)
because of missing default constructor of a member.
Fixes pr5154.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83583 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
test/SemaCXX/default-constructor-initializers.cpp

index 9d39389f519b7b99dae1e660ce0c31d4419b6705..fdd644235e5927ef10000a1f485da090621eccd8 100644 (file)
@@ -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">;
index e00cbf8978bdab81ac7fc986a82000ab1d9c110b..abe20408ccd5e4ac8da696f52d94fb739906203e 100644 (file)
@@ -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;
index a09cccd1fd044c8706e7cf74e1077fc3a14aa365..8d91068f9b99384c108d9f630a860dff0581fa77 100644 (file)
@@ -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;
index a6db6a7d9a4b6e29d8e815f957ac3143d02f822a..6cbb978dbb998e967f7459f72bf9a66ea5b35f15 100644 (file)
@@ -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}}