Well, as long as generic proc's can't be precompiled, in fact rendering an (untyped) AST only, a complete type-check can't be performed.
That aside, we define at first our template, the fn1, basically an identity function > template fn1(a: typed) = a and now, a function without generics proc bar3(a: aliassym fn1 , b: int) : int = a(b) ... and this will compile or it _could_ compile at least, presumed that the proc body returns an int (what it does with the witness fn1). The proc gets marked with "overloadable", because other templates could be passed. The newly passed template could e.g. have an `echo a` or something else. Anyway, the type-related behaviour is completely defined by the witness.