
ValidProc :: proc(): int {return 1;}
ProcPointer: proc(): int = ValidProc;

ProcT :: typedef proc(): int; @weak
ProcP: ProcT;

main :: proc(): int {
    ProcPointer = ValidProc;
    ProcPointer = nil;

    ProcP = ValidProc;
    ProcP = nil;

    v: *void;
    ProcP = v;
    ProcPointer = v;

    ProcP = nil;

    ProcPointer = ValidProc;
    value := ProcPointer(); @unused

    ProcP = ValidProc;
    ProcP();

    v = ProcPointer;
    ProcP = ProcPointer;
    vv := :*void(ProcPointer);

    pv := :ProcT(vv); @unused

    pv2 := :proc(): int(vv); @unused

    a: *int;
    b := :ProcT(a); @unused

    c := &ProcP; @unused

    return 0;
}

FP :: typedef proc(i: int = 10);

Thing :: struct {
    fp: FP;
    fp2: proc(i: int);
}

glob0: FP;
glob1: proc(j: int);

Another :: proc() {
    thing: Thing;
    thing.fp();
    thing.fp2(10);

    var0: FP;
    var1: proc(j: int);

    var0();
    var1(j = 10);

    glob0();
    glob1(j = 10);
}