Index: lib/CodeGen/CGCXX.cpp
===================================================================
--- lib/CodeGen/CGCXX.cpp	(revision 83614)
+++ lib/CodeGen/CGCXX.cpp	(working copy)
@@ -1866,6 +1866,8 @@
         if (!Field->isAnonymousStructOrUnion()) {
           assert(Member->getConstructor() &&
                  "EmitCtorPrologue - no constructor to initialize member");
+          const unsigned int
+            OldNumLiveTemporaries = LiveTemporaries.size();
           if (Array) {
             const llvm::Type *BasePtr = ConvertType(FieldType);
             BasePtr = llvm::PointerType::getUnqual(BasePtr);
@@ -1879,6 +1881,12 @@
                                    Ctor_Complete, LHS.getAddress(),
                                    Member->const_arg_begin(),
                                    Member->const_arg_end());
+          // Cleaning up whatever temporaries occurred due to 
+          // argument expressions to member intializer.
+          while (LiveTemporaries.size() > OldNumLiveTemporaries) {
+            PopCXXTemporary();
+          }
+          
           continue;
         }
         else {
Index: test/CodeGenCXX/member-initializer-temporary.cpp
===================================================================
--- test/CodeGenCXX/member-initializer-temporary.cpp	(revision 0)
+++ test/CodeGenCXX/member-initializer-temporary.cpp	(revision 0)
@@ -0,0 +1,28 @@
+// RUN: clang-cc -triple=x86_64-apple-darwin10 -emit-llvm %s -o - |FileCheck %s
+
+struct Bar {
+  Bar() {}
+  ~Bar() {}
+};
+
+struct Foo {
+
+  Foo() 
+  : b(Bar())
+  {
+      // CHECK: %tmp2 = alloca %struct.Bar
+      // CHECK: call void @_ZN3BarD1Ev(%struct.Bar* %tmp2) ssp
+      i = 42;
+      // CHECK-NEXT: %this5 = load %struct.Foo** %this.addr          ; <%struct.Foo*> [#uses=1]
+      // CHECK-NEXT: %tmp6 = getelementptr inbounds %struct.Foo* %this5, i32 0, i32 1 ; <i32*> [#uses=2]
+      // CHECK-NEXT: store i32 42, i32* %tmp6
+  }
+
+  Bar b;
+  int i;
+};
+
+void f0() {
+  Foo f;
+}
+
