This could cause subtle differences in error messages, perhaps these two cases should be combined? If you specify the error string `"#"` (no arguments) you can't add an argument without changing the error string to `r"\# {}"`. This is more of a usability thing, but I think you can merge these cases like:

```rust
macro_rules! report_diag (
    ($f: expr, $name: tt, $msg:expr $($arg: tt)*) => { {
        reg_diag_msg!($name, $msg);
        let msg: &str = format!($msg $($arg)*);
        let f: |&str, &str| -> () = $f;
        f(stringify!($name), msg);
    } }
)
```

Note that using `$($arg:tt)*` you also allow for named arguments. In using `$($arg:expr),*` you're requiring valid rust expressions which I'm not sure `foo = bar, bar = baz` will work, but perhaps it may?