parent
f09fb488f7
commit
3fb53c2c85
@ -264,10 +264,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
NullaryOp(mir::NullOp::SizeOf, ty) => {
|
||||
let ty = self.subst_from_current_frame_and_normalize_erasing_regions(ty);
|
||||
let layout = self.layout_of(ty)?;
|
||||
assert!(
|
||||
!layout.is_unsized(),
|
||||
"SizeOf nullary MIR operator called for unsized type"
|
||||
);
|
||||
if layout.is_unsized() {
|
||||
// FIXME: This should be a span_bug (#80742)
|
||||
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)?;
|
||||
}
|
||||
|
||||
|
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…
x
Reference in New Issue
Block a user