lisette-semantics 0.4.1

Little language inspired by Rust that compiles to Go
Documentation
use crate::passes::walk::NodeCtx;
use syntax::ast::Expression;
use syntax::types::SimpleKind;

use super::nan_comparison::is_math_nan_call;

pub(crate) fn check(expression: &Expression, ctx: &NodeCtx) {
    let Expression::Cast {
        expression: operand,
        ty,
        span,
        ..
    } = expression
    else {
        return;
    };

    let Some(kind) = ty.underlying_simple_kind() else {
        return;
    };
    if !(kind.is_signed_int() || kind.is_unsigned_int() || kind == SimpleKind::Uintptr) {
        return;
    }

    if !is_math_nan_call(operand.unwrap_parens()) {
        return;
    }

    ctx.sink
        .push(diagnostics::infer::cast_nan_to_int(span, &ty.to_string()));
}