Auto merge of #27349 - arielb1:constant-at, r=alexcrichton

Fixes #27033
Fixes #27077 

r? @alexcrichton
This commit is contained in:
bors 2015-07-29 08:23:04 +00:00
commit 6fcf62831e
2 changed files with 30 additions and 9 deletions

View File

@ -2654,23 +2654,22 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let pat_id = pattern.id;
walk_pat(pattern, |pattern| {
match pattern.node {
PatIdent(binding_mode, ref path1, _) => {
// The meaning of pat_ident with no type parameters
PatIdent(binding_mode, ref path1, ref at_rhs) => {
// The meaning of PatIdent with no type parameters
// depends on whether an enum variant or unit-like struct
// with that name is in scope. The probing lookup has to
// be careful not to emit spurious errors. Only matching
// patterns (match) can match nullary variants or
// unit-like structs. For binding patterns (let), matching
// such a value is simply disallowed (since it's rarely
// what you want).
// unit-like structs. For binding patterns (let
// and the LHS of @-patterns), matching such a value is
// simply disallowed (since it's rarely what you want).
let const_ok = mode == RefutableMode && at_rhs.is_none();
let ident = path1.node;
let renamed = mtwt::resolve(ident);
match self.resolve_bare_identifier_pattern(ident.name, pattern.span) {
FoundStructOrEnumVariant(def, lp)
if mode == RefutableMode => {
FoundStructOrEnumVariant(def, lp) if const_ok => {
debug!("(resolving pattern) resolving `{}` to \
struct or enum variant",
renamed);
@ -2693,7 +2692,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
renamed)
);
}
FoundConst(def, lp) if mode == RefutableMode => {
FoundConst(def, lp) if const_ok => {
debug!("(resolving pattern) resolving `{}` to \
constant",
renamed);

View File

@ -0,0 +1,22 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
fn main() {
match Some(1) {
None @ _ => {} //~ ERROR declaration of `None` shadows an enum variant
};
const C: u8 = 1;
match 1 {
C @ 2 => { //~ ERROR only irrefutable patterns allowed here
println!("{}", C);
}
_ => {}
};
}