implement AST and parser support for 'return'. We're still not doing a conversion

to a return type yet though.  We happily diagnose thigns like this as an error:

func foo() -> int {
  return 4 5
}



Swift SVN r493
This commit is contained in:
Chris Lattner
2011-08-03 23:19:24 +00:00
parent 39660b5017
commit 433d6de807
7 changed files with 68 additions and 3 deletions

View File

@@ -1110,6 +1110,7 @@ bool Parser::parseExprFunc(NullablePtr<Expr> &Result) {
/// ';'
/// expr '=' expr
/// stmt-brace
/// stmt-return
/// stmt-if
bool Parser::parseBraceItemList(SmallVectorImpl<ExprStmtOrDecl> &Entries,
bool IsTopLevel) {
@@ -1123,15 +1124,15 @@ bool Parser::parseBraceItemList(SmallVectorImpl<ExprStmtOrDecl> &Entries,
Entries.push_back(new (S.Context) SemiStmt(Tok.getLoc()));
consumeToken(tok::semi);
break;
case tok::l_brace:
Entries.push_back(parseStmtBrace());
break;
case tok::kw_return:
Entries.push_back(parseStmtReturn());
break;
case tok::kw_if:
Entries.push_back(parseStmtIf());
break;
case tok::kw_import:
Entries.push_back(parseDeclImport());
@@ -1229,6 +1230,31 @@ BraceStmt *Parser::parseStmtBrace() {
return new (S.Context) BraceStmt(LBLoc, NewElements, Entries.size(), RBLoc);
}
/// parseStmtReturn
///
/// stmt-return:
/// return expr?
///
Stmt *Parser::parseStmtReturn() {
SMLoc ReturnLoc = consumeToken(tok::kw_return);
// Handle the ambiguity between consuming the expression and allowing the
// enclosing stmt-brace to get it by eagerly eating it.
Expr *Result;
if (isStartOfExpr(Tok, peekToken())) {
NullablePtr<Expr> ResultTmp;
if (parseExpr(ResultTmp, "expected expresssion in 'return' statement") ||
ResultTmp.isNull())
return 0;
Result = ResultTmp.get();
} else {
// Result value defaults to ().
Result = new (S.Context) TupleExpr(SMLoc(), 0, 0, 0, SMLoc(), false, false);
}
return new (S.Context) ReturnStmt(ReturnLoc, Result);
}
///
/// stmt-if: