Do not ICE on invalid input
This commit is contained in:
parent
9f6c670c4b
commit
cd259dbd19
3 changed files with 89 additions and 7 deletions
|
@ -463,10 +463,17 @@ fn virtual_call_violation_for_method<'tcx>(
|
||||||
|
|
||||||
let param_env = tcx.param_env(method.def_id);
|
let param_env = tcx.param_env(method.def_id);
|
||||||
|
|
||||||
let abi_of_ty = |ty: Ty<'tcx>| -> &Abi {
|
let abi_of_ty = |ty: Ty<'tcx>| -> Option<&Abi> {
|
||||||
match tcx.layout_of(param_env.and(ty)) {
|
match tcx.layout_of(param_env.and(ty)) {
|
||||||
Ok(layout) => &layout.abi,
|
Ok(layout) => Some(&layout.abi),
|
||||||
Err(err) => bug!("error: {}\n while computing layout for type {:?}", err, ty),
|
Err(err) => {
|
||||||
|
// #78372
|
||||||
|
tcx.sess.delay_span_bug(
|
||||||
|
tcx.def_span(method.def_id),
|
||||||
|
&format!("error: {}\n while computing layout for type {:?}", err, ty),
|
||||||
|
);
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -475,7 +482,7 @@ fn virtual_call_violation_for_method<'tcx>(
|
||||||
receiver_for_self_ty(tcx, receiver_ty, tcx.mk_unit(), method.def_id);
|
receiver_for_self_ty(tcx, receiver_ty, tcx.mk_unit(), method.def_id);
|
||||||
|
|
||||||
match abi_of_ty(unit_receiver_ty) {
|
match abi_of_ty(unit_receiver_ty) {
|
||||||
&Abi::Scalar(..) => (),
|
Some(Abi::Scalar(..)) => (),
|
||||||
abi => {
|
abi => {
|
||||||
tcx.sess.delay_span_bug(
|
tcx.sess.delay_span_bug(
|
||||||
tcx.def_span(method.def_id),
|
tcx.def_span(method.def_id),
|
||||||
|
@ -495,13 +502,12 @@ fn virtual_call_violation_for_method<'tcx>(
|
||||||
receiver_for_self_ty(tcx, receiver_ty, trait_object_ty, method.def_id);
|
receiver_for_self_ty(tcx, receiver_ty, trait_object_ty, method.def_id);
|
||||||
|
|
||||||
match abi_of_ty(trait_object_receiver) {
|
match abi_of_ty(trait_object_receiver) {
|
||||||
&Abi::ScalarPair(..) => (),
|
Some(Abi::ScalarPair(..)) => (),
|
||||||
abi => {
|
abi => {
|
||||||
tcx.sess.delay_span_bug(
|
tcx.sess.delay_span_bug(
|
||||||
tcx.def_span(method.def_id),
|
tcx.def_span(method.def_id),
|
||||||
&format!(
|
&format!(
|
||||||
"receiver when `Self = {}` should have a ScalarPair ABI; \
|
"receiver when `Self = {}` should have a ScalarPair ABI; found {:?}",
|
||||||
found {:?}",
|
|
||||||
trait_object_ty, abi
|
trait_object_ty, abi
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
14
src/test/ui/issues/issue-78372.rs
Normal file
14
src/test/ui/issues/issue-78372.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
use std::ops::DispatchFromDyn; //~ ERROR use of unstable library feature 'dispatch_from_dyn'
|
||||||
|
struct Smaht<T, MISC>(PhantomData); //~ ERROR cannot find type `PhantomData` in this scope
|
||||||
|
impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {} //~ ERROR cannot find type `U` in this scope
|
||||||
|
//~^ ERROR cannot find type `MISC` in this scope
|
||||||
|
//~| ERROR use of unstable library feature 'dispatch_from_dyn'
|
||||||
|
//~| ERROR the trait `DispatchFromDyn` may only be implemented for a coercion between structures
|
||||||
|
//~| ERROR type parameter `T` must be covered by another type when it appears before the first
|
||||||
|
trait Foo: X<u32> {}
|
||||||
|
trait X<T> {
|
||||||
|
fn foo(self: Smaht<Self, T>);
|
||||||
|
}
|
||||||
|
trait Marker {}
|
||||||
|
impl Marker for dyn Foo {}
|
||||||
|
fn main() {}
|
62
src/test/ui/issues/issue-78372.stderr
Normal file
62
src/test/ui/issues/issue-78372.stderr
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
error[E0412]: cannot find type `PhantomData` in this scope
|
||||||
|
--> $DIR/issue-78372.rs:2:23
|
||||||
|
|
|
||||||
|
LL | struct Smaht<T, MISC>(PhantomData);
|
||||||
|
| ^^^^^^^^^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this struct
|
||||||
|
|
|
||||||
|
LL | use std::marker::PhantomData;
|
||||||
|
|
|
||||||
|
|
||||||
|
error[E0412]: cannot find type `U` in this scope
|
||||||
|
--> $DIR/issue-78372.rs:3:31
|
||||||
|
|
|
||||||
|
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||||
|
| - ^ help: a type parameter with a similar name exists: `T`
|
||||||
|
| |
|
||||||
|
| similarly named type parameter `T` defined here
|
||||||
|
|
||||||
|
error[E0412]: cannot find type `MISC` in this scope
|
||||||
|
--> $DIR/issue-78372.rs:3:34
|
||||||
|
|
|
||||||
|
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||||
|
| - ^^^^ not found in this scope
|
||||||
|
| |
|
||||||
|
| help: you might be missing a type parameter: `, MISC`
|
||||||
|
|
||||||
|
error[E0658]: use of unstable library feature 'dispatch_from_dyn'
|
||||||
|
--> $DIR/issue-78372.rs:1:5
|
||||||
|
|
|
||||||
|
LL | use std::ops::DispatchFromDyn;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: add `#![feature(dispatch_from_dyn)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error[E0658]: use of unstable library feature 'dispatch_from_dyn'
|
||||||
|
--> $DIR/issue-78372.rs:3:9
|
||||||
|
|
|
||||||
|
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: add `#![feature(dispatch_from_dyn)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error[E0378]: the trait `DispatchFromDyn` may only be implemented for a coercion between structures
|
||||||
|
--> $DIR/issue-78372.rs:3:1
|
||||||
|
|
|
||||||
|
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Smaht<[type error], [type error]>`)
|
||||||
|
--> $DIR/issue-78372.rs:3:6
|
||||||
|
|
|
||||||
|
LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
|
||||||
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Smaht<[type error], [type error]>`)
|
||||||
|
|
|
||||||
|
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local, and no uncovered type parameters appear before that first local type
|
||||||
|
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0210, E0378, E0412, E0658.
|
||||||
|
For more information about an error, try `rustc --explain E0210`.
|
Loading…
Add table
Add a link
Reference in a new issue