mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-02 19:32:17 +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 {:?}",
|
||||
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());
|
||||
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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 [];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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):
|
||||
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;
|
||||
|
|
|
@ -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!(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue