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;
+}
+