The second `template foo` is fully untyped, while the first one has a typed argument. Fully untyped macros/templates get transformed early at a syntax level in generic procs so they sometimes bypass generic prechecks. (For now anyway)
The `bind` behavior was added later as a quick workaround to keep old behavior in cases where the compiler gives a direct warning, it should probably be avoided in a more straightforward way like just renaming the value. Similar to how you would deal with: let foo = 123 block: let foo = 456 # how to access the old foo? Run