Don't ICE when trying to copy unsized value in const prop
This commit is contained in:
parent
f914b82a75
commit
c7d1ec009c
2 changed files with 35 additions and 5 deletions
|
@ -640,11 +640,17 @@ where
|
||||||
// avoid force_allocation.
|
// avoid force_allocation.
|
||||||
let src = match self.read_immediate_raw(src)? {
|
let src = match self.read_immediate_raw(src)? {
|
||||||
Ok(src_val) => {
|
Ok(src_val) => {
|
||||||
assert!(!src.layout.is_unsized(), "cannot copy unsized immediates");
|
// FIXME(const_prop): Const-prop can possibly evaluate an
|
||||||
assert!(
|
// unsized copy operation when it thinks that the type is
|
||||||
!dest.layout.is_unsized(),
|
// actually sized, due to a trivially false where-clause
|
||||||
"the src is sized, so the dest must also be sized"
|
// predicate like `where Self: Sized` with `Self = dyn Trait`.
|
||||||
);
|
// See #102553 for an example of such a predicate.
|
||||||
|
if src.layout.is_unsized() {
|
||||||
|
throw_inval!(SizeOfUnsizedType(src.layout.ty));
|
||||||
|
}
|
||||||
|
if dest.layout.is_unsized() {
|
||||||
|
throw_inval!(SizeOfUnsizedType(dest.layout.ty));
|
||||||
|
}
|
||||||
assert_eq!(src.layout.size, dest.layout.size);
|
assert_eq!(src.layout.size, dest.layout.size);
|
||||||
// Yay, we got a value that we can write directly.
|
// Yay, we got a value that we can write directly.
|
||||||
return if layout_compat {
|
return if layout_compat {
|
||||||
|
|
24
src/test/ui/const_prop/issue-102553.rs
Normal file
24
src/test/ui/const_prop/issue-102553.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// compile-flags: --crate-type=lib
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
pub trait Widget<E> {
|
||||||
|
fn boxed<'w>(self) -> Box<dyn WidgetDyn<E> + 'w>
|
||||||
|
where
|
||||||
|
Self: Sized + 'w;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait WidgetDyn<E> {}
|
||||||
|
|
||||||
|
impl<T, E> WidgetDyn<E> for T where T: Widget<E> {}
|
||||||
|
|
||||||
|
impl<E> Widget<E> for dyn WidgetDyn<E> + '_ {
|
||||||
|
fn boxed<'w>(self) -> Box<dyn WidgetDyn<E> + 'w>
|
||||||
|
where
|
||||||
|
Self: Sized + 'w,
|
||||||
|
{
|
||||||
|
// Even though this is illegal to const evaluate, this should never
|
||||||
|
// trigger an ICE because it can never be called from actual code
|
||||||
|
// (due to the trivially false where-clause predicate).
|
||||||
|
Box::new(self)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue