[bug report] The compiler moc can't compile the code with a newly created actor type

I have three motoko source file: callee.mo, caller.mo and maker.mo to test composability.
The caller will call the functions in the callee, and the maker will create and install caller in new canister.

source code

source code

callee:

actor class Callee() {
    private var a : Nat = 1;

    public func add1() : async Nat {
        a += 1;
        a
    };

    public query func get() : async Nat {
        a
    };
};

caller:

import Principal "mo:base/Principal";
import Callee "./callee";

actor class Caller(_callee: Principal) {
    public type CalleeActor = actor {
        add1: () -> async Nat;
        get: query () -> async Nat;
    };

    private var calleeHandler : CalleeActor = actor(Principal.toText(_callee));

    public func add1() : async Nat {
        await calleeHandler.add1()
    };

    public func get() : async Nat {
        await calleeHandler.get()
    };
};

maker:

import Array "mo:base/Array";
import Principal "mo:base/Principal";
import Caller "./caller";

actor class Maker() {
    private stable var callers : [Principal] = [];

    public func newCaller(callee: Principal) : async Principal {
        let callerActor = await Caller.Caller(callee);
        let callerId = Principal.fromActor(callerActor);
        callers := Array.append<Principal>(callers, [callerId]);

        callerId
    };

    public query func getcallers() : async [Principal] {
        callers
    };
};

compile result

the callee.mo and the caller.mo is compiled and run successfully, and the maker.mo is failed:

log
$ sudo dfx build maker
Building canisters...
The build step failed for canister 'r7inp-6aaaa-aaaaa-aaabq-cai' with an embedded error: The command '"/Users/flyq/.cache/dfinity/versions/0.6.26/moc" "/Users/flyq/workspace/test/temp/src/maker.mo" "-o" "/Users/flyq/workspace/test/temp/.dfx/local/canisters/maker/maker.wasm" "-c" "--debug" "--actor-idl" "/Users/flyq/workspace/test/temp/.dfx/local/canisters/idl/" "--actor-alias" "maker" "r7inp-6aaaa-aaaaa-aaabq-cai" "--package" "base" "/Users/flyq/.cache/dfinity/versions/0.6.26/base"' failed with exit status 'exit code: 2'.
Stdout:

Stderr:
Fatal error: exception "Assert_failure mo_types/typ_hash.ml:140:13"
Raised at file "mo_types/typ_hash.ml", line 140, characters 13-25
Called from file "lang_utils/expGraph.ml", line 92, characters 22-28
Called from file "list.ml", line 92, characters 20-23
Called from file "lang_utils/expGraph.ml", line 93, characters 18-34
Called from file "list.ml", line 92, characters 20-23
Called from file "lang_utils/expGraph.ml", line 93, characters 18-34
Called from file "lang_utils/expGraph.ml", line 97, characters 10-17
Called from file "mo_types/typ_hash.ml", line 168, characters 11-25
Called from file "codegen/compile.ml", line 5698, characters 36-67
Called from file "codegen/compile.ml", line 5769, characters 6-60
Called from file "codegen/compile.ml", line 7520, characters 4-239
Called from file "codegen/compile.ml", line 7563, characters 20-40
Called from file "codegen/compile.ml", line 7841, characters 17-54
Called from file "codegen/compile.ml", line 7821, characters 30-42
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7872, characters 39-61
Called from file "codegen/compile.ml", line 7551, characters 6-18
Called from file "codegen/compile.ml", line 5540, characters 20-37
Called from file "codegen/compile.ml", line 680, characters 6-18
Called from file "camlinternalLazy.ml", line 31, characters 17-27
Re-raised at file "camlinternalLazy.ml", line 36, characters 4-11
Called from file "codegen/compile.ml", line 7900, characters 6-19
Called from file "codegen/compile.ml", line 7836, characters 39-50
Called from file "codegen/compile.ml", line 7821, characters 30-42
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7869, characters 44-62
Called from file "codegen/compile.ml", line 7872, characters 39-61
Called from file "codegen/compile.ml", line 8063, characters 4-21
Called from file "codegen/compile.ml", line 680, characters 6-18
Called from file "camlinternalLazy.ml", line 31, characters 17-27
Re-raised at file "camlinternalLazy.ml", line 36, characters 4-11
Called from file "codegen/compile.ml" (inlined), line 400, characters 4-49
Called from file "codegen/compile.ml", line 3408, characters 20-43
Called from file "codegen/compile.ml", line 680, characters 6-18
Called from file "codegen/compile.ml", line 3405, characters 18-267
Called from file "codegen/compile.ml", line 8167, characters 6-29
Called from file "pipeline/pipeline.ml", line 625, characters 14-53
Called from file "lang_utils/diag.ml", line 32, characters 27-30
Called from file "lang_utils/diag.ml", line 32, characters 27-30
Called from file "exes/moc.ml", line 143, characters 37-82
Called from file "exes/moc.ml", line 205, characters 4-23

failed with exit status 'exit code: 2' seems to indicate that this is not a problem caused by the source code, because the source code error will produce exit code: 1, and the error will be located in a specific line of the source code. And the caller.mo has been successfully compiled and run before.

solved

Sometime later, making some changes in caller.mo fixes it, in other words, maker.mo is compiled and run successfully when caller.mo is :

caller.mo
import Principal "mo:base/Principal";
import Callee "./callee";

actor class Caller(_callee: Principal) {

    private var calleeHandler : actor {
        add1: () -> async Nat;
        get: query () -> async Nat;
    } = actor(Principal.toText(_callee));

    public func add1() : async Nat {
        await calleeHandler.add1()
    };

    public func get() : async Nat {
        await calleeHandler.get()
    };
};

The only changes is deleting type CalleeActor, and everythings are ok.

Thanks for the very detailed bug report. I’ll investigate. I take it you have a workaround so are not blocked on this?

I’m not blocked on this, thx

This has now been fixed (might take a dfx release or two to surface). Thanks again for reporting the bug!

5 Likes