-
Notifications
You must be signed in to change notification settings - Fork 13.5k
deref patterns: implement implicit deref patterns #138528
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
f35eae7
store the kind of pattern adjustments in `pat_adjustments`
dianne cb6c499
lower implicit deref patterns to THIR
dianne e4b7b3d
pattern typing for immutable implicit deref patterns
dianne 91d0b57
register `DerefMut` bounds for implicit mutable derefs
dianne d6df469
refactor path pattern checking to get info for peeling
dianne 9196048
refactor struct pattern checking to get info for peeling
dianne 1f40e9a
refactor tuple struct pattern checking to get info for peeling
dianne 923d95c
don't peel ADTs the pattern could match
dianne 977c9ab
respect the tcx's recursion limit when peeling
dianne ff0d4bc
upvar inference for implicit deref patterns
dianne 4c4b61b
add a feature gate test
dianne 93d13e9
add an unstable book chapter
dianne 3b91b7a
Make cow_of_cow test a teeny bit more explicit
Nadrieril File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
don't peel ADTs the pattern could match
This is the use for the previous commits' refactors; see the messages there for more information.
- Loading branch information
commit 923d95cc9f318a88cde9166dd44f785c8bcdadfb
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
//! Test that we get an error about structural equality rather than a type error when attempting to | ||
//! use const patterns of library pointer types. Currently there aren't any smart pointers that can | ||
//! be used in constant patterns, but we still need to make sure we don't implicitly dereference the | ||
//! scrutinee and end up with a type error; this would prevent us from reporting that only constants | ||
//! supporting structural equality can be used as patterns. | ||
#![feature(deref_patterns)] | ||
#![allow(incomplete_features)] | ||
|
||
const EMPTY: Vec<()> = Vec::new(); | ||
|
||
fn main() { | ||
// FIXME(inline_const_pat): if `inline_const_pat` is reinstated, there should be a case here for | ||
// inline const block patterns as well; they're checked differently than named constants. | ||
match vec![()] { | ||
EMPTY => {} | ||
//~^ ERROR: constant of non-structural type `Vec<()>` in a pattern | ||
_ => {} | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
tests/ui/pattern/deref-patterns/implicit-const-deref.stderr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
error: constant of non-structural type `Vec<()>` in a pattern | ||
--> $DIR/implicit-const-deref.rs:15:9 | ||
| | ||
LL | const EMPTY: Vec<()> = Vec::new(); | ||
| -------------------- constant defined here | ||
... | ||
LL | EMPTY => {} | ||
| ^^^^^ constant of non-structural type | ||
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL | ||
| | ||
= note: `Vec<()>` must be annotated with `#[derive(PartialEq)]` to be usable in patterns | ||
| | ||
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralPartialEq.html for details | ||
|
||
error: aborting due to 1 previous error | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
//@ run-pass | ||
//! Test that implicit deref patterns interact as expected with `Cow` constructor patterns. | ||
#![feature(deref_patterns)] | ||
#![allow(incomplete_features)] | ||
|
||
use std::borrow::Cow; | ||
|
||
fn main() { | ||
let cow: Cow<'static, [u8]> = Cow::from(&[1, 2, 3]); | ||
|
||
match cow { | ||
[..] => {} | ||
_ => unreachable!(), | ||
} | ||
|
||
match cow { | ||
Cow::Borrowed(_) => {} | ||
Cow::Owned(_) => unreachable!(), | ||
} | ||
|
||
match Box::new(&cow) { | ||
Cow::Borrowed { 0: _ } => {} | ||
Cow::Owned { 0: _ } => unreachable!(), | ||
_ => unreachable!(), | ||
} | ||
|
||
let cow_of_cow: Cow<'_, Cow<'static, [u8]>> = Cow::Owned(cow); | ||
|
||
match cow_of_cow { | ||
[..] => {} | ||
_ => unreachable!(), | ||
} | ||
|
||
match cow_of_cow { | ||
Nadrieril marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Cow::Borrowed(_) => unreachable!(), | ||
Cow::Owned(_) => {} | ||
} | ||
|
||
match Box::new(&cow_of_cow) { | ||
Cow::Borrowed { 0: _ } => unreachable!(), | ||
Cow::Owned { 0: _ } => {} | ||
_ => unreachable!(), | ||
} | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.