diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2013-03-12 22:39:32 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2013-03-13 20:07:11 -0700 |
| commit | aa4c19b6abb86d93077fa63d3f0f893f8a3cb355 (patch) | |
| tree | 7208ef50da168e1f7d8eb126cc305f3b3759eb9b | |
| parent | 2ccc6e0a57660aaf84c70208bb98c5eb4285de3a (diff) | |
| download | rust-aa4c19b6abb86d93077fa63d3f0f893f8a3cb355.tar.gz rust-aa4c19b6abb86d93077fa63d3f0f893f8a3cb355.zip | |
librustc: Allow path-qualified constants in patterns
| -rw-r--r-- | src/librustc/middle/resolve.rs | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 975f699021e..16f3db6a00e 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -4290,17 +4290,24 @@ pub impl Resolver { } } - pat_ident(_, path, _) | pat_enum(path, _) => { - // These two must be enum variants or structs. + pat_ident(binding_mode, path, _) => { + // This must be an enum variant, struct, or constant. match self.resolve_path(path, ValueNS, false, visitor) { Some(def @ def_variant(*)) | Some(def @ def_struct(*)) => { self.record_def(pattern.id, def); } + Some(def @ def_const(*)) => { + self.enforce_default_binding_mode( + pattern, + binding_mode, + "a constant"); + self.record_def(pattern.id, def); + } Some(_) => { self.session.span_err( path.span, - fmt!("not an enum variant: %s", + fmt!("not an enum variant or constant: %s", *self.session.str_of( *path.idents.last()))); } @@ -4316,6 +4323,33 @@ pub impl Resolver { } } + pat_enum(path, _) => { + // This must be an enum variant or struct. + match self.resolve_path(path, ValueNS, false, visitor) { + Some(def @ def_variant(*)) | + Some(def @ def_struct(*)) => { + self.record_def(pattern.id, def); + } + Some(_) => { + self.session.span_err( + path.span, + fmt!("not an enum variant or struct: %s", + *self.session.str_of( + *path.idents.last()))); + } + None => { + self.session.span_err(path.span, + ~"unresolved enum variant \ + or struct"); + } + } + + // Check the types in the path pattern. + for path.types.each |ty| { + self.resolve_type(*ty, visitor); + } + } + pat_lit(expr) => { self.resolve_expr(expr, visitor); } |
