diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index e1fe0d2..ce361f0 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -802,11 +802,8 @@
 }
 
 RValue CodeGenFunction::EmitCallArg(const Expr *E, QualType ArgType) {
-  if (const CXXBindReferenceExpr *BE = dyn_cast<CXXBindReferenceExpr>(E))
-    return RValue::get(EmitCXXBindReferenceExpr(BE));
-  
   if (ArgType->isReferenceType())
-    return EmitReferenceBindingToExpr(E, ArgType);
+    return EmitReferenceBindingToExpr(E);
 
   return EmitAnyExprToTemp(E);
 }
diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp
index 8362945..70973a4 100644
--- a/lib/CodeGen/CGClass.cpp
+++ b/lib/CodeGen/CGClass.cpp
@@ -838,7 +838,7 @@
   // was implicitly generated, we shouldn't be zeroing memory.
   RValue RHS;
   if (FieldType->isReferenceType()) {
-    RHS = CGF.EmitReferenceBindingToExpr(MemberInit->getInit(), FieldType,
+    RHS = CGF.EmitReferenceBindingToExpr(MemberInit->getInit(),
                                          /*IsInitializer=*/true);
     CGF.EmitStoreThroughLValue(RHS, LHS, FieldType);
   } else if (FieldType->isArrayType() && !MemberInit->getInit()) {
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp
index 6ba537e..e27c5e4 100644
--- a/lib/CodeGen/CGDecl.cpp
+++ b/lib/CodeGen/CGDecl.cpp
@@ -507,12 +507,8 @@
         
         Builder.CreateCall4(CGM.getMemCpyFn(), Loc, SrcPtr, SizeVal, AlignVal);
       }
-    } else if (const CXXBindReferenceExpr *BE = 
-                dyn_cast<CXXBindReferenceExpr>(Init)) {
-      llvm::Value *V = EmitCXXBindReferenceExpr(BE);
-      EmitStoreOfScalar(V, Loc, /*Volatile=*/false, Ty);
     } else if (Ty->isReferenceType()) {
-      RValue RV = EmitReferenceBindingToExpr(Init, Ty, /*IsInitializer=*/true);
+      RValue RV = EmitReferenceBindingToExpr(Init, /*IsInitializer=*/true);
       EmitStoreOfScalar(RV.getScalarVal(), Loc, false, Ty);
     } else if (!hasAggregateLLVMType(Init->getType())) {
       llvm::Value *V = EmitScalarExpr(Init);
diff --git a/lib/CodeGen/CGDeclCXX.cpp b/lib/CodeGen/CGDeclCXX.cpp
index 3f1a722..3d5a4e8 100644
--- a/lib/CodeGen/CGDeclCXX.cpp
+++ b/lib/CodeGen/CGDeclCXX.cpp
@@ -81,7 +81,7 @@
     return;
   }
   if (Init->isLvalue(getContext()) == Expr::LV_Valid) {
-    RValue RV = EmitReferenceBindingToExpr(Init, T, /*IsInitializer=*/true);
+    RValue RV = EmitReferenceBindingToExpr(Init, /*IsInitializer=*/true);
     EmitStoreOfScalar(RV.getScalarVal(), DeclPtr, false, T);
     return;
   }
@@ -225,7 +225,7 @@
     QualType T = D.getType();
     // We don't want to pass true for IsInitializer here, because a static
     // reference to a temporary does not extend its lifetime.
-    RValue RV = EmitReferenceBindingToExpr(D.getInit(), T,
+    RValue RV = EmitReferenceBindingToExpr(D.getInit(),
                                            /*IsInitializer=*/false);
     EmitStoreOfScalar(RV.getScalarVal(), GV, /*Volatile=*/false, T);
 
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index ab4f8f1..2ceefae 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -92,31 +92,8 @@
                      IsInitializer);
 }
 
-llvm::Value * 
-CodeGenFunction::EmitCXXBindReferenceExpr(const CXXBindReferenceExpr *E) {
-  QualType T = E->getType();
-  assert(T->isAnyComplexType() && "FIXME: Unhandled bind expression!");
-  
-  const Expr *SubExpr = E->getSubExpr();
-
-  if (!E->requiresTemporaryCopy())
-    return EmitLValue(SubExpr).getAddress();
-
-  llvm::Value *Value = CreateTempAlloca(ConvertTypeForMem(T), "reftmp");
-    
-  if (T->isAnyComplexType()) 
-    EmitComplexExprIntoAddr(SubExpr, Value, /*DestIsVolatile=*/false);
-  else
-    assert(false && "Unhandled bind expression");
-    
-  return Value;
-}
-
 RValue CodeGenFunction::EmitReferenceBindingToExpr(const Expr* E,
-                                                   QualType DestType,
                                                    bool IsInitializer) {
-  assert(!E->getType()->isAnyComplexType() && 
-         "Should not use this function for complex types!");
   bool ShouldDestroyTemporaries = false;
   unsigned OldNumLiveTemporaries = 0;
 
@@ -478,8 +455,6 @@
     return EmitCXXConstructLValue(cast<CXXConstructExpr>(E));
   case Expr::CXXBindTemporaryExprClass:
     return EmitCXXBindTemporaryLValue(cast<CXXBindTemporaryExpr>(E));
-  case Expr::CXXBindReferenceExprClass:
-    return EmitLValue(cast<CXXBindReferenceExpr>(E)->getSubExpr());
   case Expr::CXXExprWithTemporariesClass:
     return EmitCXXExprWithTemporariesLValue(cast<CXXExprWithTemporaries>(E));
   case Expr::CXXZeroInitValueExprClass:
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index 5de91ee..3e47469 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -1111,10 +1111,7 @@
 
   /// EmitReferenceBindingToExpr - Emits a reference binding to the passed in
   /// expression. Will emit a temporary variable if E is not an LValue.
-  RValue EmitReferenceBindingToExpr(const Expr* E, QualType DestType,
-                                    bool IsInitializer = false);
-
-  llvm::Value *EmitCXXBindReferenceExpr(const CXXBindReferenceExpr *E);
+  RValue EmitReferenceBindingToExpr(const Expr* E, bool IsInitializer = false);
 
   //===--------------------------------------------------------------------===//
   //                           Expression Emission
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 7c52df5..1f1e76c 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -3304,31 +3304,16 @@
       // Check exception specifications
       if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType))
         return S.ExprError();
-      
-      // FIXME: We should do this for all types.
-      if (DestType->isAnyComplexType()) {
-        CurInit = 
-          S.Owned(CXXBindReferenceExpr::Create(S.Context, 
-                                               CurInit.takeAs<Expr>(), 
-                                               /*ExtendsLifetime=*/false,
-                                               /*RequiresTemporaryCopy=*/false));
-      }
 
       break;
 
     case SK_BindReferenceToTemporary:
+      // Reference binding does not have any corresponding ASTs.
+
       // Check exception specifications
       if (S.CheckExceptionSpecCompatibility(CurInitExpr, DestType))
         return S.ExprError();
 
-      // FIXME: We should do this for all types.
-      if (DestType->isAnyComplexType()) {
-        CurInit = 
-          S.Owned(CXXBindReferenceExpr::Create(S.Context, 
-                                               CurInit.takeAs<Expr>(), 
-                                               /*ExtendsLifetime=*/false,
-                                               /*RequiresTemporaryCopy=*/true));
-      }
       break;
         
     case SK_UserConversion: {
