Index: lib/Sema/SemaInit.cpp
===================================================================
--- lib/Sema/SemaInit.cpp	(revision 193400)
+++ lib/Sema/SemaInit.cpp	(working copy)
@@ -28,6 +28,13 @@
 #include <map>
 using namespace clang;
 
+int InitListUserConv = 0;
+static bool TryUserDefinedConversion(Sema &S,
+                                     const InitializedEntity &Entity,
+                                     const InitializationKind &Kind,
+                                     Expr *Initializer,
+                                     InitializationSequence &Sequence,
+                                     bool TopLevelOfInitList);
 //===----------------------------------------------------------------------===//
 // Sema Initialization Checking
 //===----------------------------------------------------------------------===//
@@ -3095,6 +3102,7 @@
   assert((!InitListSyntax || (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
          "InitListSyntax must come with a single initializer list argument.");
 
+  MultiExprArg Args1 = Args;
   // The type we're constructing needs to be complete.
   if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) {
     Sequence.setIncompleteTypeFailure(DestType);
@@ -3165,6 +3173,20 @@
                                         InitListSyntax);
   }
   if (Result) {
+    if(Args1.size() == 1 && (InitListUserConv == 0)) {
+      if ( InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Args1[0])) {
+        if((InitList->getNumInits() == 1)) {
+          Expr *InitM = InitList->getInit(0);	
+          InitListUserConv = 2;
+          if((TryUserDefinedConversion(S, Entity, Kind, InitM, Sequence,1))) {
+            InitListUserConv = 1;
+            return;
+          }
+          else
+            InitListUserConv = 0;
+          }
+        } 
+      }
     Sequence.SetOverloadFailure(InitListSyntax ?
                       InitializationSequence::FK_ListConstructorOverloadFailed :
                       InitializationSequence::FK_ConstructorOverloadFailed,
@@ -4044,7 +4066,7 @@
 /// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]),
 /// which enumerates all conversion functions and performs overload resolution
 /// to select the best.
-static void TryUserDefinedConversion(Sema &S,
+static bool TryUserDefinedConversion(Sema &S,
                                      const InitializedEntity &Entity,
                                      const InitializationKind &Kind,
                                      Expr *Initializer,
@@ -4059,7 +4081,8 @@
   // Build the candidate set directly in the initialization sequence
   // structure, so that it will persist if we fail.
   OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
-  CandidateSet.clear();
+  if(InitListUserConv !=2)
+    CandidateSet.clear();
 
   // Determine whether we are allowed to call explicit constructors or
   // explicit conversion operators.
@@ -4156,10 +4179,12 @@
   OverloadCandidateSet::iterator Best;
   if (OverloadingResult Result
         = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) {
+    if(InitListUserConv == 2)
+      return 0;
     Sequence.SetOverloadFailure(
                         InitializationSequence::FK_UserConversionOverloadFailed,
                                 Result);
-    return;
+    return 0;
   }
 
   FunctionDecl *Function = Best->Function;
@@ -4173,7 +4198,7 @@
     Sequence.AddUserConversionStep(Function, Best->FoundDecl,
                                    DestType.getUnqualifiedType(),
                                    HadMultipleCandidates);
-    return;
+    return 0;
   }
 
   // Add the user-defined conversion step that calls the conversion function.
@@ -4187,7 +4212,7 @@
     // let the user-defined conversion step handle the conversion.
     Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType,
                                    HadMultipleCandidates);
-    return;
+    return 1;
   }
 
   Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
@@ -4202,6 +4227,7 @@
     ICS.Standard = Best->FinalConversion;
     Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
   }
+  return 0;
 }
 
 /// An egregious hack for compatibility with libstdc++-4.2: in <tr1/hashtable>,
@@ -5646,6 +5672,16 @@
   case SK_OCLSamplerInit:
   case SK_OCLZeroEvent: {
     assert(Args.size() == 1);
+    if(Args.size() == 1 && (InitListUserConv == 1)) {
+      if(InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Args[0])) {
+        if((InitList->getNumInits() == 1)) {
+          Expr *InitM = InitList->getInit(0);
+          CurInit = InitM;
+          InitListUserConv = 0;
+        }
+      }
+    }
+    else 
     CurInit = Args[0];
     if (!CurInit.get()) return ExprError();
     break;
