| //@ edition:2018 |
| #![crate_type = "lib"] |
| #![feature(type_ascription)] |
| use std::future::Future; |
| use std::pin::Pin; |
| |
| // This tests the parser for "x as Y[z]". It errors, but we want to give useful |
| // errors and parse such that further code gives useful errors. |
| pub fn index_after_as_cast() { |
| vec![1, 2, 3] as Vec<i32>[0]; |
| //~^ ERROR: cast cannot be followed by indexing |
| vec![1, 2, 3]: Vec<i32>[0]; |
| //~^ ERROR: expected one of |
| } |
| |
| pub fn index_after_cast_to_index() { |
| (&[0]) as &[i32][0]; |
| //~^ ERROR: cast cannot be followed by indexing |
| (&[0i32]): &[i32; 1][0]; |
| //~^ ERROR: expected one of |
| } |
| |
| pub fn cast_after_cast() { |
| if 5u64 as i32 as u16 == 0u16 { |
| |
| } |
| if 5u64: u64: u64 == 0u64 { |
| //~^ ERROR expected `{`, found `:` |
| } |
| let _ = 5u64: u64: u64 as u8 as i8 == 9i8; |
| let _ = 0i32: i32: i32; |
| let _ = 0 as i32: i32; |
| let _ = 0i32: i32 as i32; |
| let _ = 0 as i32 as i32; |
| let _ = 0i32: i32: i32 as u32 as i32; |
| } |
| |
| pub fn cast_cast_method_call() { |
| let _ = 0i32: i32: i32.count_ones(); //~ ERROR expected one of |
| } |
| |
| pub fn cast_cast_method_call_2() { |
| let _ = 0 as i32: i32.count_ones(); //~ ERROR expected one of |
| } |
| |
| pub fn cast_cast_method_call_3() { |
| let _ = 0i32: i32 as i32.count_ones(); //~ ERROR expected one of |
| } |
| |
| pub fn cast_cast_method_call_4() { |
| let _ = 0 as i32 as i32.count_ones(); |
| //~^ ERROR: cast cannot be followed by a method call |
| } |
| |
| pub fn cast_cast_method_call_5() { |
| let _ = 0i32: i32: i32 as u32 as i32.count_ones(); //~ ERROR expected one of |
| } |
| |
| pub fn cast_cast_method_call_6() { |
| let _ = 0i32: i32.count_ones(): u32; //~ ERROR expected one of |
| } |
| |
| pub fn cast_cast_method_call_7() { |
| let _ = 0 as i32.count_ones(): u32; //~ ERROR expected one of |
| //~^ ERROR: cast cannot be followed by a method call |
| } |
| |
| pub fn cast_cast_method_call_8() { |
| let _ = 0i32: i32.count_ones() as u32; //~ ERROR expected one of |
| } |
| |
| pub fn cast_cast_method_call_9() { |
| let _ = 0 as i32.count_ones() as u32; |
| //~^ ERROR: cast cannot be followed by a method call |
| } |
| |
| pub fn cast_cast_method_call_10() { |
| let _ = 0i32: i32: i32.count_ones() as u32 as i32; //~ ERROR expected one of |
| } |
| |
| pub fn multiline_error() { |
| let _ = 0 |
| as i32 |
| .count_ones(); |
| //~^^^ ERROR: cast cannot be followed by a method call |
| } |
| |
| // this tests that the precedence for `!x as Y.Z` is still what we expect |
| pub fn precedence() { |
| let x: i32 = &vec![1, 2, 3] as &Vec<i32>[0]; |
| //~^ ERROR: cast cannot be followed by indexing |
| } |
| |
| pub fn method_calls() { |
| 0 as i32.max(0); |
| //~^ ERROR: cast cannot be followed by a method call |
| 0: i32.max(0); //~ ERROR expected one of |
| } |
| |
| pub fn complex() { |
| let _ = format!( |
| "{} and {}", |
| if true { 33 } else { 44 } as i32.max(0), |
| //~^ ERROR: cast cannot be followed by a method call |
| if true { 33 } else { 44 }: i32.max(0) |
| //~^ ERROR: expected one of |
| ); |
| } |
| |
| pub fn in_condition() { |
| if 5u64 as i32.max(0) == 0 { |
| //~^ ERROR: cast cannot be followed by a method call |
| } |
| if 5u64: u64.max(0) == 0 { |
| //~^ ERROR: expected `{`, found `:` |
| } |
| } |
| |
| pub fn inside_block() { |
| let _ = if true { |
| 5u64 as u32.max(0) == 0 |
| //~^ ERROR: cast cannot be followed by a method call |
| } else { false }; |
| let _ = if true { |
| 5u64: u64.max(0) == 0 |
| //~^ ERROR: expected one of |
| } else { false }; |
| } |
| |
| static bar: &[i32] = &(&[1,2,3] as &[i32][0..1]); |
| //~^ ERROR: cast cannot be followed by indexing |
| //~| ERROR: cannot call non-const operator in statics |
| |
| static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]); |
| //~^ ERROR: expected one of |
| |
| |
| pub fn cast_then_try() -> Result<u64,u64> { |
| Err(0u64) as Result<u64,u64>?; |
| //~^ ERROR: cast cannot be followed by `?` |
| Err(0u64): Result<u64,u64>?; |
| //~^ ERROR: expected one of |
| Ok(1) |
| } |
| |
| |
| pub fn cast_then_call() { |
| type F = fn(u8); |
| // type ascription won't actually do [unique drop fn type] -> fn(u8) casts. |
| let drop_ptr = drop as fn(u8); |
| drop as F(); |
| //~^ ERROR: parenthesized type parameters may only be used with a `Fn` trait [E0214] |
| drop_ptr: F(); |
| //~^ ERROR: expected identifier, found `:` |
| } |
| |
| pub fn cast_to_fn_should_work() { |
| let drop_ptr = drop as fn(u8); |
| drop as fn(u8); |
| drop_ptr: fn(u8); |
| //~^ ERROR expected one of |
| } |
| |
| pub fn parens_after_cast_error() { |
| let drop_ptr = drop as fn(u8); |
| drop as fn(u8)(0); |
| //~^ ERROR: cast cannot be followed by a function call |
| drop_ptr: fn(u8)(0); |
| //~^ ERROR: expected one of |
| } |
| |
| pub async fn cast_then_await() { |
| Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>.await; |
| //~^ ERROR: cast cannot be followed by `.await` |
| |
| Box::pin(noop()): Pin<Box<_>>.await; |
| //~^ ERROR: expected one of |
| } |
| |
| pub async fn noop() {} |
| |
| #[derive(Default)] |
| pub struct Foo { |
| pub bar: u32, |
| } |
| |
| pub fn struct_field() { |
| Foo::default() as Foo.bar; |
| //~^ ERROR: cannot be followed by a field access |
| Foo::default(): Foo.bar; |
| //~^ ERROR expected one of |
| } |