Auto merge of #45050 - petrochenkov:ambind, r=nikomatsakis
resolve: Use same rules for disambiguating fresh bindings in `match` and `let`
Resolve `Unit` as a unit struct pattern in
```rust
struct Unit;
let Unit = x;
```
consistently with
```rust
match x {
Unit => {}
}
```
It was previously an error.
(The change also applies to unit variants and constants.)
Fixes https://users.rust-lang.org/t/e0530-cannot-shadow-unit-structs-what-in-the-earthly-what/13054
(This particular change doesn't depend on a fix for the issue mentioned in https://users.rust-lang.org/t/e0530-cannot-shadow-unit-structs-what-in-the-earthly-what/13054/4)
cc @rust-lang/lang
r? @nikomatsakis
This commit is contained in:
commit
a35a3abcda
9 changed files with 126 additions and 31 deletions
26
src/test/ui/const-pattern-irrefutable.rs
Normal file
26
src/test/ui/const-pattern-irrefutable.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// 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.
|
||||
|
||||
mod foo {
|
||||
pub const b: u8 = 2;
|
||||
pub const d: u8 = 2;
|
||||
}
|
||||
|
||||
use foo::b as c;
|
||||
use foo::d;
|
||||
|
||||
const a: u8 = 2;
|
||||
|
||||
fn main() {
|
||||
let a = 4; //~ ERROR refutable pattern in local binding: `_` not covered
|
||||
let c = 4; //~ ERROR refutable pattern in local binding: `_` not covered
|
||||
let d = 4; //~ ERROR refutable pattern in local binding: `_` not covered
|
||||
fn f() {} // Check that the `NOTE`s still work with an item here (c.f. issue #35115).
|
||||
}
|
||||
20
src/test/ui/const-pattern-irrefutable.stderr
Normal file
20
src/test/ui/const-pattern-irrefutable.stderr
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
error[E0005]: refutable pattern in local binding: `_` not covered
|
||||
--> $DIR/const-pattern-irrefutable.rs:22:9
|
||||
|
|
||||
22 | let a = 4; //~ ERROR refutable pattern in local binding: `_` not covered
|
||||
| ^ interpreted as a constant pattern, not new variable
|
||||
|
||||
error[E0005]: refutable pattern in local binding: `_` not covered
|
||||
--> $DIR/const-pattern-irrefutable.rs:23:9
|
||||
|
|
||||
23 | let c = 4; //~ ERROR refutable pattern in local binding: `_` not covered
|
||||
| ^ interpreted as a constant pattern, not new variable
|
||||
|
||||
error[E0005]: refutable pattern in local binding: `_` not covered
|
||||
--> $DIR/const-pattern-irrefutable.rs:24:9
|
||||
|
|
||||
24 | let d = 4; //~ ERROR refutable pattern in local binding: `_` not covered
|
||||
| ^ interpreted as a constant pattern, not new variable
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
13
src/test/ui/resolve/name-clash-nullary.rs
Normal file
13
src/test/ui/resolve/name-clash-nullary.rs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
// Copyright 2012-2014 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() {
|
||||
let None: isize = 42; //~ ERROR mismatched types
|
||||
}
|
||||
11
src/test/ui/resolve/name-clash-nullary.stderr
Normal file
11
src/test/ui/resolve/name-clash-nullary.stderr
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/name-clash-nullary.rs:12:7
|
||||
|
|
||||
12 | let None: isize = 42; //~ ERROR mismatched types
|
||||
| ^^^^ expected isize, found enum `std::option::Option`
|
||||
|
|
||||
= note: expected type `isize`
|
||||
found type `std::option::Option<_>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue