implement code generation for scalar stmt expressions.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41656 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CGStmt.cpp b/CodeGen/CGStmt.cpp
index 04c9c1d..85a6ca8 100644
--- a/CodeGen/CGStmt.cpp
+++ b/CodeGen/CGStmt.cpp
@@ -60,12 +60,29 @@
   }
 }
 
-void CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S) {
+/// EmitCompoundStmt - Emit a compound statement {..} node.  If GetLast is true,
+/// this captures the expression result of the last sub-statement and returns it
+/// (for use by the statement expression extension).
+RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast) {
   // FIXME: handle vla's etc.
+  if (S.body_empty() || !isa<Expr>(S.body_back())) GetLast = false;
   
-  for (CompoundStmt::const_body_iterator I = S.body_begin(), E = S.body_end();
-       I != E; ++I)
+  for (CompoundStmt::const_body_iterator I = S.body_begin(),
+       E = S.body_end()-GetLast; I != E; ++I)
     EmitStmt(*I);
+  
+  
+  if (!GetLast)
+    return RValue::get(0);
+    
+  const Expr *Last = cast<Expr>(S.body_back());
+  if (!hasAggregateLLVMType(Last->getType()))
+    return RValue::get(EmitScalarExpr(Last));
+  assert(0 && "Unimp");
+  //else if (Last->getType()->isComplexType())
+  //  EmitComplexExpr(Last);
+  //else
+  //  EmitAggExpr(E, 0, false);
 }
 
 void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB) {