update mono tests

This commit is contained in:
Folkert 2022-07-08 16:19:12 +02:00
commit c0ace1ee0b
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
19 changed files with 274 additions and 228 deletions

View file

@ -7646,23 +7646,19 @@ fn call_by_name_help<'a>(
"see call_by_name for background (scroll down a bit), function is {:?}",
proc_name,
);
let field_symbols = field_symbols.into_bump_slice();
let call = self::Call {
call_type: CallType::ByName {
name: proc_name,
ret_layout,
arg_layouts: argument_layouts,
specialization_id: env.next_call_specialization_id(),
},
arguments: field_symbols,
};
let result = build_call(env, call, assigned, *ret_layout, hole);
let iter = loc_args.into_iter().rev().zip(field_symbols.iter().rev());
assign_to_symbols(env, procs, layout_cache, iter, result)
call_specialized_proc(
env,
procs,
proc_name,
lambda_set,
RawFunctionLayout::Function(argument_layouts, lambda_set, ret_layout),
top_level_layout,
field_symbols.into_bump_slice(),
loc_args,
layout_cache,
assigned,
hole,
)
} else if env.is_imported_symbol(proc_name.name()) {
add_needed_external(procs, env, original_fn_var, proc_name);
@ -7739,52 +7735,21 @@ fn call_by_name_help<'a>(
proc_name,
);
let has_captures = argument_layouts.len() != top_level_layout.arguments.len();
let closure_argument = env.unique_symbol();
if has_captures {
field_symbols.push(closure_argument);
}
let field_symbols = field_symbols.into_bump_slice();
let call = self::Call {
call_type: CallType::ByName {
name: proc_name,
ret_layout,
arg_layouts: top_level_layout.arguments,
specialization_id: env.next_call_specialization_id(),
},
arguments: field_symbols,
};
let result = build_call(env, call, assigned, *ret_layout, hole);
// NOTE: the zip omits the closure symbol, if it exists,
// because loc_args then is shorter than field_symbols
debug_assert!([0, 1].contains(&(field_symbols.len() - loc_args.len())));
let iter = loc_args.into_iter().zip(field_symbols.iter()).rev();
let result = assign_to_symbols(env, procs, layout_cache, iter, result);
if has_captures {
let partial_proc = procs.partial_procs.get_symbol(proc_name.name()).unwrap();
let captured = match partial_proc.captured_symbols {
CapturedSymbols::None => &[],
CapturedSymbols::Captured(slice) => slice,
};
construct_closure_data(
env,
lambda_set,
proc_name,
captured.iter(),
closure_argument,
env.arena.alloc(result),
)
} else {
result
}
call_specialized_proc(
env,
procs,
proc_name,
lambda_set,
RawFunctionLayout::Function(argument_layouts, lambda_set, ret_layout),
top_level_layout,
field_symbols,
loc_args,
layout_cache,
assigned,
hole,
)
}
PendingSpecializations::Making => {
let opt_partial_proc = procs.partial_procs.symbol_to_id(proc_name.name());
@ -7810,13 +7775,26 @@ fn call_by_name_help<'a>(
partial_proc,
) {
Ok((proc, layout)) => {
let proc_name = proc.name;
let function_layout = ProcLayout::from_raw(
env.arena,
layout,
proc_name.captures_niche(),
);
procs.specialized.insert_specialized(
proc_name.name(),
function_layout,
proc,
);
// now we just call our freshly-specialized function
call_specialized_proc(
env,
procs,
proc,
proc_name,
lambda_set,
layout,
function_layout,
field_symbols,
loc_args,
layout_cache,
@ -7831,12 +7809,25 @@ fn call_by_name_help<'a>(
attempted_layout,
);
let proc_name = proc.name;
let function_layout = ProcLayout::from_raw(
env.arena,
attempted_layout,
proc_name.captures_niche(),
);
procs.specialized.insert_specialized(
proc_name.name(),
function_layout,
proc,
);
call_specialized_proc(
env,
procs,
proc,
proc_name,
lambda_set,
attempted_layout,
function_layout,
field_symbols,
loc_args,
layout_cache,
@ -7985,22 +7976,16 @@ fn call_by_name_module_thunk<'a>(
fn call_specialized_proc<'a>(
env: &mut Env<'a, '_>,
procs: &mut Procs<'a>,
proc: Proc<'a>,
proc_name: LambdaName<'a>,
lambda_set: LambdaSet<'a>,
layout: RawFunctionLayout<'a>,
function_layout: ProcLayout<'a>,
field_symbols: &'a [Symbol],
loc_args: std::vec::Vec<(Variable, Loc<roc_can::expr::Expr>)>,
layout_cache: &mut LayoutCache<'a>,
assigned: Symbol,
hole: &'a Stmt<'a>,
) -> Stmt<'a> {
let proc_name = proc.name;
let function_layout = ProcLayout::from_raw(env.arena, layout, proc_name.captures_niche());
procs
.specialized
.insert_specialized(proc_name.name(), function_layout, proc);
if field_symbols.is_empty() {
debug_assert!(loc_args.is_empty());

View file

@ -3624,3 +3624,22 @@ fn lambda_capture_niches_have_captured_function_in_closure() {
(RocStr, RocStr)
)
}
#[test]
#[cfg(any(feature = "gen-llvm"))]
fn recursive_call_capturing_function() {
assert_evals_to!(
indoc!(
r#"
a = \b ->
c = \d ->
if d == 7 then d else c (d + b)
c 1
a 6
"#
),
7,
i64
)
}

View file

@ -9,7 +9,7 @@ procedure Test.2 (Test.3):
ret Test.6;
procedure Test.8 (Test.9):
Error The `#UserApp.8` function could not be generated, likely due to a type error.
Error The `#UserApp.IdentId(8)` function could not be generated, likely due to a type error.
procedure Test.0 ():
let Test.1 : List {} = Array [];

View file

@ -1,6 +1,6 @@
procedure List.2 (List.77, List.78):
let List.298 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
let List.297 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
if List.294 then
let List.296 : {} = CallByName List.60 List.77 List.78;
let List.295 : [C {}, C {}] = TagId(1) List.296;
@ -11,12 +11,12 @@ procedure List.2 (List.77, List.78):
ret List.292;
procedure List.6 (#Attr.2):
let List.301 : U64 = lowlevel ListLen #Attr.2;
ret List.301;
let List.299 : U64 = lowlevel ListLen #Attr.2;
ret List.299;
procedure List.60 (#Attr.2, #Attr.3):
let List.300 : {} = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.300;
let List.298 : {} = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.298;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -1,16 +1,16 @@
procedure List.4 (List.88, List.89):
let List.295 : U64 = 1i64;
let List.293 : List U8 = CallByName List.65 List.88 List.295;
let List.294 : U64 = 1i64;
let List.293 : List U8 = CallByName List.65 List.88 List.294;
let List.292 : List U8 = CallByName List.66 List.293 List.89;
ret List.292;
procedure List.65 (#Attr.2, #Attr.3):
let List.298 : List U8 = lowlevel ListReserve #Attr.2 #Attr.3;
ret List.298;
let List.296 : List U8 = lowlevel ListReserve #Attr.2 #Attr.3;
ret List.296;
procedure List.66 (#Attr.2, #Attr.3):
let List.297 : List U8 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
ret List.297;
let List.295 : List U8 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
ret List.295;
procedure Test.20 (Test.22):
let Test.34 : {U8} = Struct {Test.22};

View file

@ -3,16 +3,16 @@ procedure Bool.7 (#Attr.2, #Attr.3):
ret Bool.9;
procedure Num.39 (#Attr.2, #Attr.3):
let Num.264 : I64 = lowlevel NumDivUnchecked #Attr.2 #Attr.3;
ret Num.264;
let Num.263 : I64 = lowlevel NumDivUnchecked #Attr.2 #Attr.3;
ret Num.263;
procedure Num.40 (Num.229, Num.230):
let Num.263 : I64 = 0i64;
let Num.260 : Int1 = CallByName Bool.7 Num.230 Num.263;
if Num.260 then
let Num.262 : {} = Struct {};
let Num.261 : [C {}, C I64] = TagId(0) Num.262;
ret Num.261;
let Num.262 : I64 = 0i64;
let Num.259 : Int1 = CallByName Bool.7 Num.230 Num.262;
if Num.259 then
let Num.261 : {} = Struct {};
let Num.260 : [C {}, C I64] = TagId(0) Num.261;
ret Num.260;
else
let Num.258 : I64 = CallByName Num.39 Num.229 Num.230;
let Num.257 : [C {}, C I64] = TagId(1) Num.258;

View file

@ -3,24 +3,24 @@ procedure Bool.7 (#Attr.2, #Attr.3):
ret Bool.9;
procedure List.2 (List.77, List.78):
let List.307 : U64 = CallByName List.6 List.77;
let List.303 : Int1 = CallByName Num.22 List.78 List.307;
if List.303 then
let List.305 : I64 = CallByName List.60 List.77 List.78;
let List.304 : [C {}, C I64] = TagId(1) List.305;
ret List.304;
let List.306 : U64 = CallByName List.6 List.77;
let List.302 : Int1 = CallByName Num.22 List.78 List.306;
if List.302 then
let List.304 : I64 = CallByName List.60 List.77 List.78;
let List.303 : [C {}, C I64] = TagId(1) List.304;
ret List.303;
else
let List.302 : {} = Struct {};
let List.301 : [C {}, C I64] = TagId(0) List.302;
ret List.301;
let List.301 : {} = Struct {};
let List.300 : [C {}, C I64] = TagId(0) List.301;
ret List.300;
procedure List.6 (#Attr.2):
let List.308 : U64 = lowlevel ListLen #Attr.2;
ret List.308;
let List.307 : U64 = lowlevel ListLen #Attr.2;
ret List.307;
procedure List.60 (#Attr.2, #Attr.3):
let List.306 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.306;
let List.305 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.305;
procedure List.9 (List.205):
let List.299 : U64 = 0i64;
@ -46,22 +46,22 @@ procedure Str.27 (Str.88):
ret Str.194;
procedure Str.47 (#Attr.2):
let Str.203 : {I64, U8} = lowlevel StrToNum #Attr.2;
ret Str.203;
let Str.202 : {I64, U8} = lowlevel StrToNum #Attr.2;
ret Str.202;
procedure Str.67 (Str.189):
let Str.190 : {I64, U8} = CallByName Str.47 Str.189;
let Str.201 : U8 = StructAtIndex 1 Str.190;
let Str.202 : U8 = 0i64;
let Str.198 : Int1 = CallByName Bool.7 Str.201 Str.202;
if Str.198 then
let Str.200 : I64 = StructAtIndex 0 Str.190;
let Str.199 : [C Int1, C I64] = TagId(1) Str.200;
ret Str.199;
let Str.200 : U8 = StructAtIndex 1 Str.190;
let Str.201 : U8 = 0i64;
let Str.197 : Int1 = CallByName Bool.7 Str.200 Str.201;
if Str.197 then
let Str.199 : I64 = StructAtIndex 0 Str.190;
let Str.198 : [C Int1, C I64] = TagId(1) Str.199;
ret Str.198;
else
let Str.197 : Int1 = false;
let Str.196 : [C Int1, C I64] = TagId(0) Str.197;
ret Str.196;
let Str.196 : Int1 = false;
let Str.195 : [C Int1, C I64] = TagId(0) Str.196;
ret Str.195;
procedure Test.0 ():
let Test.4 : Int1 = true;

View file

@ -1,16 +1,16 @@
procedure List.4 (List.88, List.89):
let List.295 : U64 = 1i64;
let List.293 : List I64 = CallByName List.65 List.88 List.295;
let List.294 : U64 = 1i64;
let List.293 : List I64 = CallByName List.65 List.88 List.294;
let List.292 : List I64 = CallByName List.66 List.293 List.89;
ret List.292;
procedure List.65 (#Attr.2, #Attr.3):
let List.298 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
ret List.298;
let List.296 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
ret List.296;
procedure List.66 (#Attr.2, #Attr.3):
let List.297 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
ret List.297;
let List.295 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
ret List.295;
procedure Test.0 ():
let Test.2 : List I64 = Array [1i64];

View file

@ -1,16 +1,16 @@
procedure List.4 (List.88, List.89):
let List.295 : U64 = 1i64;
let List.293 : List I64 = CallByName List.65 List.88 List.295;
let List.294 : U64 = 1i64;
let List.293 : List I64 = CallByName List.65 List.88 List.294;
let List.292 : List I64 = CallByName List.66 List.293 List.89;
ret List.292;
procedure List.65 (#Attr.2, #Attr.3):
let List.298 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
ret List.298;
let List.296 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
ret List.296;
procedure List.66 (#Attr.2, #Attr.3):
let List.297 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
ret List.297;
let List.295 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
ret List.295;
procedure Test.1 (Test.2):
let Test.6 : I64 = 42i64;

View file

@ -6,22 +6,22 @@ procedure List.3 (List.85, List.86, List.87):
ret List.294;
procedure List.57 (List.82, List.83, List.84):
let List.301 : U64 = CallByName List.6 List.82;
let List.298 : Int1 = CallByName Num.22 List.83 List.301;
if List.298 then
let List.299 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.299;
let List.300 : U64 = CallByName List.6 List.82;
let List.297 : Int1 = CallByName Num.22 List.83 List.300;
if List.297 then
let List.298 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.298;
else
let List.297 : {List I64, I64} = Struct {List.82, List.84};
ret List.297;
let List.296 : {List I64, I64} = Struct {List.82, List.84};
ret List.296;
procedure List.6 (#Attr.2):
let List.293 : U64 = lowlevel ListLen #Attr.2;
ret List.293;
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
let List.300 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.300;
let List.299 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.299;
procedure Num.19 (#Attr.2, #Attr.3):
let Num.257 : U64 = lowlevel NumAdd #Attr.2 #Attr.3;

View file

@ -1,6 +1,6 @@
procedure List.2 (List.77, List.78):
let List.298 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
let List.297 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
if List.294 then
let List.296 : I64 = CallByName List.60 List.77 List.78;
let List.295 : [C {}, C I64] = TagId(1) List.296;
@ -11,12 +11,12 @@ procedure List.2 (List.77, List.78):
ret List.292;
procedure List.6 (#Attr.2):
let List.301 : U64 = lowlevel ListLen #Attr.2;
ret List.301;
let List.299 : U64 = lowlevel ListLen #Attr.2;
ret List.299;
procedure List.60 (#Attr.2, #Attr.3):
let List.300 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.300;
let List.298 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.298;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -1,6 +1,6 @@
procedure List.2 (List.77, List.78):
let List.298 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
let List.297 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
if List.294 then
let List.296 : Str = CallByName List.60 List.77 List.78;
let List.295 : [C {}, C Str] = TagId(1) List.296;
@ -11,16 +11,16 @@ procedure List.2 (List.77, List.78):
ret List.292;
procedure List.5 (#Attr.2, #Attr.3):
let List.300 : List Str = lowlevel ListMap { xs: `#Attr.#arg1` } #Attr.2 Test.3 #Attr.3;
ret List.300;
let List.298 : List Str = lowlevel ListMap { xs: `#Attr.#arg1` } #Attr.2 Test.3 #Attr.3;
ret List.298;
procedure List.6 (#Attr.2):
let List.302 : U64 = lowlevel ListLen #Attr.2;
ret List.302;
let List.300 : U64 = lowlevel ListLen #Attr.2;
ret List.300;
procedure List.60 (#Attr.2, #Attr.3):
let List.301 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.301;
let List.299 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.299;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -1,6 +1,6 @@
procedure List.2 (List.77, List.78):
let List.298 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
let List.297 : U64 = CallByName List.6 List.77;
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
if List.294 then
let List.296 : Str = CallByName List.60 List.77 List.78;
let List.295 : [C {}, C Str] = TagId(1) List.296;
@ -12,17 +12,17 @@ procedure List.2 (List.77, List.78):
procedure List.5 (#Attr.2, #Attr.3):
inc #Attr.2;
let List.300 : List Str = lowlevel ListMap { xs: `#Attr.#arg1` } #Attr.2 Test.3 #Attr.3;
let List.298 : List Str = lowlevel ListMap { xs: `#Attr.#arg1` } #Attr.2 Test.3 #Attr.3;
decref #Attr.2;
ret List.300;
ret List.298;
procedure List.6 (#Attr.2):
let List.302 : U64 = lowlevel ListLen #Attr.2;
ret List.302;
let List.300 : U64 = lowlevel ListLen #Attr.2;
ret List.300;
procedure List.60 (#Attr.2, #Attr.3):
let List.301 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.301;
let List.299 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.299;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -6,22 +6,22 @@ procedure List.3 (List.85, List.86, List.87):
ret List.292;
procedure List.57 (List.82, List.83, List.84):
let List.299 : U64 = CallByName List.6 List.82;
let List.296 : Int1 = CallByName Num.22 List.83 List.299;
if List.296 then
let List.297 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.297;
let List.298 : U64 = CallByName List.6 List.82;
let List.295 : Int1 = CallByName Num.22 List.83 List.298;
if List.295 then
let List.296 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.296;
else
let List.295 : {List I64, I64} = Struct {List.82, List.84};
ret List.295;
let List.294 : {List I64, I64} = Struct {List.82, List.84};
ret List.294;
procedure List.6 (#Attr.2):
let List.300 : U64 = lowlevel ListLen #Attr.2;
ret List.300;
let List.299 : U64 = lowlevel ListLen #Attr.2;
ret List.299;
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
let List.298 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.298;
let List.297 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.297;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -1,11 +1,11 @@
procedure List.28 (#Attr.2, #Attr.3):
let List.295 : List I64 = lowlevel ListSortWith { xs: `#Attr.#arg1` } #Attr.2 Num.46 #Attr.3;
let List.294 : List I64 = lowlevel ListSortWith { xs: `#Attr.#arg1` } #Attr.2 Num.46 #Attr.3;
let Bool.9 : Int1 = lowlevel ListIsUnique #Attr.2;
if Bool.9 then
ret List.295;
ret List.294;
else
decref #Attr.2;
ret List.295;
ret List.294;
procedure List.54 (List.200):
let List.293 : {} = Struct {};

View file

@ -1,43 +1,43 @@
procedure List.2 (List.77, List.78):
let List.312 : U64 = CallByName List.6 List.77;
let List.308 : Int1 = CallByName Num.22 List.78 List.312;
if List.308 then
let List.310 : I64 = CallByName List.60 List.77 List.78;
let List.309 : [C {}, C I64] = TagId(1) List.310;
ret List.309;
let List.307 : U64 = CallByName List.6 List.77;
let List.304 : Int1 = CallByName Num.22 List.78 List.307;
if List.304 then
let List.306 : I64 = CallByName List.60 List.77 List.78;
let List.305 : [C {}, C I64] = TagId(1) List.306;
ret List.305;
else
let List.307 : {} = Struct {};
let List.306 : [C {}, C I64] = TagId(0) List.307;
ret List.306;
let List.303 : {} = Struct {};
let List.302 : [C {}, C I64] = TagId(0) List.303;
ret List.302;
procedure List.3 (List.85, List.86, List.87):
let List.296 : {List I64, I64} = CallByName List.57 List.85 List.86 List.87;
let List.295 : List I64 = StructAtIndex 0 List.296;
inc List.295;
dec List.296;
ret List.295;
let List.295 : {List I64, I64} = CallByName List.57 List.85 List.86 List.87;
let List.294 : List I64 = StructAtIndex 0 List.295;
inc List.294;
dec List.295;
ret List.294;
procedure List.57 (List.82, List.83, List.84):
let List.318 : U64 = CallByName List.6 List.82;
let List.315 : Int1 = CallByName Num.22 List.83 List.318;
if List.315 then
let List.316 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.316;
let List.312 : U64 = CallByName List.6 List.82;
let List.309 : Int1 = CallByName Num.22 List.83 List.312;
if List.309 then
let List.310 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.310;
else
let List.314 : {List I64, I64} = Struct {List.82, List.84};
ret List.314;
let List.308 : {List I64, I64} = Struct {List.82, List.84};
ret List.308;
procedure List.6 (#Attr.2):
let List.319 : U64 = lowlevel ListLen #Attr.2;
ret List.319;
let List.313 : U64 = lowlevel ListLen #Attr.2;
ret List.313;
procedure List.60 (#Attr.2, #Attr.3):
let List.320 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.320;
let List.314 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.314;
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
let List.317 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.317;
let List.311 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.311;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.259 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -0,0 +1,27 @@
procedure Num.19 (#Attr.2, #Attr.3):
let Num.257 : U32 = lowlevel NumAdd #Attr.2 #Attr.3;
ret Num.257;
procedure Test.1 (Test.2):
let Test.9 : U32 = 0i64;
let Test.16 : {U32} = Struct {Test.2};
let Test.8 : U32 = CallByName Test.3 Test.9 Test.16;
ret Test.8;
procedure Test.3 (Test.18, Test.19):
joinpoint Test.10 Test.4 #Attr.12:
let Test.2 : U32 = StructAtIndex 0 #Attr.12;
let Test.14 : Int1 = true;
if Test.14 then
ret Test.4;
else
let Test.12 : U32 = CallByName Num.19 Test.4 Test.2;
let Test.13 : {U32} = Struct {Test.2};
jump Test.10 Test.12 Test.13;
in
jump Test.10 Test.18 Test.19;
procedure Test.0 ():
let Test.7 : U32 = 6i64;
let Test.6 : U32 = CallByName Test.1 Test.7;
ret Test.6;

View file

@ -1,43 +1,43 @@
procedure List.2 (List.77, List.78):
let List.312 : U64 = CallByName List.6 List.77;
let List.308 : Int1 = CallByName Num.22 List.78 List.312;
if List.308 then
let List.310 : I64 = CallByName List.60 List.77 List.78;
let List.309 : [C {}, C I64] = TagId(1) List.310;
ret List.309;
let List.307 : U64 = CallByName List.6 List.77;
let List.304 : Int1 = CallByName Num.22 List.78 List.307;
if List.304 then
let List.306 : I64 = CallByName List.60 List.77 List.78;
let List.305 : [C {}, C I64] = TagId(1) List.306;
ret List.305;
else
let List.307 : {} = Struct {};
let List.306 : [C {}, C I64] = TagId(0) List.307;
ret List.306;
let List.303 : {} = Struct {};
let List.302 : [C {}, C I64] = TagId(0) List.303;
ret List.302;
procedure List.3 (List.85, List.86, List.87):
let List.296 : {List I64, I64} = CallByName List.57 List.85 List.86 List.87;
let List.295 : List I64 = StructAtIndex 0 List.296;
inc List.295;
dec List.296;
ret List.295;
let List.295 : {List I64, I64} = CallByName List.57 List.85 List.86 List.87;
let List.294 : List I64 = StructAtIndex 0 List.295;
inc List.294;
dec List.295;
ret List.294;
procedure List.57 (List.82, List.83, List.84):
let List.318 : U64 = CallByName List.6 List.82;
let List.315 : Int1 = CallByName Num.22 List.83 List.318;
if List.315 then
let List.316 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.316;
let List.312 : U64 = CallByName List.6 List.82;
let List.309 : Int1 = CallByName Num.22 List.83 List.312;
if List.309 then
let List.310 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
ret List.310;
else
let List.314 : {List I64, I64} = Struct {List.82, List.84};
ret List.314;
let List.308 : {List I64, I64} = Struct {List.82, List.84};
ret List.308;
procedure List.6 (#Attr.2):
let List.319 : U64 = lowlevel ListLen #Attr.2;
ret List.319;
let List.313 : U64 = lowlevel ListLen #Attr.2;
ret List.313;
procedure List.60 (#Attr.2, #Attr.3):
let List.320 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.320;
let List.314 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
ret List.314;
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
let List.317 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.317;
let List.311 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
ret List.311;
procedure Num.22 (#Attr.2, #Attr.3):
let Num.259 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;

View file

@ -1683,6 +1683,21 @@ fn choose_u128_layout() {
)
}
#[mono_test]
fn recursive_call_capturing_function() {
indoc!(
r#"
a = \b ->
c : U32 -> U32
c = \d ->
if True then d else c (d+b)
c 0
a 6
"#
)
}
#[mono_test]
fn call_function_in_empty_list() {
indoc!(