A more detailed diagnosis of ill-formed ctor-initializer
list.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74480 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index fffa66c..e59236c 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -688,7 +688,8 @@
 
   if (Member) {
     // FIXME: Perform direct initialization of the member.
-    return new CXXBaseOrMemberInitializer(Member, (Expr **)Args, NumArgs);
+    return new CXXBaseOrMemberInitializer(Member, (Expr **)Args, NumArgs, 
+                                          IdLoc);
   }
 
   // It didn't name a member, so see if it names a class.
@@ -750,7 +751,8 @@
     return Diag(IdLoc, diag::err_base_init_direct_and_virtual)
       << MemberOrBase << SourceRange(IdLoc, RParenLoc);
 
-  return new CXXBaseOrMemberInitializer(BaseType, (Expr **)Args, NumArgs);
+  return new CXXBaseOrMemberInitializer(BaseType, (Expr **)Args, NumArgs, 
+                                        IdLoc);
 }
 
 void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, 
@@ -766,22 +768,27 @@
     Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
     return;
   }
-  llvm::DenseSet<uintptr_t>Members;
+  llvm::DenseMap<uintptr_t, CXXBaseOrMemberInitializer *>Members;
   
   for (unsigned i = 0; i < NumMemInits; i++) {
     CXXBaseOrMemberInitializer *Member = 
       static_cast<CXXBaseOrMemberInitializer*>(MemInits[i]);
-    if (Members.count(Member->getBaseOrMember()) == 0)
-      Members.insert(Member->getBaseOrMember());
+    CXXBaseOrMemberInitializer *&PrevMember = Members[Member->getBaseOrMember()];
+    if (!PrevMember)
+      PrevMember = Member;
     else {
       if (FieldDecl *Field = Member->getMember())
-        Diag(ColonLoc, diag::error_multiple_mem_initialization)
-          << Field->getNameAsString();
+        Diag(Member->getSourceLocation(), 
+             diag::error_multiple_mem_initialization)
+        << Field->getNameAsString();
       else if (Type *BaseClass = Member->getBaseClass())
-        Diag(ColonLoc, diag::error_multiple_base_initialization)
+        Diag(Member->getSourceLocation(), 
+             diag::error_multiple_base_initialization)
           << BaseClass->getDesugaredType(true);
       else
         assert(false && "ActOnMemInitializers - neither field or base");
+      Diag(PrevMember->getSourceLocation(), diag::note_previous_initializer) 
+        << 0;
     }
   }
 }