Auto merge of #27349 - arielb1:constant-at, r=alexcrichton
Fixes #27033 Fixes #27077 r? @alexcrichton
This commit is contained in:
commit
6fcf62831e
@ -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);
|
||||
|
22
src/test/compile-fail/issue-27033.rs
Normal file
22
src/test/compile-fail/issue-27033.rs
Normal 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);
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user