I think this might be better to put this before `.parse_opt_abis`. i.e.

```rust
if self.is_keyword(keywords::Extern) { 
    let next_is_mod = self.eat_keyword(keywords::Mod);
    if self.eat_keyword(keywords::Crate) || next_is_mod { 
        if next_is_mod { self.span_note(...) }
        self.parse_item_extern_crate(lo, visibility, attrs);
    }

    let opt_abis = self.parse_opt_abis();
    if self.eat_keyword(keywords::Fn) { ... }
    ...
}
```

This means that `extern "ABI" crate blah;` is an "unexpected token `crate`" error, which seems reasonable. Although the keeping it the way it is now seems ok-ish.

Also, as I hinted in then code above above, wouldn't this be better as (something equivalent to) `self.eat_keyword(keywords::Crate) || self.eat_keyword(keywords::Mod)` rather than duplicating the logic below?