//@aux-build:proc_macros.rs
#![expect(clippy::needless_ifs)]
#![warn(clippy::manual_is_finite, clippy::manual_is_infinite)]

// FIXME(f16_f128): add tests for these types once constants are available

#[macro_use]
extern crate proc_macros;

fn fn_test() -> f64 {
    f64::NEG_INFINITY
}

fn fn_test_not_inf() -> f64 {
    112.0
}

fn main() {
    let x = 1.0f32;
    if x.is_infinite() {}
    //~^ manual_is_infinite
    if x.is_finite() || x.is_nan() {}
    //~^ manual_is_finite
    let x = 1.0f64;
    if x.is_infinite() {}
    //~^ manual_is_infinite
    if x.is_finite() || x.is_nan() {}
    //~^ manual_is_finite
    // Don't lint
    if x.is_infinite() {}
    if x.is_finite() {}
    if x.abs() < f64::INFINITY {}
    if f64::INFINITY > x.abs() {}
    if f64::abs(x) < f64::INFINITY {}
    if f64::INFINITY > f64::abs(x) {}
    // Is not evaluated by `clippy_utils::constant`
    if x != f64::INFINITY && x != fn_test() {}
    // Not -inf
    if x != f64::INFINITY && x != fn_test_not_inf() {}
    const {
        let x = 1.0f64;
        if x.is_infinite() {}
        //~^ manual_is_infinite
    }
    const X: f64 = 1.0f64;
    if const { X == f64::INFINITY || X == f64::NEG_INFINITY } {}
    if const { X != f64::INFINITY && X != f64::NEG_INFINITY } {}
    external! {
        let x = 1.0;
        if x == f32::INFINITY || x == f32::NEG_INFINITY {}
        if x != f32::INFINITY && x != f32::NEG_INFINITY {}
    }
    with_span! {
        span
        let x = 1.0;
        if x == f32::INFINITY || x == f32::NEG_INFINITY {}
        if x != f32::INFINITY && x != f32::NEG_INFINITY {}
    }

    {
        let x = 1.0f32;
        const X: f32 = f32::INFINITY;
        const Y: f32 = f32::NEG_INFINITY;
        if x == X || x == Y {}
        if x != X && x != Y {}
    }
}
