Explorer: Add initial initializing expression support for variable declaration (#2907)

Add partial support for initializing expressions for variable declaration. This is based on https://github.com/carbon-language/carbon-lang/pull/2006, which introduces expression categories, and how it is possible to convert to/from those different categories.

## Functional changes

* Initializing expressions initialize directly the provided storage when used to initialize a variable.
   * Allows initializing expressions to avoid a copy when using `[var|let] name: type = call_expression(...)` by initializing `name` in-place.
   * Support `returned var: ...` and `return <expr>`
   * Support nested initializing expressions

## Main implementation changes

* Updated PatternMatch logic to handle expression categories
* Updated `VariableDefinition` interpreter statement to allocate and pass a location to initializing expressions
    * Update statement actions to allow passing an allocation, used by return expr or returned var
* Modified the RuntimeScope API to be one step closer to the memory model we want to have
    * Remove `GetAllocationId` and older `Bind` which don't apply
* New set of tests to highlight those different situations
    * Added a new intrinsic to print the allocation stack (and make sure we behave correctly, beyond visible side effects)

## Next work

* Dedicated `Action` to retrieve expression category information in the interpreter (https://github.com/carbon-language/carbon-lang/pull/2927)
* Avoid copies when initializing value expression from reference expression and prevent mutations for the duration of the "pinning" (https://github.com/carbon-language/carbon-lang/pull/2927)
* Avoid unnecessary copies from value expression to value expression, after ensuring that even value expression temporaries are registered for destruction.
* Avoid unnecessary copies when binding function arguments
This commit is contained in:
Adrien Leravat
2023-06-23 21:42:00 -07:00
committed by GitHub
parent aad4ed2083
commit 19c74ead49
35 changed files with 1036 additions and 162 deletions
+11
View File
@@ -1318,4 +1318,15 @@ auto NominalClassType::InheritsClass(Nonnull<const Value*> other) const
return false;
}
auto ExpressionCategoryToString(ExpressionCategory cat) -> llvm::StringRef {
switch (cat) {
case ExpressionCategory::Value:
return "value";
case ExpressionCategory::Reference:
return "reference";
case ExpressionCategory::Initializing:
return "initializing";
}
}
} // namespace Carbon