mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 16:21:11 +00:00
recognize functions that become tail-recursive after closure conversion
This commit is contained in:
parent
aecafe5c80
commit
4c445f9f24
2 changed files with 12 additions and 3 deletions
|
@ -738,15 +738,19 @@ impl<'a> Procs<'a> {
|
|||
ret_var: Variable,
|
||||
layout_cache: &mut LayoutCache<'a>,
|
||||
) -> Result<ProcLayout<'a>, RuntimeError> {
|
||||
// anonymous functions cannot reference themselves, therefore cannot be tail-recursive
|
||||
let is_self_recursive = false;
|
||||
|
||||
let raw_layout = layout_cache
|
||||
.raw_from_var(env.arena, annotation, env.subs)
|
||||
.unwrap_or_else(|err| panic!("TODO turn fn_var into a RuntimeError {:?}", err));
|
||||
|
||||
let top_level = ProcLayout::from_raw(env.arena, raw_layout);
|
||||
|
||||
// anonymous functions cannot reference themselves, therefore cannot be tail-recursive
|
||||
// EXCEPT when the closure conversion makes it tail-recursive.
|
||||
let is_self_recursive = match top_level.arguments.last() {
|
||||
Some(Layout::LambdaSet(lambda_set)) => lambda_set.contains(symbol),
|
||||
_ => false,
|
||||
};
|
||||
|
||||
match patterns_to_when(env, layout_cache, loc_args, ret_var, loc_body) {
|
||||
Ok((_, pattern_symbols, body)) => {
|
||||
// an anonymous closure. These will always be specialized already
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue