Index: test/SemaTemplate/instantiate-init.cpp
===================================================================
--- test/SemaTemplate/instantiate-init.cpp	(revision 95528)
+++ test/SemaTemplate/instantiate-init.cpp	(working copy)
@@ -26,3 +26,14 @@
   f1(x0, ip, dp); // expected-note{{instantiation}}
 }
 
+namespace explicit_ctors_in_templates {
+  template <typename T> struct X { explicit X(T* p = 0) { }; };
+  template <typename T> struct Y { Y(int, const T& x); };
+  struct A { };
+  template <typename T>
+  struct B {
+      B() : y(0, X<A>()) { }
+      Y<X<A> > y;
+  };
+  B<int> b;
+}
Index: lib/Sema/TreeTransform.h
===================================================================
--- lib/Sema/TreeTransform.h	(revision 95533)
+++ lib/Sema/TreeTransform.h	(working copy)
@@ -4810,10 +4810,14 @@
 template<typename Derived>
 Sema::OwningExprResult
 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
-  // CXXConstructExprs are always implicit, so when we have a
-  // 1-argument construction we just transform that argument.
-  if (E->getNumArgs() == 1 ||
-      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
+  CXXConstructorDecl *OrigConstructor =
+    cast<CXXConstructorDecl>(E->getConstructor());
+
+  // If the original constructor is not an explicit constructor, and the number
+  // of arguments is one, we can transform just the argument and implicit
+  // conversion will handle the remainder.
+  if (!OrigConstructor->isExplicit() && (E->getNumArgs() == 1 ||
+      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))))
     return getDerived().TransformExpr(E->getArg(0));
 
   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
@@ -4824,7 +4828,7 @@
 
   CXXConstructorDecl *Constructor
     = cast_or_null<CXXConstructorDecl>(
-                              getDerived().TransformDecl(E->getConstructor()));
+        getDerived().TransformDecl(OrigConstructor));
   if (!Constructor)
     return SemaRef.ExprError();
 
