Support for let declarations. (#3257)

A `let` declaration is represented by a `bind_name` node in SemIR:

```carbon-semir
  %b: i32 = bind_name "b", %a
```

Because `Check` encounters the pattern before it sees the value, we
first create the `bind_name` node with an unset value and don't add it
to the block. Then, once we've seen and converted the initializer, we
update the `bind_name` to have the value and add it to the current
block, after the initializer code.
This commit is contained in:
Richard Smith
2023-10-06 00:06:21 +00:00
committed by GitHub
parent c7e6238fa8
commit 74d52738ff
28 changed files with 579 additions and 13 deletions
@@ -57,6 +57,10 @@ auto HandleDeclarationScopeLoop(Context& context) -> void {
context.PushState(State::VarAsSemicolon);
break;
}
case Lex::TokenKind::Let: {
context.PushState(State::Let);
break;
}
default: {
HandleUnrecognizedDeclaration(context);
break;