Index: lib/Sema/SemaInit.cpp
===================================================================
--- lib/Sema/SemaInit.cpp	(revision 190297)
+++ lib/Sema/SemaInit.cpp	(working copy)
@@ -6983,6 +6983,30 @@
   return !Seq.Failed();
 }
 
+const Type*
+Sema::ValidateCopyInitialization(const InitializedEntity &Entity,
+                                 ExprResult &Init,
+                                 InitializationSequence &Seq,
+                                 InitializationKind &Kind) {
+  QualType QualEn = Entity.getType();
+  const Type *EnType = QualEn.getTypePtr();
+  if (ccInitMap.count(EnType)) {
+    Expr *InitM = Init.get();
+    OverloadCandidateSet &CandidateSet = Seq.getFailedCandidateSet();
+
+    Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init)
+          << QualEn;
+    CandidateSet.NoteCandidates(*this, OCD_AllCandidates,
+                           llvm::makeArrayRef(&InitM, 1));
+
+    return 0;
+  }
+
+  if (!(EnType->isBuiltinType()))
+    ccInitMap[EnType] = 1;
+return EnType;
+}
+
 ExprResult
 Sema::PerformCopyInitialization(const InitializedEntity &Entity,
                                 SourceLocation EqualLoc,
@@ -7004,8 +7028,15 @@
   InitializationSequence Seq(*this, Entity, Kind, InitE);
   Init.release();
 
+  const Type *EnType;
+
+  if(!(EnType = ValidateCopyInitialization(Entity, Init, Seq, Kind)))
+    return ExprError();
+
   ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
 
+  ccInitMap.erase(EnType);
+
   if (!Result.isInvalid() && TopLevelOfInitList)
     DiagnoseNarrowingInInitList(*this, Seq, Entity.getType(),
                                 InitE, Result.get());
Index: include/clang/Sema/Sema.h
===================================================================
--- include/clang/Sema/Sema.h	(revision 190297)
+++ include/clang/Sema/Sema.h	(working copy)
@@ -205,6 +205,7 @@
   Sema(const Sema &) LLVM_DELETED_FUNCTION;
   void operator=(const Sema &) LLVM_DELETED_FUNCTION;
   mutable const TargetAttributesSema* TheTargetAttributesSema;
+  llvm::DenseMap<const Type*, unsigned> ccInitMap;
 
   ///\brief Source of additional semantic information.
   ExternalSemaSource *ExternalSource;
@@ -1970,6 +1971,10 @@
 
   bool CanPerformCopyInitialization(const InitializedEntity &Entity,
                                     ExprResult Init);
+  const Type* ValidateCopyInitialization(const InitializedEntity &Entity,
+                                         ExprResult &Init,
+                                         InitializationSequence &Seq,
+                                         InitializationKind &Kind);
   ExprResult PerformCopyInitialization(const InitializedEntity &Entity,
                                        SourceLocation EqualLoc,
                                        ExprResult Init,
