and that’s why you get the infinite recursion. Passing around args... is useful for compact code, but sometimes leads to cryptic error messages. Perhaps an idiom that allowed passing a bunch of arguments in groups, not unlike COMMON-LISP:&WHOLE, would be helpful?
I think there is an issue here that is worth discussion, ie how to implement this rather common pattern so that it leads to better output from methods (join(args...) is not really informative), better error reporting, etc. So perhaps open an issue, after checking that it does not exist, about this broader question.
It’s worth reporting, or even better make a PR. It should really be a MethodError and replacing the join(args...) catchall method with specific versions for one to three arguments would solve it. Alternatively a join(io::IO, args...) method could be added to stop the recursion and throw an error.