This PR makes the compiler traces contain more information about the kind of `inc`/`dec` that are being conducted (`persistent`, `checked` etc.)
51 lines
1.5 KiB
Text
51 lines
1.5 KiB
Text
/-!
|
|
This test asserts that the compiler is able to handle compilation of functions that recurse through
|
|
nested arrays in a way that does not unnecessarily remove borrow annotations.
|
|
-/
|
|
|
|
|
|
inductive NAryTree where
|
|
| tip (x : String)
|
|
| node (ys : Array NAryTree)
|
|
deriving Inhabited
|
|
|
|
/--
|
|
trace: [Compiler.explicitRc] size: 19
|
|
def followPath @&tree @&path : obj :=
|
|
cases tree : obj
|
|
| NAryTree.tip =>
|
|
cases path : obj
|
|
| List.nil =>
|
|
let x.1 := oproj[0] tree;
|
|
inc[ref] x.1;
|
|
return x.1
|
|
| _ =>
|
|
let _x.2 := instInhabitedNAryTree.default._closed_0;
|
|
return _x.2
|
|
| NAryTree.node =>
|
|
cases path : obj
|
|
| List.cons =>
|
|
let ys.3 := oproj[0] tree;
|
|
let head.4 := oproj[0] path;
|
|
let tail.5 := oproj[1] path;
|
|
let _x.6 := instInhabitedNAryTree.default;
|
|
let _x.7 := Array.get!InternalBorrowed ◾ _x.6 ys.3 head.4;
|
|
let _x.8 := followPath _x.7 tail.5;
|
|
return _x.8
|
|
| _ =>
|
|
let _x.9 := instInhabitedNAryTree.default._closed_0;
|
|
return _x.9
|
|
[Compiler.explicitRc] size: 3
|
|
def followPath._boxed tree path : obj :=
|
|
let res := followPath tree path;
|
|
dec path;
|
|
dec[ref] tree;
|
|
return res
|
|
-/
|
|
#guard_msgs in
|
|
set_option trace.Compiler.explicitRc true in
|
|
def followPath (tree : NAryTree) (path : List Nat) : String :=
|
|
match tree, path with
|
|
| .tip x, [] => x
|
|
| .node ys, idx :: path => followPath ys[idx]! path
|
|
| _, _ => default
|