Skip to content

Commit aa4c19b

Browse files
committed
librustc: Allow path-qualified constants in patterns
1 parent 2ccc6e0 commit aa4c19b

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

src/librustc/middle/resolve.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4290,17 +4290,24 @@ pub impl Resolver {
42904290
}
42914291
}
42924292

4293-
pat_ident(_, path, _) | pat_enum(path, _) => {
4294-
// These two must be enum variants or structs.
4293+
pat_ident(binding_mode, path, _) => {
4294+
// This must be an enum variant, struct, or constant.
42954295
match self.resolve_path(path, ValueNS, false, visitor) {
42964296
Some(def @ def_variant(*)) |
42974297
Some(def @ def_struct(*)) => {
42984298
self.record_def(pattern.id, def);
42994299
}
4300+
Some(def @ def_const(*)) => {
4301+
self.enforce_default_binding_mode(
4302+
pattern,
4303+
binding_mode,
4304+
"a constant");
4305+
self.record_def(pattern.id, def);
4306+
}
43004307
Some(_) => {
43014308
self.session.span_err(
43024309
path.span,
4303-
fmt!("not an enum variant: %s",
4310+
fmt!("not an enum variant or constant: %s",
43044311
*self.session.str_of(
43054312
*path.idents.last())));
43064313
}
@@ -4316,6 +4323,33 @@ pub impl Resolver {
43164323
}
43174324
}
43184325

4326+
pat_enum(path, _) => {
4327+
// This must be an enum variant or struct.
4328+
match self.resolve_path(path, ValueNS, false, visitor) {
4329+
Some(def @ def_variant(*)) |
4330+
Some(def @ def_struct(*)) => {
4331+
self.record_def(pattern.id, def);
4332+
}
4333+
Some(_) => {
4334+
self.session.span_err(
4335+
path.span,
4336+
fmt!("not an enum variant or struct: %s",
4337+
*self.session.str_of(
4338+
*path.idents.last())));
4339+
}
4340+
None => {
4341+
self.session.span_err(path.span,
4342+
~"unresolved enum variant \
4343+
or struct");
4344+
}
4345+
}
4346+
4347+
// Check the types in the path pattern.
4348+
for path.types.each |ty| {
4349+
self.resolve_type(*ty, visitor);
4350+
}
4351+
}
4352+
43194353
pat_lit(expr) => {
43204354
self.resolve_expr(expr, visitor);
43214355
}

0 commit comments

Comments
 (0)