Diagnose multiple initialzation of data-member/base 
in the ctor-initializer list. More to come.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74465 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index e9a585f..fffa66c 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -766,6 +766,24 @@
     Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
     return;
   }
+  llvm::DenseSet<uintptr_t>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());
+    else {
+      if (FieldDecl *Field = Member->getMember())
+        Diag(ColonLoc, diag::error_multiple_mem_initialization)
+          << Field->getNameAsString();
+      else if (Type *BaseClass = Member->getBaseClass())
+        Diag(ColonLoc, diag::error_multiple_base_initialization)
+          << BaseClass->getDesugaredType(true);
+      else
+        assert(false && "ActOnMemInitializers - neither field or base");
+    }
+  }
 }
 
 namespace {