Add semantic analysis for "blocks". 

Highlights...

- 4 new AST nodes, BlockExpr, BlockStmtExpr, BlockExprExpr, BlockDeclRefExpr.
- Sema::ActOnBlockStart(), ActOnBlockError(), ActOnBlockStmtExpr(), ActOnBlockExprExpr(), ActOnBlockReturnStmt().

Next steps...

- hack Sema::ActOnIdentifierExpr() to deal with block decl refs.
- add attribute handler for byref decls.
- add test cases.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55710 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 1410f7e..1ab2220 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -282,6 +282,13 @@
     InitExprs.push_back(initexprs[i]);
 }
 
+/// getFunctionType - Return the underlying function type for this closure.
+///
+const FunctionType *BlockExpr::getFunctionType() const {
+  return getType()->getAsBlockPointerType()->
+                    getPointeeType()->getAsFunctionType();
+}
+
 //===----------------------------------------------------------------------===//
 // Generic Expression Routines
 //===----------------------------------------------------------------------===//
@@ -1432,3 +1439,18 @@
   return &SubExprs[0]+ARGS_START+getNumArgs();
 }
 
+// Blocks
+Stmt::child_iterator BlockStmtExpr::child_begin() {
+  return reinterpret_cast<Stmt**>(&Body);
+}
+Stmt::child_iterator BlockStmtExpr::child_end() {
+  return reinterpret_cast<Stmt**>(&Body)+1;
+}
+
+Stmt::child_iterator BlockExprExpr::child_begin() {
+  return reinterpret_cast<Stmt**>(&BodyExpr);
+}
+Stmt::child_iterator BlockExprExpr::child_end() {
+  return reinterpret_cast<Stmt**>(&BodyExpr)+1;
+}
+