From memory, there’s no difference between [], {}, or (). The compiler will group all tokens inside one the brackets as a single token tree which then gets given to the macro. So by the time the macro gets the token trees, the original type of brackets being used has been erased.

As @tom.prince mentioned, {} are slightly different in that the parser interprets curly braces as a block. So you can have something like error_chain!{} as a top level item, whereas if I used error_chain!() I’d need to put a semicolon at the end to turn it into a valid statement.