fn main() { if Foo { x: 3 }.hi() { //~ ERROR struct literals are not allowed here println!("yo"); } if let true = Foo { x: 3 }.hi() { //~ ERROR struct literals are not allowed here println!("yo"); } for x in Foo { x: 3 }.hi() { //~ ERROR struct literals are not allowed here //~^ ERROR `bool` is not an iterator println!("yo"); } while Foo { x: 3 }.hi() { //~ ERROR struct literals are not allowed here println!("yo"); } while let true = Foo { x: 3 }.hi() { //~ ERROR struct literals are not allowed here println!("yo"); } match Foo { x: 3 } { //~ ERROR struct literals are not allowed here Foo { x: x } => {} } let _ = |x: E| { let field = true; if x == E::V { field } {} //~^ ERROR expected value, found struct variant `E::V` //~| ERROR mismatched types if x == E::I { field1: true, field2: 42 } {} //~^ ERROR struct literals are not allowed here if x == E::V { field: false } {} //~^ ERROR struct literals are not allowed here if x == E::J { field: -42 } {} //~^ ERROR struct literals are not allowed here if x == E::K { field: "" } {} //~^ ERROR struct literals are not allowed here let y: usize = (); //~^ ERROR mismatched types }; // Regression test for . while || Foo { x: 3 }.hi() { //~ ERROR struct literals are not allowed here //~^ ERROR mismatched types println!("yo"); } // This uses `one()` over `1` as token `one` may begin a type and thus back when type ascription // `$expr : $ty` still existed, `{ x: one` could've been the start of a block expr which used to // make the compiler take a different execution path. Now it no longer makes a difference tho. // Regression test for . if Foo { x: one(), }.hi() { //~ ERROR struct literals are not allowed here println!("Positive!"); } const FOO: Foo = Foo { x: 1 }; // Below, test that we correctly parenthesize the struct literals. // Regression test for . if FOO == self::Foo { x: one() } {} //~ ERROR struct literals are not allowed here if FOO == Foo::<> { x: one() } {} //~ ERROR struct literals are not allowed here fn env>() { if FOO == ::Out { x: one() } {} //~ ERROR struct literals are not allowed here //~^ ERROR usage of qualified paths in this context is experimental } } #[derive(PartialEq, Eq)] struct Foo { x: isize, } impl Foo { fn hi(&self) -> bool { true } } #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] enum E { V { field: bool }, I { field1: bool, field2: usize }, J { field: isize }, K { field: &'static str}, } fn one() -> isize { 1 } trait Trait { type Out; }