Prevent type ascription misdiagnosis

This commit is contained in:
David Tolnay 2020-06-28 22:38:59 -07:00
parent 4a948df6f6
commit 0443daa488
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
3 changed files with 17 additions and 13 deletions

View File

@ -224,6 +224,11 @@ macro_rules! json_internal {
json_internal!(@object $object ($key) (: $($rest)*) (: $($rest)*));
};
// Refuse to absorb colon token into key expression.
(@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
json_expect_expr_comma!($($unexpected)+);
};
// Munch a token into the current key.
(@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
json_internal!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
@ -290,3 +295,9 @@ macro_rules! json_internal_vec {
macro_rules! json_unexpected {
() => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! json_expect_expr_comma {
($e:expr ,) => {};
}

View File

@ -1,10 +1,5 @@
error: expected type, found `""`
--> $DIR/missing_comma.rs:4:18
error: no rules expected the token `"2"`
--> $DIR/missing_comma.rs:4:21
|
4 | json!({ "1": "" "2": "" });
| - ^^ expected type
| |
| tried to parse a type due to this type ascription
|
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
| ^^^ no rules expected this token in macro call

View File

@ -1,7 +1,5 @@
error: unexpected end of macro invocation
--> $DIR/parse_expr.rs:4:5
error: no rules expected the token `~`
--> $DIR/parse_expr.rs:4:19
|
4 | json!({ "a" : ~ });
| ^^^^^^^^^^^^^^^^^^^ missing tokens in macro arguments
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
| ^ no rules expected this token in macro call