mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Introduce if/switch expressions
Introduce SingleValueStmtExpr, which allows the embedding of a statement in an expression context. This then allows us to parse and type-check `if` and `switch` statements as expressions, gated behind the `IfSwitchExpression` experimental feature for now. In the future, SingleValueStmtExpr could also be used for e.g `do` expressions. For now, only single expression branches are supported for producing a value from an `if`/`switch` expression, and each branch is type-checked independently. A multi-statement branch may only appear if it ends with a `throw`, and it may not `break`, `continue`, or `return`. The placement of `if`/`switch` expressions is also currently limited by a syntactic use diagnostic. Currently they're only allowed in bindings, assignments, throws, and returns. But this could be lifted in the future if desired.
This commit is contained in:
@@ -1237,6 +1237,18 @@ void SILGenFunction::emitGeneratorFunction(
|
||||
mergeCleanupBlocks();
|
||||
}
|
||||
|
||||
Initialization *SILGenFunction::getSingleValueStmtInit(Expr *E) {
|
||||
if (SingleValueStmtInitStack.empty())
|
||||
return nullptr;
|
||||
|
||||
// Check to see if this is an expression branch of an active
|
||||
// SingleValueStmtExpr initialization.
|
||||
if (!SingleValueStmtInitStack.back().Exprs.contains(E))
|
||||
return nullptr;
|
||||
|
||||
return SingleValueStmtInitStack.back().Init;
|
||||
}
|
||||
|
||||
void SILGenFunction::emitProfilerIncrement(ASTNode Node) {
|
||||
emitProfilerIncrement(ProfileCounterRef::node(Node));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user