Skip to content

Pattern guard problem replacing FP literal pattern #42663

Closed
@leonardo-m

Description

@leonardo-m

This is an Rust language ergonomy problem regarding pattern matching that contains floating point values.

This is a reduction of code that was OK:

#![feature(box_patterns, box_syntax)]
#![allow(illegal_floating_point_literal_pattern)]
#![allow(dead_code)]

enum Exp {
    Const(f64),
    Sum(Box<Exp>, Box<Exp>)
}

fn simplify(e: Exp) -> Exp {
    use Exp::*;
    match e {
        Sum(box Const(0.0), box x) | Sum(box x, box Const(0.0))
            => simplify(x),
        Sum(box Const(l), box Const(r))
            => Const(l + r),
        _ => e,
    }
}

fn main() {}

Those FP patterns will go away, so I've tried to replace them like this:

#![feature(box_patterns, box_syntax)]
#![allow(dead_code)]

enum Exp {
    Const(f64),
    Sum(Box<Exp>, Box<Exp>)
}

fn simplify(e: Exp) -> Exp {
    use Exp::*;
    match e {
        Sum(box Const(z), box x) | Sum(box x, box Const(z))
            if z == 0.0 => simplify(x),
        Sum(box Const(l), box Const(r))
            => Const(l + r),
        _ => e,
    }
}

fn main() {}

But I get errors:

error[E0008]: cannot bind by-move into a pattern guard
  --> ...\test.rs:12:31
   |
12 |         Sum(box Const(z), box x) | Sum(box x, box Const(z))
   |                               ^ moves value into pattern guard

error[E0008]: cannot bind by-move into a pattern guard
  --> ...\test.rs:12:44
   |
12 |         Sum(box Const(z), box x) | Sum(box x, box Const(z))
   |                                            ^ moves value into pattern guard

The pattern guard is "if z == 0.0" it uses just z and a FP contanst, it doesn't touch the x value.

I'd like ergonomy improvements to solve this problem in some nice way at language level (or Prelude level).

See also the short thread:
https://users.rust-lang.org/t/pattern-guard-problem-replacing-fp-literal-pattern/11207

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-feature-requestCategory: A feature request, i.e: not implemented / a PR.I-needs-decisionIssue: In need of a decision.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-langRelevant to the language team

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions