parent
f09fb488f7
commit
3fb53c2c85
3 changed files with 82 additions and 4 deletions
|
@ -264,10 +264,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
NullaryOp(mir::NullOp::SizeOf, ty) => {
|
NullaryOp(mir::NullOp::SizeOf, ty) => {
|
||||||
let ty = self.subst_from_current_frame_and_normalize_erasing_regions(ty);
|
let ty = self.subst_from_current_frame_and_normalize_erasing_regions(ty);
|
||||||
let layout = self.layout_of(ty)?;
|
let layout = self.layout_of(ty)?;
|
||||||
assert!(
|
if layout.is_unsized() {
|
||||||
!layout.is_unsized(),
|
// FIXME: This should be a span_bug (#80742)
|
||||||
"SizeOf nullary MIR operator called for unsized type"
|
self.tcx.sess.delay_span_bug(
|
||||||
);
|
self.frame().current_span(),
|
||||||
|
&format!("SizeOf nullary MIR operator called for unsized type {}", ty),
|
||||||
|
);
|
||||||
|
}
|
||||||
self.write_scalar(Scalar::from_machine_usize(layout.size.bytes(), self), dest)?;
|
self.write_scalar(Scalar::from_machine_usize(layout.size.bytes(), self), dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
33
src/test/ui/mir/issue-80742.rs
Normal file
33
src/test/ui/mir/issue-80742.rs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// check-fail
|
||||||
|
|
||||||
|
// This test used to cause an ICE in rustc_mir::interpret::step::eval_rvalue_into_place
|
||||||
|
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(const_evaluatable_checked)]
|
||||||
|
#![feature(const_generics)]
|
||||||
|
|
||||||
|
use std::fmt::Debug;
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
use std::mem::size_of;
|
||||||
|
|
||||||
|
struct Inline<T>
|
||||||
|
where
|
||||||
|
[u8; size_of::<T>() + 1]: ,
|
||||||
|
{
|
||||||
|
_phantom: PhantomData<T>,
|
||||||
|
buf: [u8; size_of::<T>() + 1],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Inline<T>
|
||||||
|
where
|
||||||
|
[u8; size_of::<T>() + 1]: ,
|
||||||
|
{
|
||||||
|
pub fn new(val: T) -> Inline<T> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let dst = Inline::<dyn Debug>::new(0); //~ ERROR
|
||||||
|
//~^ ERROR
|
||||||
|
}
|
42
src/test/ui/mir/issue-80742.stderr
Normal file
42
src/test/ui/mir/issue-80742.stderr
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
error[E0599]: no function or associated item named `new` found for struct `Inline<dyn Debug>` in the current scope
|
||||||
|
--> $DIR/issue-80742.rs:31:36
|
||||||
|
|
|
||||||
|
LL | / struct Inline<T>
|
||||||
|
LL | | where
|
||||||
|
LL | | [u8; size_of::<T>() + 1]: ,
|
||||||
|
LL | | {
|
||||||
|
LL | | _phantom: PhantomData<T>,
|
||||||
|
LL | | buf: [u8; size_of::<T>() + 1],
|
||||||
|
LL | | }
|
||||||
|
| |_- function or associated item `new` not found for this
|
||||||
|
...
|
||||||
|
LL | let dst = Inline::<dyn Debug>::new(0);
|
||||||
|
| ^^^ function or associated item not found in `Inline<dyn Debug>`
|
||||||
|
|
|
||||||
|
::: $SRC_DIR/core/src/fmt/mod.rs:LL:COL
|
||||||
|
|
|
||||||
|
LL | pub trait Debug {
|
||||||
|
| --------------- doesn't satisfy `dyn Debug: Sized`
|
||||||
|
|
|
||||||
|
= note: the method `new` exists but the following trait bounds were not satisfied:
|
||||||
|
`dyn Debug: Sized`
|
||||||
|
|
||||||
|
error[E0277]: the size for values of type `dyn Debug` cannot be known at compilation time
|
||||||
|
--> $DIR/issue-80742.rs:31:15
|
||||||
|
|
|
||||||
|
LL | struct Inline<T>
|
||||||
|
| - required by this bound in `Inline`
|
||||||
|
...
|
||||||
|
LL | let dst = Inline::<dyn Debug>::new(0);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `dyn Debug`
|
||||||
|
help: consider relaxing the implicit `Sized` restriction
|
||||||
|
|
|
||||||
|
LL | struct Inline<T: ?Sized>
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0277, E0599.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
Loading…
Add table
Add a link
Reference in a new issue