mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user