// Here we test all kinds of range patterns in terms of parsing / recovery. // We want to ensure that: // 1. Things parse as they should. // 2. Or at least we have parser recovery if they don't. #![feature(exclusive_range_pattern)] #![deny(ellipsis_inclusive_range_patterns)] fn main() {} const X: u8 = 0; const Y: u8 = 3; fn exclusive_from_to() { if let 0..3 = 0 {} // OK. if let 0..Y = 0 {} // OK. if let X..3 = 0 {} // OK. if let X..Y = 0 {} // OK. if let true..Y = 0 {} //~ ERROR only char and numeric types if let X..true = 0 {} //~ ERROR only char and numeric types if let .0..Y = 0 {} //~ ERROR mismatched types //~^ ERROR float literals must have an integer part if let X.. .0 = 0 {} //~ ERROR mismatched types //~^ ERROR float literals must have an integer part } fn inclusive_from_to() { if let 0..=3 = 0 {} // OK. if let 0..=Y = 0 {} // OK. if let X..=3 = 0 {} // OK. if let X..=Y = 0 {} // OK. if let true..=Y = 0 {} //~ ERROR only char and numeric types if let X..=true = 0 {} //~ ERROR only char and numeric types if let .0..=Y = 0 {} //~ ERROR mismatched types //~^ ERROR float literals must have an integer part if let X..=.0 = 0 {} //~ ERROR mismatched types //~^ ERROR float literals must have an integer part } fn inclusive2_from_to() { if let 0...3 = 0 {} //~ ERROR `...` range patterns are deprecated if let 0...Y = 0 {} //~ ERROR `...` range patterns are deprecated if let X...3 = 0 {} //~ ERROR `...` range patterns are deprecated if let X...Y = 0 {} //~ ERROR `...` range patterns are deprecated if let true...Y = 0 {} //~ ERROR only char and numeric types //~^ ERROR `...` range patterns are deprecated if let X...true = 0 {} //~ ERROR only char and numeric types //~^ ERROR `...` range patterns are deprecated if let .0...Y = 0 {} //~ ERROR mismatched types //~^ ERROR float literals must have an integer part //~| ERROR `...` range patterns are deprecated if let X... .0 = 0 {} //~ ERROR mismatched types //~^ ERROR float literals must have an integer part //~| ERROR `...` range patterns are deprecated } fn exclusive_from() { if let 0.. = 0 {} //~ ERROR `X..` range patterns are not supported if let X.. = 0 {} //~ ERROR `X..` range patterns are not supported if let true.. = 0 {} //~ ERROR `X..` range patterns are not supported //~^ ERROR only char and numeric types if let .0.. = 0 {} //~ ERROR `X..` range patterns are not supported //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive_from() { if let 0..= = 0 {} //~ ERROR `X..=` range patterns are not supported if let X..= = 0 {} //~ ERROR `X..=` range patterns are not supported if let true..= = 0 {} //~ ERROR `X..=` range patterns are not supported //~| ERROR only char and numeric types if let .0..= = 0 {} //~ ERROR `X..=` range patterns are not supported //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive2_from() { if let 0... = 0 {} //~ ERROR `X...` range patterns are not supported //~^ ERROR `...` range patterns are deprecated if let X... = 0 {} //~ ERROR `X...` range patterns are not supported //~^ ERROR `...` range patterns are deprecated if let true... = 0 {} //~ ERROR `X...` range patterns are not supported //~^ ERROR `...` range patterns are deprecated //~| ERROR only char and numeric types if let .0... = 0 {} //~ ERROR `X...` range patterns are not supported //~^ ERROR float literals must have an integer part //~| ERROR `...` range patterns are deprecated //~| ERROR mismatched types } fn exclusive_to() { if let ..0 = 0 {} //~ ERROR `..X` range patterns are not supported if let ..Y = 0 {} //~ ERROR `..X` range patterns are not supported if let ..true = 0 {} //~ ERROR `..X` range patterns are not supported //~| ERROR only char and numeric types if let .. .0 = 0 {} //~ ERROR `..X` range patterns are not supported //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive_to() { if let ..=3 = 0 {} //~ ERROR `..=X` range patterns are not supported if let ..=Y = 0 {} //~ ERROR `..=X` range patterns are not supported if let ..=true = 0 {} //~ ERROR `..=X` range patterns are not supported //~| ERROR only char and numeric types if let ..=.0 = 0 {} //~ ERROR `..=X` range patterns are not supported //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive2_to() { if let ...3 = 0 {} //~ ERROR `...X` range patterns are not supported //~^ ERROR `...` range patterns are deprecated if let ...Y = 0 {} //~ ERROR `...X` range patterns are not supported //~^ ERROR `...` range patterns are deprecated if let ...true = 0 {} //~ ERROR `...X` range patterns are not supported //~^ ERROR `...` range patterns are deprecated //~| ERROR only char and numeric types if let ....3 = 0 {} //~ ERROR `...X` range patterns are not supported //~^ ERROR float literals must have an integer part //~| ERROR `...` range patterns are deprecated //~| ERROR mismatched types } fn with_macro_expr_var() { macro_rules! mac2 { ($e1:expr, $e2:expr) => { let $e1..$e2; let $e1...$e2; //~^ ERROR `...` range patterns are deprecated let $e1..=$e2; } } mac2!(0, 1); macro_rules! mac { ($e:expr) => { let ..$e; //~ ERROR `..X` range patterns are not supported let ...$e; //~ ERROR `...X` range patterns are not supported //~^ ERROR `...` range patterns are deprecated let ..=$e; //~ ERROR `..=X` range patterns are not supported let $e..; //~ ERROR `X..` range patterns are not supported let $e...; //~ ERROR `X...` range patterns are not supported //~^ ERROR `...` range patterns are deprecated let $e..=; //~ ERROR `X..=` range patterns are not supported } } mac!(0); }