Change:
<ins> error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:10:5 | LL |     vec![1, 2, 3] as Vec<i32>[0]; |     ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(vec![1, 2, 3] as Vec<i32>)` error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:12:5 | LL |     vec![1, 2, 3]: Vec<i32>[0]; |     ^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(vec![1, 2, 3]: Vec<i32>)` error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:17:5 | LL |     (&[0]) as &[i32][0]; |     ^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `((&[0]) as &[i32])` error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:19:5 | LL |     (&[0i32]): &[i32; 1][0]; |     ^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `((&[0i32]): &[i32; 1])` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:39:13 | LL |     let _ = 0i32: i32: i32.count_ones(); |             ^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(0i32: i32: i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:41:13 | LL |     let _ = 0 as i32: i32.count_ones(); |             ^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(0 as i32: i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:43:13 | LL |     let _ = 0i32: i32 as i32.count_ones(); |             ^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(0i32: i32 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:45:13 | LL |     let _ = 0 as i32 as i32.count_ones(); |             ^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(0 as i32 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:47:13 | LL |     let _ = 0i32: i32: i32 as u32 as i32.count_ones(); |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(0i32: i32: i32 as u32 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:49:13 | LL |     let _ = 0i32: i32.count_ones(): u32; |             ^^^^^^^^^ help: try surrounding the expression in parentheses: `(0i32: i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:51:13 | LL |     let _ = 0 as i32.count_ones(): u32; |             ^^^^^^^^ help: try surrounding the expression in parentheses: `(0 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:53:13 | LL |     let _ = 0i32: i32.count_ones() as u32; |             ^^^^^^^^^ help: try surrounding the expression in parentheses: `(0i32: i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:55:13 | LL |     let _ = 0 as i32.count_ones() as u32; |             ^^^^^^^^ help: try surrounding the expression in parentheses: `(0 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:57:13 | LL |     let _ = 0i32: i32: i32.count_ones() as u32 as i32; |             ^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(0i32: i32: i32)` error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:63:18 | LL |     let x: i32 = &vec![1, 2, 3] as &Vec<i32>[0]; |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(&vec![1, 2, 3] as &Vec<i32>)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:68:5 | LL |     0 as i32.max(0); |     ^^^^^^^^ help: try surrounding the expression in parentheses: `(0 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:70:5 | LL |     0: i32.max(0); |     ^^^^^^ help: try surrounding the expression in parentheses: `(0: i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:85:8 | LL |     if 5u64 as i32.max(0) == 0 { |        ^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(5u64 as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:88:8 | LL |     if 5u64: u64.max(0) == 0 { |        ^^^^^^^^^ help: try surrounding the expression in parentheses: `(5u64: u64)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:95:9 | LL |         5u64 as u32.max(0) == 0 |         ^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(5u64 as u32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:99:9 | LL |         5u64: u64.max(0) == 0 |         ^^^^^^^^^ help: try surrounding the expression in parentheses: `(5u64: u64)` error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:104:24 | LL | static bar: &[i32] = &(&[1,2,3] as &[i32][0..1]); |                        ^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(&[1,2,3] as &[i32])` error: casts cannot be followed by indexing --> $DIR/issue-35813-postfix-after-cast.rs:107:25 | LL | static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]); |                         ^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(&[1i32,2,3]: &[i32; 3])` error: casts cannot be followed by ? --> $DIR/issue-35813-postfix-after-cast.rs:112:5 | LL |     Err(0u64) as Result<u64,u64>?; |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(Err(0u64) as Result<u64,u64>)` error: casts cannot be followed by ? --> $DIR/issue-35813-postfix-after-cast.rs:114:5 | LL |     Err(0u64): Result<u64,u64>?; |     ^^^^^^^^^-^^^^^^^^^^^^^^^^ |              | |              help: maybe write a path separator here: `::` | = 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 error: casts cannot be followed by a function call --> $DIR/issue-35813-postfix-after-cast.rs:138:5 | LL |     drop as fn(u8)(0); |     ^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(drop as fn(u8))` error: casts cannot be followed by a function call --> $DIR/issue-35813-postfix-after-cast.rs:140:5 | LL |     drop_ptr: fn(u8)(0); |     ^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(drop_ptr: fn(u8))` error: casts cannot be followed by `.await` --> $DIR/issue-35813-postfix-after-cast.rs:145:5 | LL |     Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>.await; |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>)` error: casts cannot be followed by `.await` --> $DIR/issue-35813-postfix-after-cast.rs:148:5 | LL |     Box::pin(noop()): Pin<Box<_>>.await; |     ^^^^^^^^^^^^^^^^-^^^^^^^^^^^^ |                     | |                     help: maybe write a path separator here: `::` | = 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 error: casts cannot be followed by a field access --> $DIR/issue-35813-postfix-after-cast.rs:160:5 | LL |     Foo::default() as Foo.bar; |     ^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(Foo::default() as Foo)` error: casts cannot be followed by a field access --> $DIR/issue-35813-postfix-after-cast.rs:162:5 | LL |     Foo::default(): Foo.bar; |     ^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(Foo::default(): Foo)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:77:9 | LL |         if true { 33 } else { 44 } as i32.max(0), |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(if true { 33 } else { 44 } as i32)` error: casts cannot be followed by a method call --> $DIR/issue-35813-postfix-after-cast.rs:79:9 | LL |         if true { 33 } else { 44 }: i32.max(0) |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try surrounding the expression in parentheses: `(if true { 33 } else { 44 }: i32)` error[E0214]: parenthesized type parameters may only be used with a `Fn` trait --> $DIR/issue-35813-postfix-after-cast.rs:124:13 | LL |     drop as F(); |             ^^^ only `Fn` traits may use parentheses error[E0214]: parenthesized type parameters may only be used with a `Fn` trait --> $DIR/issue-35813-postfix-after-cast.rs:126:15 | LL |     drop_ptr: F(); |               ^^^ only `Fn` traits may use parentheses error: aborting due to 35 previous errors For more information about this error, try `rustc --explain E0214`. </ins>

Discussion:
Summary: Parsing leads to the error: It is currently impossible for a cast expression to have a trailing index expression without surrounding the cast expression by parenthesis. This however seems to be a parser limitation, not a grammar limitation. As currently the macro language guarantees that ty/path expressions can be followed by a "[", this seems like a bug in the parser to me, as it seems to be parsing it as which makes no grammatical sense, compared to parsing it as (value as Type)[index] which should be valid if I read the lexical structure specification correctly.
I think it's parsed correctly, but should get a tailored error message to suggest surrounding the cast with parens.
Considering that a trailing "[" is never valid in the type syntax (otherwise macros break) and the fact that and variants are perfectly legal (even which is another symbol that occurs in type syntax). But if a tailored error message will be made instead, then this should also include other postfix operators like which are currently rejected even though technically being legal by the lexical grammar specification. (another one is the proposed "?" operator)
This is still lacking a tailored error message, and as far as I know no movement has been made here.
Submitted a pull request to fix this!
Thanks!