Skip to content

Pattern reform. #3271

Closed
Closed
@bblum

Description

@bblum

This is a meta-bug for the way pattern-matching is being overhauled.

The old pattern-matching rules are:

  • 'let' matches by-copy or by-move and must take irrefutable patterns.
  • 'match' matches by-implicit-reference.

This has several drawbacks. One, the implicit-ref thing is a big pain in our semantics, causes lots of "illegal borrow unless pure" errors to confuse newbies, and once implicit-ref argument modes go away, it will be the last thing of its kind. Two, moving out of multi-branch enums is impossible. I'm sure there are more.

New rules should be:

  • both 'let' and 'match' match by-copy or by-move (which one is inferred) by default.
  • moving out of enums (any patterns, really) is allowed if the matched-on expression is an rvalue or a last-use.
  • moving out of certain patterns (I think just '@') should never be allowed.
  • 'let' patterns must be irrefutable.
  • if you're not moving out (deconstructing), you can use 'ref' in bindings to create an explicit region pointer.

As a transitionary step, we are adding 'move' and 'copy' keywords that are to be used the same way as 'ref' in patterns. Once match's bind-by-implicit-ref goes away, 'copy' can become the default. Once there's a way to infer which of 'move' or 'copy' is meant, 'move' can go away too.

Here are some bugs:
#3224 - Patterning on ~ pointers. Moving out should be sometimes allowed.
#3024 - Patterning on @ pointers. Moving out should never be allowed.
#3235, #3256 - 'ref' working properly
#3097, moves into patterns always copy

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions