6606: Parse unsafe extern block r=lnicola a=dtolnay
`unsafe extern` block is parsed successfully by rustc, which means it is usable in attribute macro input.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=
6f805556f176d082d87255957f16b5f6
```rust
#[cfg(parse)]
unsafe extern "C++" {
fn demo();
}
```
```diff
SOURCE_FILE@0..52
- ERROR@0..33
+ EXTERN_BLOCK@0..52
ATTR@0..13
POUND@0..1 "#"
L_BRACK@1..2 "["
PATH@2..5
PATH_SEGMENT@2..5
NAME_REF@2..5
IDENT@2..5 "cfg"
TOKEN_TREE@5..12
L_PAREN@5..6 "("
IDENT@6..11 "parse"
R_PAREN@11..12 ")"
R_BRACK@12..13 "]"
WHITESPACE@13..14 "\n"
UNSAFE_KW@14..20 "unsafe"
WHITESPACE@20..21 " "
ABI@21..33
EXTERN_KW@21..27 "extern"
WHITESPACE@27..28 " "
STRING@28..33 "\"C++\""
- WHITESPACE@33..34 " "
- ERROR@34..52
- L_CURLY@34..35 "{"
- WHITESPACE@35..40 "\n "
- FN@40..50
- FN_KW@40..42 "fn"
- WHITESPACE@42..43 " "
- NAME@43..47
- IDENT@43..47 "demo"
- PARAM_LIST@47..49
- L_PAREN@47..48 "("
- R_PAREN@48..49 ")"
- SEMICOLON@49..50 ";"
- WHITESPACE@50..51 "\n"
- R_CURLY@51..52 "}"
+ WHITESPACE@33..34 " "
+ EXTERN_ITEM_LIST@34..52
+ L_CURLY@34..35 "{"
+ WHITESPACE@35..40 "\n "
+ FN@40..50
+ FN_KW@40..42 "fn"
+ WHITESPACE@42..43 " "
+ NAME@43..47
+ IDENT@43..47 "demo"
+ PARAM_LIST@47..49
+ L_PAREN@47..48 "("
+ R_PAREN@48..49 ")"
+ SEMICOLON@49..50 ";"
+ WHITESPACE@50..51 "\n"
+ R_CURLY@51..52 "}"
```
This is of interest for https://github.com/dtolnay/cxx.
Co-authored-by: David Tolnay <dtolnay@gmail.com>