Rollup merge of #113453 - spastorino:new-rpitit-30, r=compiler-errors
Remove unused from_method from rustc_on_unimplemented Fixes #113439 `on_unimplemented_note` was calling `item_name` for RPITITs and that produced ICEs. I've added a regression test for that but also have removed `from_method` symbol entirely because it wasn't even used and by doing that the `item_name` call was also removed. r? ``@compiler-errors``
This commit is contained in:
commit
37a05d8054
5 changed files with 52 additions and 20 deletions
|
@ -759,7 +759,6 @@ symbols! {
|
||||||
from_desugaring,
|
from_desugaring,
|
||||||
from_fn,
|
from_fn,
|
||||||
from_iter,
|
from_iter,
|
||||||
from_method,
|
|
||||||
from_output,
|
from_output,
|
||||||
from_residual,
|
from_residual,
|
||||||
from_size_align_unchecked,
|
from_size_align_unchecked,
|
||||||
|
|
|
@ -41,7 +41,6 @@ pub trait TypeErrCtxtExt<'tcx> {
|
||||||
static ALLOWED_FORMAT_SYMBOLS: &[Symbol] = &[
|
static ALLOWED_FORMAT_SYMBOLS: &[Symbol] = &[
|
||||||
kw::SelfUpper,
|
kw::SelfUpper,
|
||||||
sym::ItemContext,
|
sym::ItemContext,
|
||||||
sym::from_method,
|
|
||||||
sym::from_desugaring,
|
sym::from_desugaring,
|
||||||
sym::direct,
|
sym::direct,
|
||||||
sym::cause,
|
sym::cause,
|
||||||
|
@ -172,23 +171,6 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let ObligationCauseCode::ItemObligation(item)
|
|
||||||
| ObligationCauseCode::BindingObligation(item, _)
|
|
||||||
| ObligationCauseCode::ExprItemObligation(item, ..)
|
|
||||||
| ObligationCauseCode::ExprBindingObligation(item, ..) = *obligation.cause.code()
|
|
||||||
{
|
|
||||||
// FIXME: maybe also have some way of handling methods
|
|
||||||
// from other traits? That would require name resolution,
|
|
||||||
// which we might want to be some sort of hygienic.
|
|
||||||
//
|
|
||||||
// Currently I'm leaving it for what I need for `try`.
|
|
||||||
if self.tcx.trait_of_item(item) == Some(trait_ref.def_id) {
|
|
||||||
let method = self.tcx.item_name(item);
|
|
||||||
flags.push((sym::from_method, None));
|
|
||||||
flags.push((sym::from_method, Some(method.to_string())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(k) = obligation.cause.span.desugaring_kind() {
|
if let Some(k) = obligation.cause.span.desugaring_kind() {
|
||||||
flags.push((sym::from_desugaring, None));
|
flags.push((sym::from_desugaring, None));
|
||||||
flags.push((sym::from_desugaring, Some(format!("{:?}", k))));
|
flags.push((sym::from_desugaring, Some(format!("{:?}", k))));
|
||||||
|
@ -672,7 +654,7 @@ impl<'tcx> OnUnimplementedFormatString {
|
||||||
None => {
|
None => {
|
||||||
if let Some(val) = options.get(&s) {
|
if let Some(val) = options.get(&s) {
|
||||||
val
|
val
|
||||||
} else if s == sym::from_desugaring || s == sym::from_method {
|
} else if s == sym::from_desugaring {
|
||||||
// don't break messages using these two arguments incorrectly
|
// don't break messages using these two arguments incorrectly
|
||||||
&empty_string
|
&empty_string
|
||||||
} else if s == sym::ItemContext {
|
} else if s == sym::ItemContext {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
error[E0277]: the trait bound `impl Foo<u8>: Foo<char>` is not satisfied
|
||||||
|
--> $DIR/return-dont-satisfy-bounds.rs:13:34
|
||||||
|
|
|
||||||
|
LL | fn foo<F2: Foo<u8>>(self) -> impl Foo<u8> {
|
||||||
|
| ^^^^^^^^^^^^ the trait `Foo<char>` is not implemented for `impl Foo<u8>`
|
||||||
|
|
|
||||||
|
= help: the trait `Foo<char>` is implemented for `Bar`
|
||||||
|
note: required by a bound in `Foo::foo::{opaque#0}`
|
||||||
|
--> $DIR/return-dont-satisfy-bounds.rs:7:30
|
||||||
|
|
|
||||||
|
LL | fn foo<F2>(self) -> impl Foo<T>;
|
||||||
|
| ^^^^^^ required by this bound in `Foo::foo::{opaque#0}`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
|
@ -0,0 +1,16 @@
|
||||||
|
error[E0277]: the trait bound `impl Foo<u8>: Foo<char>` is not satisfied
|
||||||
|
--> $DIR/return-dont-satisfy-bounds.rs:13:34
|
||||||
|
|
|
||||||
|
LL | fn foo<F2: Foo<u8>>(self) -> impl Foo<u8> {
|
||||||
|
| ^^^^^^^^^^^^ the trait `Foo<char>` is not implemented for `impl Foo<u8>`
|
||||||
|
|
|
||||||
|
= help: the trait `Foo<char>` is implemented for `Bar`
|
||||||
|
note: required by a bound in `Foo::{opaque#0}`
|
||||||
|
--> $DIR/return-dont-satisfy-bounds.rs:7:30
|
||||||
|
|
|
||||||
|
LL | fn foo<F2>(self) -> impl Foo<T>;
|
||||||
|
| ^^^^^^ required by this bound in `Foo::{opaque#0}`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
19
tests/ui/impl-trait/in-trait/return-dont-satisfy-bounds.rs
Normal file
19
tests/ui/impl-trait/in-trait/return-dont-satisfy-bounds.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
|
||||||
|
// revisions: current next
|
||||||
|
|
||||||
|
#![feature(return_position_impl_trait_in_trait)]
|
||||||
|
|
||||||
|
trait Foo<T> {
|
||||||
|
fn foo<F2>(self) -> impl Foo<T>;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Bar;
|
||||||
|
|
||||||
|
impl Foo<char> for Bar {
|
||||||
|
fn foo<F2: Foo<u8>>(self) -> impl Foo<u8> {
|
||||||
|
//~^ ERROR: the trait bound `impl Foo<u8>: Foo<char>` is not satisfied [E0277]
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue