#![allow(unused, dead_code)]
#![warn(clippy::manual_is_ascii_check)]

fn main() {
    assert!('x'.is_ascii_lowercase());
    //~^ manual_is_ascii_check
    assert!('X'.is_ascii_uppercase());
    //~^ manual_is_ascii_check
    assert!(b'x'.is_ascii_lowercase());
    //~^ manual_is_ascii_check
    assert!(b'X'.is_ascii_uppercase());
    //~^ manual_is_ascii_check

    let num = '2';
    assert!(num.is_ascii_digit());
    //~^ manual_is_ascii_check
    assert!(b'1'.is_ascii_digit());
    //~^ manual_is_ascii_check
    assert!('x'.is_ascii_alphabetic());
    //~^ manual_is_ascii_check

    assert!(matches!('x', 'A'..='Z' | 'a'..='z' | '_'));

    b'0'.is_ascii_digit();
    //~^ manual_is_ascii_check
    b'a'.is_ascii_lowercase();
    //~^ manual_is_ascii_check
    b'A'.is_ascii_uppercase();
    //~^ manual_is_ascii_check

    '0'.is_ascii_digit();
    //~^ manual_is_ascii_check
    'a'.is_ascii_lowercase();
    //~^ manual_is_ascii_check
    'A'.is_ascii_uppercase();
    //~^ manual_is_ascii_check

    let cool_letter = &'g';
    cool_letter.is_ascii_digit();
    //~^ manual_is_ascii_check
    cool_letter.is_ascii_lowercase();
    //~^ manual_is_ascii_check
    cool_letter.is_ascii_uppercase();
    //~^ manual_is_ascii_check
}

#[clippy::msrv = "1.23"]
fn msrv_1_23() {
    assert!(matches!(b'1', b'0'..=b'9'));
    assert!(matches!('X', 'A'..='Z'));
    assert!(matches!('x', 'A'..='Z' | 'a'..='z'));
    assert!(matches!('x', '0'..='9' | 'a'..='f' | 'A'..='F'));
}

#[clippy::msrv = "1.24"]
fn msrv_1_24() {
    assert!(b'1'.is_ascii_digit());
    //~^ manual_is_ascii_check
    assert!('X'.is_ascii_uppercase());
    //~^ manual_is_ascii_check
    assert!('x'.is_ascii_alphabetic());
    //~^ manual_is_ascii_check
    assert!('x'.is_ascii_hexdigit());
    //~^ manual_is_ascii_check
}

#[clippy::msrv = "1.46"]
fn msrv_1_46() {
    const FOO: bool = matches!('x', '0'..='9');
    const BAR: bool = matches!('x', '0'..='9' | 'a'..='f' | 'A'..='F');
}

#[clippy::msrv = "1.47"]
fn msrv_1_47() {
    const FOO: bool = 'x'.is_ascii_digit();
    //~^ manual_is_ascii_check
    const BAR: bool = 'x'.is_ascii_hexdigit();
    //~^ manual_is_ascii_check
}

#[allow(clippy::deref_addrof, clippy::needless_borrow)]
fn with_refs() {
    let cool_letter = &&'g';
    cool_letter.is_ascii_digit();
    //~^ manual_is_ascii_check
    cool_letter.is_ascii_lowercase();
    //~^ manual_is_ascii_check
}

fn generics() {
    fn a<U>(u: &U) -> bool
    where
        char: PartialOrd<U>,
        U: PartialOrd<char> + ?Sized,
    {
        ('A'..='Z').contains(u)
    }

    fn take_while<Item, F>(cond: F)
    where
        Item: Sized,
        F: Fn(Item) -> bool,
    {
    }
    take_while(|c: char| c.is_ascii_uppercase());
    //~^ manual_is_ascii_check
    take_while(|c: u8| c.is_ascii_uppercase());
    //~^ manual_is_ascii_check
    take_while(|c: char| c.is_ascii_uppercase());
    //~^ manual_is_ascii_check
    take_while(|c: char| c.is_ascii_uppercase());
    //~^ manual_is_ascii_check
}

fn adds_type_reference() {
    let digits: Vec<&char> = ['1', 'A'].iter().take_while(|c: &&char| c.is_ascii_digit()).collect();
    //~^ manual_is_ascii_check
    let digits: Vec<&mut char> = ['1', 'A'].iter_mut().take_while(|c: &&mut char| c.is_ascii_digit()).collect();
    //~^ manual_is_ascii_check
    let digits: Vec<&mut char> = ['1', 'A'].iter_mut().take_while(|c: &&mut char| c.is_ascii_digit()).collect();
    //~^ manual_is_ascii_check
}
