Skip to content

Rollup of 3 pull requests #106183

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 7 commits into from
Dec 27, 2022
Merged
3 changes: 3 additions & 0 deletions compiler/rustc_hir_typeck/src/method/probe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -973,6 +973,9 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
});
} else {
debug_assert!(self.tcx.is_trait(trait_def_id));
if self.tcx.trait_is_auto(trait_def_id) {
return;
}
for item in self.impl_or_trait_item(trait_def_id) {
// Check whether `trait_def_id` defines a method with suitable name.
if !self.has_applicable_self(&item) {
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_hir_typeck/src/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2306,6 +2306,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
_ => false,
}
}) && (type_is_local || info.def_id.is_local())
&& !self.tcx.trait_is_auto(info.def_id)
&& self
.associated_value(info.def_id, item_name)
.filter(|item| {
Expand Down
18 changes: 6 additions & 12 deletions compiler/rustc_parse/src/parser/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -491,17 +491,6 @@ impl<'a> Parser<'a> {

if let PatKind::Ident(_, _, sub @ None) = &mut rhs.kind {
// The user inverted the order, so help them fix that.
let mut applicability = Applicability::MachineApplicable;
// FIXME(bindings_after_at): Remove this code when stabilizing the feature.
lhs.walk(&mut |p| match p.kind {
// `check_match` is unhappy if the subpattern has a binding anywhere.
PatKind::Ident(..) => {
applicability = Applicability::MaybeIncorrect;
false // Short-circuit.
}
_ => true,
});

let lhs_span = lhs.span;
// Move the LHS into the RHS as a subpattern.
// The RHS is now the full pattern.
Expand All @@ -510,7 +499,12 @@ impl<'a> Parser<'a> {
self.struct_span_err(sp, "pattern on wrong side of `@`")
.span_label(lhs_span, "pattern on the left, should be on the right")
.span_label(rhs.span, "binding on the right, should be on the left")
.span_suggestion(sp, "switch the order", pprust::pat_to_string(&rhs), applicability)
.span_suggestion(
sp,
"switch the order",
pprust::pat_to_string(&rhs),
Applicability::MachineApplicable,
)
.emit();
} else {
// The special case above doesn't apply so we may have e.g. `A(x) @ B(y)`.
Expand Down
File renamed without changes.
15 changes: 15 additions & 0 deletions src/test/ui/const-generics/generic_const_exprs/issue-99647.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// edition:2018
// run-pass

#![allow(incomplete_features)]
#![feature(generic_const_exprs)]

#[allow(unused)]
async fn foo<'a>() {
let _data = &mut [0u8; { 1 + 4 }];
bar().await
}

async fn bar() {}

fn main() {}
3 changes: 2 additions & 1 deletion src/test/ui/methods/issues/issue-105732.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ auto trait Foo {

trait Bar {
fn f(&self) {
self.g(); //~ ERROR the method `g` exists for reference `&Self`, but its trait bounds were not satisfied
// issue #105788
self.g(); //~ ERROR no method named `g` found for reference `&Self` in the current scope
}
}

Expand Down
16 changes: 3 additions & 13 deletions src/test/ui/methods/issues/issue-105732.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,11 @@ LL | auto trait Foo {
LL | fn g(&self);
| ---^-------- help: remove these associated items

error[E0599]: the method `g` exists for reference `&Self`, but its trait bounds were not satisfied
--> $DIR/issue-105732.rs:9:14
error[E0599]: no method named `g` found for reference `&Self` in the current scope
--> $DIR/issue-105732.rs:10:14
|
LL | self.g();
| ^
|
= note: the following trait bounds were not satisfied:
`Self: Foo`
which is required by `&Self: Foo`
`&Self: Foo`
= help: items from traits can only be used if the type parameter is bounded by the trait
help: the following trait defines an item `g`, perhaps you need to add a supertrait for it:
|
LL | trait Bar: Foo {
| +++++
| ^ help: there is a method with a similar name: `f`

error: aborting due to 2 previous errors

Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/parser/intersection-patterns-1.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// This tests the parser recovery in `recover_intersection_pat`
// and serves as a regression test for the diagnostics issue #65400.
//
// The general idea is that for `$pat_lhs @ $pat_rhs` where
// `$pat_lhs` is not generated by `ref? mut? $ident` we want
// to suggest either switching the order or note that intersection
// patterns are not allowed.

// run-rustfix

#![allow(unused_variables)]

fn main() {
let s: Option<u8> = None;

match s {
y @ Some(x) => {}
//~^ ERROR pattern on wrong side of `@`
//~| pattern on the left, should be on the right
//~| binding on the right, should be on the left
//~| HELP switch the order
//~| SUGGESTION y @ Some(x)
_ => {}
}

match 2 {
e @ 1..=5 => {}
//~^ ERROR pattern on wrong side of `@`
//~| pattern on the left, should be on the right
//~| binding on the right, should be on the left
//~| HELP switch the order
//~| SUGGESTION e @ 1..=5
_ => {}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
// to suggest either switching the order or note that intersection
// patterns are not allowed.

// run-rustfix

#![allow(unused_variables)]

fn main() {
let s: Option<u8> = None;

Expand All @@ -19,15 +23,6 @@ fn main() {
_ => {}
}

match s {
Some(x) @ Some(y) => {}
//~^ ERROR left-hand side of `@` must be a binding
//~| interpreted as a pattern, not a binding
//~| also a pattern
//~| NOTE bindings are `x`, `mut x`, `ref x`, and `ref mut x`
_ => {}
}

match 2 {
1 ..= 5 @ e => {}
//~^ ERROR pattern on wrong side of `@`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: pattern on wrong side of `@`
--> $DIR/intersection-patterns.rs:13:9
--> $DIR/intersection-patterns-1.rs:17:9
|
LL | Some(x) @ y => {}
| -------^^^-
Expand All @@ -8,19 +8,8 @@ LL | Some(x) @ y => {}
| pattern on the left, should be on the right
| help: switch the order: `y @ Some(x)`

error: left-hand side of `@` must be a binding
--> $DIR/intersection-patterns.rs:23:9
|
LL | Some(x) @ Some(y) => {}
| -------^^^-------
| | |
| | also a pattern
| interpreted as a pattern, not a binding
|
= note: bindings are `x`, `mut x`, `ref x`, and `ref mut x`

error: pattern on wrong side of `@`
--> $DIR/intersection-patterns.rs:32:9
--> $DIR/intersection-patterns-1.rs:27:9
|
LL | 1 ..= 5 @ e => {}
| -------^^^-
Expand All @@ -29,5 +18,5 @@ LL | 1 ..= 5 @ e => {}
| pattern on the left, should be on the right
| help: switch the order: `e @ 1..=5`

error: aborting due to 3 previous errors
error: aborting due to 2 previous errors

20 changes: 20 additions & 0 deletions src/test/ui/parser/intersection-patterns-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// This tests the parser recovery in `recover_intersection_pat`
// and serves as a regression test for the diagnostics issue #65400.
//
// The general idea is that for `$pat_lhs @ $pat_rhs` where
// `$pat_lhs` is not generated by `ref? mut? $ident` we want
// to suggest either switching the order or note that intersection
// patterns are not allowed.

fn main() {
let s: Option<u8> = None;

match s {
Some(x) @ Some(y) => {}
//~^ ERROR left-hand side of `@` must be a binding
//~| interpreted as a pattern, not a binding
//~| also a pattern
//~| NOTE bindings are `x`, `mut x`, `ref x`, and `ref mut x`
_ => {}
}
}
13 changes: 13 additions & 0 deletions src/test/ui/parser/intersection-patterns-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: left-hand side of `@` must be a binding
--> $DIR/intersection-patterns-2.rs:13:9
|
LL | Some(x) @ Some(y) => {}
| -------^^^-------
| | |
| | also a pattern
| interpreted as a pattern, not a binding
|
= note: bindings are `x`, `mut x`, `ref x`, and `ref mut x`

error: aborting due to previous error