[cfe-commits] r102162 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/SemaCXX/illegal-member-initialization.cpp

Anders Carlsson andersca at mac.com
Thu Apr 22 19:15:47 PDT 2010


Author: andersca
Date: Thu Apr 22 21:15:47 2010
New Revision: 102162

URL: http://llvm.org/viewvc/llvm-project?rev=102162&view=rev
Log:
Factor code to initialize an implicit member out into a separate function.

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=102162&r1=102161&r2=102162&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Apr 22 21:15:47 2010
@@ -1432,8 +1432,7 @@
 }
 
 static bool
-BuildImplicitBaseInitializer(Sema &SemaRef, 
-                             const CXXConstructorDecl *Constructor,
+BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
                              CXXBaseSpecifier *BaseSpec,
                              bool IsInheritedVirtualBase,
                              CXXBaseOrMemberInitializer *&CXXBaseInit) {
@@ -1465,6 +1464,60 @@
   return false;
 }
 
+static bool
+BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
+                               FieldDecl *Field,
+                               CXXBaseOrMemberInitializer *&CXXMemberInit) {
+  QualType FieldBaseElementType = 
+    SemaRef.Context.getBaseElementType(Field->getType());
+  
+  if (FieldBaseElementType->isReferenceType()) {
+    SemaRef.Diag(Constructor->getLocation(), 
+                 diag::err_uninitialized_member_in_ctor)
+      << (int)Constructor->isImplicit() 
+      << SemaRef.Context.getTagDeclType(Constructor->getParent())
+      << 0 << Field->getDeclName();
+    SemaRef.Diag(Field->getLocation(), diag::note_declared_at);
+    return true;
+  }
+
+  if (FieldBaseElementType.isConstQualified()) {
+    SemaRef.Diag(Constructor->getLocation(), 
+                 diag::err_uninitialized_member_in_ctor)
+      << (int)Constructor->isImplicit() 
+      << SemaRef.Context.getTagDeclType(Constructor->getParent())
+      << 1 << Field->getDeclName();
+    SemaRef.Diag(Field->getLocation(), diag::note_declared_at);
+    return true;
+  }
+
+  if (FieldBaseElementType->isRecordType()) {
+    InitializedEntity InitEntity = InitializedEntity::InitializeMember(Field);
+    InitializationKind InitKind
+      = InitializationKind::CreateDefault(Constructor->getLocation());
+    
+    InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, 0, 0);
+    Sema::OwningExprResult MemberInit = 
+      InitSeq.Perform(SemaRef, InitEntity, InitKind, 
+                      Sema::MultiExprArg(SemaRef, 0, 0));
+    MemberInit = SemaRef.MaybeCreateCXXExprWithTemporaries(move(MemberInit));
+    if (MemberInit.isInvalid())
+      return true;
+    
+    CXXMemberInit =
+      new (SemaRef.Context) CXXBaseOrMemberInitializer(SemaRef.Context,
+                                                       Field, SourceLocation(),
+                                                       SourceLocation(),
+                                                      MemberInit.takeAs<Expr>(),
+                                                       SourceLocation());
+    return false;
+  }
+  
+  // Nothing to initialize.
+  CXXMemberInit = 0;
+  return false;
+}
+                               
 bool
 Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
                                   CXXBaseOrMemberInitializer **Initializers,
@@ -1585,45 +1638,15 @@
     if (AnyErrors)
       continue;
     
-    QualType FT = Context.getBaseElementType((*Field)->getType());
-    if (FT->getAs<RecordType>()) {
-      InitializedEntity InitEntity
-        = InitializedEntity::InitializeMember(*Field);
-      InitializationKind InitKind
-        = InitializationKind::CreateDefault(Constructor->getLocation());
-
-      InitializationSequence InitSeq(*this, InitEntity, InitKind, 0, 0);
-      OwningExprResult MemberInit = InitSeq.Perform(*this, InitEntity, InitKind,
-                                                    MultiExprArg(*this, 0, 0));
-      MemberInit = MaybeCreateCXXExprWithTemporaries(move(MemberInit));
-      if (MemberInit.isInvalid()) {
-        HadError = true;
-        continue;
-      }
-
-      CXXBaseOrMemberInitializer *Member =
-        new (Context) CXXBaseOrMemberInitializer(Context,
-                                                 *Field, SourceLocation(),
-                                                 SourceLocation(),
-                                                 MemberInit.takeAs<Expr>(),
-                                                 SourceLocation());
-
-      AllToInit.push_back(Member);
-    }
-    else if (FT->isReferenceType()) {
-      Diag(Constructor->getLocation(), diag::err_uninitialized_member_in_ctor)
-        << (int)Constructor->isImplicit() << Context.getTagDeclType(ClassDecl)
-        << 0 << (*Field)->getDeclName();
-      Diag((*Field)->getLocation(), diag::note_declared_at);
-      HadError = true;
-    }
-    else if (FT.isConstQualified()) {
-      Diag(Constructor->getLocation(), diag::err_uninitialized_member_in_ctor)
-        << (int)Constructor->isImplicit() << Context.getTagDeclType(ClassDecl)
-        << 1 << (*Field)->getDeclName();
-      Diag((*Field)->getLocation(), diag::note_declared_at);
+    CXXBaseOrMemberInitializer *Member;
+    if (BuildImplicitMemberInitializer(*this, Constructor, *Field, Member)) {
       HadError = true;
+      continue;
     }
+    
+    // If the member doesn't need to be initialized, it will be null.
+    if (Member)
+      AllToInit.push_back(Member);
   }
 
   NumInitializers = AllToInit.size();

Modified: cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp?rev=102162&r1=102161&r2=102162&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp (original)
+++ cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp Thu Apr 22 21:15:47 2010
@@ -17,7 +17,7 @@
    int &value; // expected-note{{declared at}}
    const int cvalue; // expected-note{{declared at}}
    B& b; // expected-note{{declared at}}
-   const B cb; // expected-note{{declared here}}
+   const B cb; // expected-note{{declared at}}
 };
 
 





More information about the cfe-commits mailing list