Pattern reform. #3271

bblum opened this Issue Aug 24, 2012 · 3 comments


None yet
3 participants

bblum commented Aug 24, 2012

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


bblum commented Aug 24, 2012

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

catamorphism was assigned Oct 16, 2012


catamorphism commented Dec 7, 2012

Bumping to 0.6 because #3235 isn't done.


pcwalton commented Mar 20, 2013

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

pcwalton closed this Mar 20, 2013

catamorphism was unassigned by bblum Jun 16, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment