Add PushConditionalTempDestruction/PopConditionalTempDestruction.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72835 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGCXXTemp.cpp b/lib/CodeGen/CGCXXTemp.cpp
index 4e20b74..b7bc6b7 100644
--- a/lib/CodeGen/CGCXXTemp.cpp
+++ b/lib/CodeGen/CGCXXTemp.cpp
@@ -67,3 +67,14 @@
 
   return RV;
 }
+
+void 
+CodeGenFunction::PushConditionalTempDestruction() {
+  // Store the current number of live temporaries.
+  ConditionalTempDestructionStack.push_back(LiveTemporaries.size());
+}
+
+void CodeGenFunction::PopConditionalTempDestruction() {
+  ConditionalTempDestructionStack.pop_back();
+}
+  
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index c91a052..72c4aa4 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -160,6 +160,20 @@
   /// this behavior for branches?
   void EmitBranchThroughCleanup(llvm::BasicBlock *Dest);
 
+  /// PushConditionalTempDestruction - Should be called before a conditional 
+  /// part of an expression is emitted. For example, before the RHS of the
+  /// expression below is emitted:
+  /// 
+  /// b && f(T());
+  ///
+  /// This is used to make sure that any temporaryes created in the conditional
+  /// branch are only destroyed if the branch is taken.
+  void PushConditionalTempDestruction();
+  
+  /// PopConditionalTempDestruction - Should be called after a conditional 
+  /// part of an expression has been emitted.
+  void PopConditionalTempDestruction();
+  
 private:
   CGDebugInfo* DebugInfo;
 
@@ -263,6 +277,11 @@
   };
   
   llvm::SmallVector<CXXLiveTemporaryInfo, 4> LiveTemporaries;
+
+  /// ConditionalTempDestructionStack - Contains the number of live temporaries 
+  /// when PushConditionalTempDestruction was called. This is used so that
+  /// we know how many temporaries were created by a certain expression.
+  llvm::SmallVector<size_t, 4> ConditionalTempDestructionStack;
   
 public:
   CodeGenFunction(CodeGenModule &cgm);