If I don't use it compiles, as it does when using it with a single parameter, but when I used more I get an error saying type ascription is experimental (see issue #23416), which I don't understand.
Type ascription is an unstable feature that lets you do
foo.enumerate().collect(): Vec<_>
instead of
let x: Vec<_> = foo.enumerate().collect();
x
i.e. use a colon to state the type of some expression without assigning it to a variable. See the RFC for more about the motivation.
Sometimes when your program has misplaced colons, the compiler sees it as type ascription.
In addition to the colon that @bluss pointed out it looks like you also have an extra colon on the left-hand side in $($args::tt)*. It should be $($args:tt),* with one fewer colon and a comma to mean they are comma-separated.