mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 05:49:08 +00:00
update mono tests
This commit is contained in:
commit
c0ace1ee0b
19 changed files with 274 additions and 228 deletions
|
@ -7646,23 +7646,19 @@ fn call_by_name_help<'a>(
|
||||||
"see call_by_name for background (scroll down a bit), function is {:?}",
|
"see call_by_name for background (scroll down a bit), function is {:?}",
|
||||||
proc_name,
|
proc_name,
|
||||||
);
|
);
|
||||||
|
call_specialized_proc(
|
||||||
let field_symbols = field_symbols.into_bump_slice();
|
env,
|
||||||
|
procs,
|
||||||
let call = self::Call {
|
proc_name,
|
||||||
call_type: CallType::ByName {
|
lambda_set,
|
||||||
name: proc_name,
|
RawFunctionLayout::Function(argument_layouts, lambda_set, ret_layout),
|
||||||
ret_layout,
|
top_level_layout,
|
||||||
arg_layouts: argument_layouts,
|
field_symbols.into_bump_slice(),
|
||||||
specialization_id: env.next_call_specialization_id(),
|
loc_args,
|
||||||
},
|
layout_cache,
|
||||||
arguments: field_symbols,
|
assigned,
|
||||||
};
|
hole,
|
||||||
|
)
|
||||||
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)
|
|
||||||
} else if env.is_imported_symbol(proc_name.name()) {
|
} else if env.is_imported_symbol(proc_name.name()) {
|
||||||
add_needed_external(procs, env, original_fn_var, proc_name);
|
add_needed_external(procs, env, original_fn_var, proc_name);
|
||||||
|
|
||||||
|
@ -7739,52 +7735,21 @@ fn call_by_name_help<'a>(
|
||||||
proc_name,
|
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 field_symbols = field_symbols.into_bump_slice();
|
||||||
|
|
||||||
let call = self::Call {
|
call_specialized_proc(
|
||||||
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,
|
env,
|
||||||
lambda_set,
|
procs,
|
||||||
proc_name,
|
proc_name,
|
||||||
captured.iter(),
|
lambda_set,
|
||||||
closure_argument,
|
RawFunctionLayout::Function(argument_layouts, lambda_set, ret_layout),
|
||||||
env.arena.alloc(result),
|
top_level_layout,
|
||||||
|
field_symbols,
|
||||||
|
loc_args,
|
||||||
|
layout_cache,
|
||||||
|
assigned,
|
||||||
|
hole,
|
||||||
)
|
)
|
||||||
} else {
|
|
||||||
result
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
PendingSpecializations::Making => {
|
PendingSpecializations::Making => {
|
||||||
let opt_partial_proc = procs.partial_procs.symbol_to_id(proc_name.name());
|
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,
|
partial_proc,
|
||||||
) {
|
) {
|
||||||
Ok((proc, layout)) => {
|
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
|
// now we just call our freshly-specialized function
|
||||||
call_specialized_proc(
|
call_specialized_proc(
|
||||||
env,
|
env,
|
||||||
procs,
|
procs,
|
||||||
proc,
|
proc_name,
|
||||||
lambda_set,
|
lambda_set,
|
||||||
layout,
|
layout,
|
||||||
|
function_layout,
|
||||||
field_symbols,
|
field_symbols,
|
||||||
loc_args,
|
loc_args,
|
||||||
layout_cache,
|
layout_cache,
|
||||||
|
@ -7831,12 +7809,25 @@ fn call_by_name_help<'a>(
|
||||||
attempted_layout,
|
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(
|
call_specialized_proc(
|
||||||
env,
|
env,
|
||||||
procs,
|
procs,
|
||||||
proc,
|
proc_name,
|
||||||
lambda_set,
|
lambda_set,
|
||||||
attempted_layout,
|
attempted_layout,
|
||||||
|
function_layout,
|
||||||
field_symbols,
|
field_symbols,
|
||||||
loc_args,
|
loc_args,
|
||||||
layout_cache,
|
layout_cache,
|
||||||
|
@ -7985,22 +7976,16 @@ fn call_by_name_module_thunk<'a>(
|
||||||
fn call_specialized_proc<'a>(
|
fn call_specialized_proc<'a>(
|
||||||
env: &mut Env<'a, '_>,
|
env: &mut Env<'a, '_>,
|
||||||
procs: &mut Procs<'a>,
|
procs: &mut Procs<'a>,
|
||||||
proc: Proc<'a>,
|
proc_name: LambdaName<'a>,
|
||||||
lambda_set: LambdaSet<'a>,
|
lambda_set: LambdaSet<'a>,
|
||||||
layout: RawFunctionLayout<'a>,
|
layout: RawFunctionLayout<'a>,
|
||||||
|
function_layout: ProcLayout<'a>,
|
||||||
field_symbols: &'a [Symbol],
|
field_symbols: &'a [Symbol],
|
||||||
loc_args: std::vec::Vec<(Variable, Loc<roc_can::expr::Expr>)>,
|
loc_args: std::vec::Vec<(Variable, Loc<roc_can::expr::Expr>)>,
|
||||||
layout_cache: &mut LayoutCache<'a>,
|
layout_cache: &mut LayoutCache<'a>,
|
||||||
assigned: Symbol,
|
assigned: Symbol,
|
||||||
hole: &'a Stmt<'a>,
|
hole: &'a Stmt<'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() {
|
if field_symbols.is_empty() {
|
||||||
debug_assert!(loc_args.is_empty());
|
debug_assert!(loc_args.is_empty());
|
||||||
|
|
||||||
|
|
|
@ -3624,3 +3624,22 @@ fn lambda_capture_niches_have_captured_function_in_closure() {
|
||||||
(RocStr, RocStr)
|
(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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ procedure Test.2 (Test.3):
|
||||||
ret Test.6;
|
ret Test.6;
|
||||||
|
|
||||||
procedure Test.8 (Test.9):
|
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 ():
|
procedure Test.0 ():
|
||||||
let Test.1 : List {} = Array [];
|
let Test.1 : List {} = Array [];
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.298 : U64 = CallByName List.6 List.77;
|
let List.297 : U64 = CallByName List.6 List.77;
|
||||||
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
|
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
|
||||||
if List.294 then
|
if List.294 then
|
||||||
let List.296 : {} = CallByName List.60 List.77 List.78;
|
let List.296 : {} = CallByName List.60 List.77 List.78;
|
||||||
let List.295 : [C {}, C {}] = TagId(1) List.296;
|
let List.295 : [C {}, C {}] = TagId(1) List.296;
|
||||||
|
@ -11,12 +11,12 @@ procedure List.2 (List.77, List.78):
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.301 : U64 = lowlevel ListLen #Attr.2;
|
let List.299 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.301;
|
ret List.299;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.300 : {} = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.298 : {} = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.300;
|
ret List.298;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
procedure List.4 (List.88, List.89):
|
procedure List.4 (List.88, List.89):
|
||||||
let List.295 : U64 = 1i64;
|
let List.294 : U64 = 1i64;
|
||||||
let List.293 : List U8 = CallByName List.65 List.88 List.295;
|
let List.293 : List U8 = CallByName List.65 List.88 List.294;
|
||||||
let List.292 : List U8 = CallByName List.66 List.293 List.89;
|
let List.292 : List U8 = CallByName List.66 List.293 List.89;
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.65 (#Attr.2, #Attr.3):
|
procedure List.65 (#Attr.2, #Attr.3):
|
||||||
let List.298 : List U8 = lowlevel ListReserve #Attr.2 #Attr.3;
|
let List.296 : List U8 = lowlevel ListReserve #Attr.2 #Attr.3;
|
||||||
ret List.298;
|
ret List.296;
|
||||||
|
|
||||||
procedure List.66 (#Attr.2, #Attr.3):
|
procedure List.66 (#Attr.2, #Attr.3):
|
||||||
let List.297 : List U8 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
|
let List.295 : List U8 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.297;
|
ret List.295;
|
||||||
|
|
||||||
procedure Test.20 (Test.22):
|
procedure Test.20 (Test.22):
|
||||||
let Test.34 : {U8} = Struct {Test.22};
|
let Test.34 : {U8} = Struct {Test.22};
|
||||||
|
|
|
@ -3,16 +3,16 @@ procedure Bool.7 (#Attr.2, #Attr.3):
|
||||||
ret Bool.9;
|
ret Bool.9;
|
||||||
|
|
||||||
procedure Num.39 (#Attr.2, #Attr.3):
|
procedure Num.39 (#Attr.2, #Attr.3):
|
||||||
let Num.264 : I64 = lowlevel NumDivUnchecked #Attr.2 #Attr.3;
|
let Num.263 : I64 = lowlevel NumDivUnchecked #Attr.2 #Attr.3;
|
||||||
ret Num.264;
|
ret Num.263;
|
||||||
|
|
||||||
procedure Num.40 (Num.229, Num.230):
|
procedure Num.40 (Num.229, Num.230):
|
||||||
let Num.263 : I64 = 0i64;
|
let Num.262 : I64 = 0i64;
|
||||||
let Num.260 : Int1 = CallByName Bool.7 Num.230 Num.263;
|
let Num.259 : Int1 = CallByName Bool.7 Num.230 Num.262;
|
||||||
if Num.260 then
|
if Num.259 then
|
||||||
let Num.262 : {} = Struct {};
|
let Num.261 : {} = Struct {};
|
||||||
let Num.261 : [C {}, C I64] = TagId(0) Num.262;
|
let Num.260 : [C {}, C I64] = TagId(0) Num.261;
|
||||||
ret Num.261;
|
ret Num.260;
|
||||||
else
|
else
|
||||||
let Num.258 : I64 = CallByName Num.39 Num.229 Num.230;
|
let Num.258 : I64 = CallByName Num.39 Num.229 Num.230;
|
||||||
let Num.257 : [C {}, C I64] = TagId(1) Num.258;
|
let Num.257 : [C {}, C I64] = TagId(1) Num.258;
|
||||||
|
|
|
@ -3,24 +3,24 @@ procedure Bool.7 (#Attr.2, #Attr.3):
|
||||||
ret Bool.9;
|
ret Bool.9;
|
||||||
|
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.307 : U64 = CallByName List.6 List.77;
|
let List.306 : U64 = CallByName List.6 List.77;
|
||||||
let List.303 : Int1 = CallByName Num.22 List.78 List.307;
|
let List.302 : Int1 = CallByName Num.22 List.78 List.306;
|
||||||
if List.303 then
|
if List.302 then
|
||||||
let List.305 : I64 = CallByName List.60 List.77 List.78;
|
let List.304 : I64 = CallByName List.60 List.77 List.78;
|
||||||
let List.304 : [C {}, C I64] = TagId(1) List.305;
|
let List.303 : [C {}, C I64] = TagId(1) List.304;
|
||||||
ret List.304;
|
ret List.303;
|
||||||
else
|
else
|
||||||
let List.302 : {} = Struct {};
|
let List.301 : {} = Struct {};
|
||||||
let List.301 : [C {}, C I64] = TagId(0) List.302;
|
let List.300 : [C {}, C I64] = TagId(0) List.301;
|
||||||
ret List.301;
|
ret List.300;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.308 : U64 = lowlevel ListLen #Attr.2;
|
let List.307 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.308;
|
ret List.307;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.306 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.305 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.306;
|
ret List.305;
|
||||||
|
|
||||||
procedure List.9 (List.205):
|
procedure List.9 (List.205):
|
||||||
let List.299 : U64 = 0i64;
|
let List.299 : U64 = 0i64;
|
||||||
|
@ -46,22 +46,22 @@ procedure Str.27 (Str.88):
|
||||||
ret Str.194;
|
ret Str.194;
|
||||||
|
|
||||||
procedure Str.47 (#Attr.2):
|
procedure Str.47 (#Attr.2):
|
||||||
let Str.203 : {I64, U8} = lowlevel StrToNum #Attr.2;
|
let Str.202 : {I64, U8} = lowlevel StrToNum #Attr.2;
|
||||||
ret Str.203;
|
ret Str.202;
|
||||||
|
|
||||||
procedure Str.67 (Str.189):
|
procedure Str.67 (Str.189):
|
||||||
let Str.190 : {I64, U8} = CallByName Str.47 Str.189;
|
let Str.190 : {I64, U8} = CallByName Str.47 Str.189;
|
||||||
let Str.201 : U8 = StructAtIndex 1 Str.190;
|
let Str.200 : U8 = StructAtIndex 1 Str.190;
|
||||||
let Str.202 : U8 = 0i64;
|
let Str.201 : U8 = 0i64;
|
||||||
let Str.198 : Int1 = CallByName Bool.7 Str.201 Str.202;
|
let Str.197 : Int1 = CallByName Bool.7 Str.200 Str.201;
|
||||||
if Str.198 then
|
if Str.197 then
|
||||||
let Str.200 : I64 = StructAtIndex 0 Str.190;
|
let Str.199 : I64 = StructAtIndex 0 Str.190;
|
||||||
let Str.199 : [C Int1, C I64] = TagId(1) Str.200;
|
let Str.198 : [C Int1, C I64] = TagId(1) Str.199;
|
||||||
ret Str.199;
|
ret Str.198;
|
||||||
else
|
else
|
||||||
let Str.197 : Int1 = false;
|
let Str.196 : Int1 = false;
|
||||||
let Str.196 : [C Int1, C I64] = TagId(0) Str.197;
|
let Str.195 : [C Int1, C I64] = TagId(0) Str.196;
|
||||||
ret Str.196;
|
ret Str.195;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.4 : Int1 = true;
|
let Test.4 : Int1 = true;
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
procedure List.4 (List.88, List.89):
|
procedure List.4 (List.88, List.89):
|
||||||
let List.295 : U64 = 1i64;
|
let List.294 : U64 = 1i64;
|
||||||
let List.293 : List I64 = CallByName List.65 List.88 List.295;
|
let List.293 : List I64 = CallByName List.65 List.88 List.294;
|
||||||
let List.292 : List I64 = CallByName List.66 List.293 List.89;
|
let List.292 : List I64 = CallByName List.66 List.293 List.89;
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.65 (#Attr.2, #Attr.3):
|
procedure List.65 (#Attr.2, #Attr.3):
|
||||||
let List.298 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
|
let List.296 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
|
||||||
ret List.298;
|
ret List.296;
|
||||||
|
|
||||||
procedure List.66 (#Attr.2, #Attr.3):
|
procedure List.66 (#Attr.2, #Attr.3):
|
||||||
let List.297 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
|
let List.295 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.297;
|
ret List.295;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.2 : List I64 = Array [1i64];
|
let Test.2 : List I64 = Array [1i64];
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
procedure List.4 (List.88, List.89):
|
procedure List.4 (List.88, List.89):
|
||||||
let List.295 : U64 = 1i64;
|
let List.294 : U64 = 1i64;
|
||||||
let List.293 : List I64 = CallByName List.65 List.88 List.295;
|
let List.293 : List I64 = CallByName List.65 List.88 List.294;
|
||||||
let List.292 : List I64 = CallByName List.66 List.293 List.89;
|
let List.292 : List I64 = CallByName List.66 List.293 List.89;
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.65 (#Attr.2, #Attr.3):
|
procedure List.65 (#Attr.2, #Attr.3):
|
||||||
let List.298 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
|
let List.296 : List I64 = lowlevel ListReserve #Attr.2 #Attr.3;
|
||||||
ret List.298;
|
ret List.296;
|
||||||
|
|
||||||
procedure List.66 (#Attr.2, #Attr.3):
|
procedure List.66 (#Attr.2, #Attr.3):
|
||||||
let List.297 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
|
let List.295 : List I64 = lowlevel ListAppendUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.297;
|
ret List.295;
|
||||||
|
|
||||||
procedure Test.1 (Test.2):
|
procedure Test.1 (Test.2):
|
||||||
let Test.6 : I64 = 42i64;
|
let Test.6 : I64 = 42i64;
|
||||||
|
|
|
@ -6,22 +6,22 @@ procedure List.3 (List.85, List.86, List.87):
|
||||||
ret List.294;
|
ret List.294;
|
||||||
|
|
||||||
procedure List.57 (List.82, List.83, List.84):
|
procedure List.57 (List.82, List.83, List.84):
|
||||||
let List.301 : U64 = CallByName List.6 List.82;
|
let List.300 : U64 = CallByName List.6 List.82;
|
||||||
let List.298 : Int1 = CallByName Num.22 List.83 List.301;
|
let List.297 : Int1 = CallByName Num.22 List.83 List.300;
|
||||||
if List.298 then
|
if List.297 then
|
||||||
let List.299 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
let List.298 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
||||||
ret List.299;
|
ret List.298;
|
||||||
else
|
else
|
||||||
let List.297 : {List I64, I64} = Struct {List.82, List.84};
|
let List.296 : {List I64, I64} = Struct {List.82, List.84};
|
||||||
ret List.297;
|
ret List.296;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.293 : U64 = lowlevel ListLen #Attr.2;
|
let List.293 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.293;
|
ret List.293;
|
||||||
|
|
||||||
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
let List.300 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
let List.299 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
||||||
ret List.300;
|
ret List.299;
|
||||||
|
|
||||||
procedure Num.19 (#Attr.2, #Attr.3):
|
procedure Num.19 (#Attr.2, #Attr.3):
|
||||||
let Num.257 : U64 = lowlevel NumAdd #Attr.2 #Attr.3;
|
let Num.257 : U64 = lowlevel NumAdd #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.298 : U64 = CallByName List.6 List.77;
|
let List.297 : U64 = CallByName List.6 List.77;
|
||||||
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
|
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
|
||||||
if List.294 then
|
if List.294 then
|
||||||
let List.296 : I64 = CallByName List.60 List.77 List.78;
|
let List.296 : I64 = CallByName List.60 List.77 List.78;
|
||||||
let List.295 : [C {}, C I64] = TagId(1) List.296;
|
let List.295 : [C {}, C I64] = TagId(1) List.296;
|
||||||
|
@ -11,12 +11,12 @@ procedure List.2 (List.77, List.78):
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.301 : U64 = lowlevel ListLen #Attr.2;
|
let List.299 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.301;
|
ret List.299;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.300 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.298 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.300;
|
ret List.298;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.298 : U64 = CallByName List.6 List.77;
|
let List.297 : U64 = CallByName List.6 List.77;
|
||||||
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
|
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
|
||||||
if List.294 then
|
if List.294 then
|
||||||
let List.296 : Str = CallByName List.60 List.77 List.78;
|
let List.296 : Str = CallByName List.60 List.77 List.78;
|
||||||
let List.295 : [C {}, C Str] = TagId(1) List.296;
|
let List.295 : [C {}, C Str] = TagId(1) List.296;
|
||||||
|
@ -11,16 +11,16 @@ procedure List.2 (List.77, List.78):
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.5 (#Attr.2, #Attr.3):
|
procedure List.5 (#Attr.2, #Attr.3):
|
||||||
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;
|
||||||
ret List.300;
|
ret List.298;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.302 : U64 = lowlevel ListLen #Attr.2;
|
let List.300 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.302;
|
ret List.300;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.301 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.299 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.301;
|
ret List.299;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.298 : U64 = CallByName List.6 List.77;
|
let List.297 : U64 = CallByName List.6 List.77;
|
||||||
let List.294 : Int1 = CallByName Num.22 List.78 List.298;
|
let List.294 : Int1 = CallByName Num.22 List.78 List.297;
|
||||||
if List.294 then
|
if List.294 then
|
||||||
let List.296 : Str = CallByName List.60 List.77 List.78;
|
let List.296 : Str = CallByName List.60 List.77 List.78;
|
||||||
let List.295 : [C {}, C Str] = TagId(1) List.296;
|
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):
|
procedure List.5 (#Attr.2, #Attr.3):
|
||||||
inc #Attr.2;
|
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;
|
decref #Attr.2;
|
||||||
ret List.300;
|
ret List.298;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.302 : U64 = lowlevel ListLen #Attr.2;
|
let List.300 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.302;
|
ret List.300;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.301 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.299 : Str = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.301;
|
ret List.299;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -6,22 +6,22 @@ procedure List.3 (List.85, List.86, List.87):
|
||||||
ret List.292;
|
ret List.292;
|
||||||
|
|
||||||
procedure List.57 (List.82, List.83, List.84):
|
procedure List.57 (List.82, List.83, List.84):
|
||||||
let List.299 : U64 = CallByName List.6 List.82;
|
let List.298 : U64 = CallByName List.6 List.82;
|
||||||
let List.296 : Int1 = CallByName Num.22 List.83 List.299;
|
let List.295 : Int1 = CallByName Num.22 List.83 List.298;
|
||||||
if List.296 then
|
if List.295 then
|
||||||
let List.297 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
let List.296 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
||||||
ret List.297;
|
ret List.296;
|
||||||
else
|
else
|
||||||
let List.295 : {List I64, I64} = Struct {List.82, List.84};
|
let List.294 : {List I64, I64} = Struct {List.82, List.84};
|
||||||
ret List.295;
|
ret List.294;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.300 : U64 = lowlevel ListLen #Attr.2;
|
let List.299 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.300;
|
ret List.299;
|
||||||
|
|
||||||
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
let List.298 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
let List.297 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
||||||
ret List.298;
|
ret List.297;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.257 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
procedure List.28 (#Attr.2, #Attr.3):
|
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;
|
let Bool.9 : Int1 = lowlevel ListIsUnique #Attr.2;
|
||||||
if Bool.9 then
|
if Bool.9 then
|
||||||
ret List.295;
|
ret List.294;
|
||||||
else
|
else
|
||||||
decref #Attr.2;
|
decref #Attr.2;
|
||||||
ret List.295;
|
ret List.294;
|
||||||
|
|
||||||
procedure List.54 (List.200):
|
procedure List.54 (List.200):
|
||||||
let List.293 : {} = Struct {};
|
let List.293 : {} = Struct {};
|
||||||
|
|
|
@ -1,43 +1,43 @@
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.312 : U64 = CallByName List.6 List.77;
|
let List.307 : U64 = CallByName List.6 List.77;
|
||||||
let List.308 : Int1 = CallByName Num.22 List.78 List.312;
|
let List.304 : Int1 = CallByName Num.22 List.78 List.307;
|
||||||
if List.308 then
|
if List.304 then
|
||||||
let List.310 : I64 = CallByName List.60 List.77 List.78;
|
let List.306 : I64 = CallByName List.60 List.77 List.78;
|
||||||
let List.309 : [C {}, C I64] = TagId(1) List.310;
|
let List.305 : [C {}, C I64] = TagId(1) List.306;
|
||||||
ret List.309;
|
ret List.305;
|
||||||
else
|
else
|
||||||
let List.307 : {} = Struct {};
|
let List.303 : {} = Struct {};
|
||||||
let List.306 : [C {}, C I64] = TagId(0) List.307;
|
let List.302 : [C {}, C I64] = TagId(0) List.303;
|
||||||
ret List.306;
|
ret List.302;
|
||||||
|
|
||||||
procedure List.3 (List.85, List.86, List.87):
|
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, I64} = CallByName List.57 List.85 List.86 List.87;
|
||||||
let List.295 : List I64 = StructAtIndex 0 List.296;
|
let List.294 : List I64 = StructAtIndex 0 List.295;
|
||||||
inc List.295;
|
inc List.294;
|
||||||
dec List.296;
|
dec List.295;
|
||||||
ret List.295;
|
ret List.294;
|
||||||
|
|
||||||
procedure List.57 (List.82, List.83, List.84):
|
procedure List.57 (List.82, List.83, List.84):
|
||||||
let List.318 : U64 = CallByName List.6 List.82;
|
let List.312 : U64 = CallByName List.6 List.82;
|
||||||
let List.315 : Int1 = CallByName Num.22 List.83 List.318;
|
let List.309 : Int1 = CallByName Num.22 List.83 List.312;
|
||||||
if List.315 then
|
if List.309 then
|
||||||
let List.316 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
let List.310 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
||||||
ret List.316;
|
ret List.310;
|
||||||
else
|
else
|
||||||
let List.314 : {List I64, I64} = Struct {List.82, List.84};
|
let List.308 : {List I64, I64} = Struct {List.82, List.84};
|
||||||
ret List.314;
|
ret List.308;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.319 : U64 = lowlevel ListLen #Attr.2;
|
let List.313 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.319;
|
ret List.313;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.320 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.314 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.320;
|
ret List.314;
|
||||||
|
|
||||||
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
let List.317 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
let List.311 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
||||||
ret List.317;
|
ret List.311;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.259 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.259 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -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;
|
|
@ -1,43 +1,43 @@
|
||||||
procedure List.2 (List.77, List.78):
|
procedure List.2 (List.77, List.78):
|
||||||
let List.312 : U64 = CallByName List.6 List.77;
|
let List.307 : U64 = CallByName List.6 List.77;
|
||||||
let List.308 : Int1 = CallByName Num.22 List.78 List.312;
|
let List.304 : Int1 = CallByName Num.22 List.78 List.307;
|
||||||
if List.308 then
|
if List.304 then
|
||||||
let List.310 : I64 = CallByName List.60 List.77 List.78;
|
let List.306 : I64 = CallByName List.60 List.77 List.78;
|
||||||
let List.309 : [C {}, C I64] = TagId(1) List.310;
|
let List.305 : [C {}, C I64] = TagId(1) List.306;
|
||||||
ret List.309;
|
ret List.305;
|
||||||
else
|
else
|
||||||
let List.307 : {} = Struct {};
|
let List.303 : {} = Struct {};
|
||||||
let List.306 : [C {}, C I64] = TagId(0) List.307;
|
let List.302 : [C {}, C I64] = TagId(0) List.303;
|
||||||
ret List.306;
|
ret List.302;
|
||||||
|
|
||||||
procedure List.3 (List.85, List.86, List.87):
|
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, I64} = CallByName List.57 List.85 List.86 List.87;
|
||||||
let List.295 : List I64 = StructAtIndex 0 List.296;
|
let List.294 : List I64 = StructAtIndex 0 List.295;
|
||||||
inc List.295;
|
inc List.294;
|
||||||
dec List.296;
|
dec List.295;
|
||||||
ret List.295;
|
ret List.294;
|
||||||
|
|
||||||
procedure List.57 (List.82, List.83, List.84):
|
procedure List.57 (List.82, List.83, List.84):
|
||||||
let List.318 : U64 = CallByName List.6 List.82;
|
let List.312 : U64 = CallByName List.6 List.82;
|
||||||
let List.315 : Int1 = CallByName Num.22 List.83 List.318;
|
let List.309 : Int1 = CallByName Num.22 List.83 List.312;
|
||||||
if List.315 then
|
if List.309 then
|
||||||
let List.316 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
let List.310 : {List I64, I64} = CallByName List.61 List.82 List.83 List.84;
|
||||||
ret List.316;
|
ret List.310;
|
||||||
else
|
else
|
||||||
let List.314 : {List I64, I64} = Struct {List.82, List.84};
|
let List.308 : {List I64, I64} = Struct {List.82, List.84};
|
||||||
ret List.314;
|
ret List.308;
|
||||||
|
|
||||||
procedure List.6 (#Attr.2):
|
procedure List.6 (#Attr.2):
|
||||||
let List.319 : U64 = lowlevel ListLen #Attr.2;
|
let List.313 : U64 = lowlevel ListLen #Attr.2;
|
||||||
ret List.319;
|
ret List.313;
|
||||||
|
|
||||||
procedure List.60 (#Attr.2, #Attr.3):
|
procedure List.60 (#Attr.2, #Attr.3):
|
||||||
let List.320 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let List.314 : I64 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
ret List.320;
|
ret List.314;
|
||||||
|
|
||||||
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
procedure List.61 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
let List.317 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
let List.311 : {List I64, I64} = lowlevel ListReplaceUnsafe #Attr.2 #Attr.3 #Attr.4;
|
||||||
ret List.317;
|
ret List.311;
|
||||||
|
|
||||||
procedure Num.22 (#Attr.2, #Attr.3):
|
procedure Num.22 (#Attr.2, #Attr.3):
|
||||||
let Num.259 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
let Num.259 : Int1 = lowlevel NumLt #Attr.2 #Attr.3;
|
||||||
|
|
|
@ -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]
|
#[mono_test]
|
||||||
fn call_function_in_empty_list() {
|
fn call_function_in_empty_list() {
|
||||||
indoc!(
|
indoc!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue