Skip to content


Pattern reform. #3271

bblum opened this Issue · 3 comments

3 participants


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


Possible long-term enhancement: #2956 - allow irrefutable disjunctive patterns in let bindings

@catamorphism catamorphism was assigned

Bumping to 0.6 because #3235 isn't done.


Closing in favor of #3235, please reopen if there is objection.

@pcwalton pcwalton closed this
@catamorphism catamorphism was unassigned by bblum
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.