[cfe-commits] r86579 - in /cfe/trunk: 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 test/SemaCXX/value-initialization.cpp

Eli Friedman eli.friedman at gmail.com
Mon Nov 9 11:20:37 PST 2009


Author: efriedma
Date: Mon Nov  9 13:20:36 2009
New Revision: 86579

URL: http://llvm.org/viewvc/llvm-project?rev=86579&view=rev
Log:
Add additional note to mark the cause of synthesized constructors.  Mark
declaration invalid if the constructor can't be properly built.  Addresses
remaining review comments from Fariborz for r86500.


Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
    cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp
    cfe/trunk/test/SemaCXX/value-initialization.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=86579&r1=86578&r2=86579&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Nov  9 13:20:36 2009
@@ -433,6 +433,8 @@
 def note_field_decl : Note<"member is declared here">;
 def note_previous_class_decl : Note<
   "%0 declared here">;
+def note_ctor_synthesized_at : Note<
+  "implicit default constructor for %0 first required here">;
 def err_missing_default_ctor : Error<
   "%select{|implicit default }0constructor for %1 must explicitly initialize "
   "the %select{base class|member}2 %3 which does not have a default "

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=86579&r1=86578&r2=86579&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Nov  9 13:20:36 2009
@@ -1186,7 +1186,7 @@
                                                   NumArgs, C, IdLoc, RParenLoc);
 }
 
-void
+bool
 Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
                               CXXBaseOrMemberInitializer **Initializers,
                               unsigned NumInitializers,
@@ -1197,6 +1197,7 @@
   llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToInit;
   llvm::DenseMap<const void *, CXXBaseOrMemberInitializer*> AllBaseFields;
   bool HasDependentBaseInit = false;
+  bool HadError = false;
 
   for (unsigned i = 0; i < NumInitializers; i++) {
     CXXBaseOrMemberInitializer *Member = Initializers[i];
@@ -1258,6 +1259,7 @@
             << 0 << VBase->getType();
           Diag(VBaseDecl->getLocation(), diag::note_previous_class_decl)
             << Context.getTagDeclType(VBaseDecl);
+          HadError = true;
           continue;
         }
 
@@ -1307,6 +1309,7 @@
             << 0 << Base->getType();
           Diag(BaseDecl->getLocation(), diag::note_previous_class_decl)
             << Context.getTagDeclType(BaseDecl);
+          HadError = true;
           continue;
         }
 
@@ -1378,6 +1381,7 @@
         Diag(Field->getLocation(), diag::note_field_decl);
         Diag(RT->getDecl()->getLocation(), diag::note_previous_class_decl)
           << Context.getTagDeclType(RT->getDecl());
+        HadError = true;
         continue;
       }
       
@@ -1399,6 +1403,7 @@
           << (int)IsImplicitConstructor << Context.getTagDeclType(ClassDecl)
           << 1 << (*Field)->getDeclName();
         Diag((*Field)->getLocation(), diag::note_declared_at);
+        HadError = true;
       }
     }
     else if (FT->isReferenceType()) {
@@ -1406,12 +1411,14 @@
         << (int)IsImplicitConstructor << Context.getTagDeclType(ClassDecl)
         << 0 << (*Field)->getDeclName();
       Diag((*Field)->getLocation(), diag::note_declared_at);
+      HadError = true;
     }
     else if (FT.isConstQualified()) {
       Diag(Constructor->getLocation(), diag::err_unintialized_member_in_ctor)
         << (int)IsImplicitConstructor << Context.getTagDeclType(ClassDecl)
         << 1 << (*Field)->getDeclName();
       Diag((*Field)->getLocation(), diag::note_declared_at);
+      HadError = true;
     }
   }
 
@@ -1425,6 +1432,8 @@
     for (unsigned Idx = 0; Idx < NumInitializers; ++Idx)
       baseOrMemberInitializers[Idx] = AllToInit[Idx];
   }
+
+  return HadError;
 }
 
 static void *GetKeyForTopLevelField(FieldDecl *Field) {
@@ -2957,9 +2966,17 @@
           !Constructor->isUsed()) &&
     "DefineImplicitDefaultConstructor - call it for implicit default ctor");
 
-  SetBaseOrMemberInitializers(Constructor, 0, 0, true);
+  CXXRecordDecl *ClassDecl
+    = cast<CXXRecordDecl>(Constructor->getDeclContext());
+  assert(ClassDecl && "DefineImplicitDefaultConstructor - invalid constructor");
 
-  Constructor->setUsed();
+  if (SetBaseOrMemberInitializers(Constructor, 0, 0, true)) {
+    Diag(CurrentLocation, diag::note_ctor_synthesized_at)
+      << Context.getTagDeclType(ClassDecl);
+    Constructor->setInvalidDecl();
+  } else {
+    Constructor->setUsed();
+  }
   return;
 }
 

Modified: cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp?rev=86579&r1=86578&r2=86579&view=diff

==============================================================================
--- cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp (original)
+++ cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp Mon Nov  9 13:20:36 2009
@@ -26,7 +26,7 @@
   xih.g(); // okay
   xih.f(); // expected-note{{instantiation}}
   
-  X<IntHolder, int>::Inner inner;
+  X<IntHolder, int>::Inner inner; // expected-note {{first required here}}
   
   return X<IntHolder, int>::value; // expected-note{{instantiation}}
 }

Modified: cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp?rev=86579&r1=86578&r2=86579&view=diff

==============================================================================
--- cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp (original)
+++ cfe/trunk/test/SemaCXX/default-constructor-initializers.cpp Mon Nov  9 13:20:36 2009
@@ -11,7 +11,7 @@
 
 struct X3 : public X2 { // expected-error {{must explicitly initialize the base class 'struct X2'}}
 };
-X3 x3;
+X3 x3; // expected-note {{first required here}}
 
 
 struct X4 { // expected-error {{must explicitly initialize the member 'x2'}} \
@@ -20,7 +20,7 @@
   X2 & rx2; // expected-note {{declared at}}
 };
 
-X4 x4;
+X4 x4; // expected-note {{first required here}}
 
 
 struct Y1 { // has no implicit default constructor
@@ -52,5 +52,5 @@
   volatile int v1;
 };
 
-Z1 z1;
+Z1 z1; // expected-note {{first required here}}
 

Modified: cfe/trunk/test/SemaCXX/value-initialization.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/value-initialization.cpp?rev=86579&r1=86578&r2=86579&view=diff

==============================================================================
--- cfe/trunk/test/SemaCXX/value-initialization.cpp (original)
+++ cfe/trunk/test/SemaCXX/value-initialization.cpp Mon Nov  9 13:20:36 2009
@@ -6,5 +6,5 @@
 };
 
 int main () {
-      (void)A();
+      (void)A(); // expected-note {{first required here}}
 }





More information about the cfe-commits mailing list