diff options
| author | Lukas Markeffsky <@> | 2023-05-17 22:10:36 +0200 |
|---|---|---|
| committer | Lukas Markeffsky <@> | 2023-05-20 15:20:27 +0200 |
| commit | 7cdb23b98a58a4e73ab1e4ca5e3bb7d04645bdd7 (patch) | |
| tree | 39a5ca1cfd00c064f1901e4d886308ff201d0146 | |
| parent | 6d1bf733d6d2501fa4f8dd99c7d9a97e2d23d284 (diff) | |
| download | rust-7cdb23b98a58a4e73ab1e4ca5e3bb7d04645bdd7.tar.gz rust-7cdb23b98a58a4e73ab1e4ca5e3bb7d04645bdd7.zip | |
don't skip inference for type in `offset_of!`
| -rw-r--r-- | compiler/rustc_hir_typeck/src/writeback.rs | 10 | ||||
| -rw-r--r-- | compiler/rustc_mir_build/src/build/expr/as_rvalue.rs | 7 | ||||
| -rw-r--r-- | library/core/tests/mem.rs | 5 | ||||
| -rw-r--r-- | tests/ui/offset-of/offset-of-arg-count.rs | 2 | ||||
| -rw-r--r-- | tests/ui/offset-of/offset-of-dst-field.rs | 1 | ||||
| -rw-r--r-- | tests/ui/offset-of/offset-of-dst-field.stderr | 13 | ||||
| -rw-r--r-- | tests/ui/offset-of/offset-of-inference.rs | 11 | ||||
| -rw-r--r-- | tests/ui/offset-of/offset-of-inference.stderr | 9 |
8 files changed, 42 insertions, 16 deletions
diff --git a/compiler/rustc_hir_typeck/src/writeback.rs b/compiler/rustc_hir_typeck/src/writeback.rs index eed3c65eccc..a4c6dd4332a 100644 --- a/compiler/rustc_hir_typeck/src/writeback.rs +++ b/compiler/rustc_hir_typeck/src/writeback.rs @@ -692,15 +692,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> { fcx_typeck_results.offset_of_data().items_in_stable_order() { let hir_id = hir::HirId { owner: common_hir_owner, local_id }; - - if cfg!(debug_assertions) && container.has_infer() { - span_bug!( - hir_id.to_span(self.fcx.tcx), - "writeback: `{:?}` has inference variables", - container - ); - }; - + let container = self.resolve(container, &hir_id); self.typeck_results.offset_of_data_mut().insert(hir_id, (container, indices.clone())); } } diff --git a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs index 0105a265ffb..c385b00692f 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs @@ -481,10 +481,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { })))) } - ExprKind::OffsetOf { container, fields } => block.and(Rvalue::NullaryOp( - NullOp::OffsetOf(fields), - this.tcx.erase_regions(container), - )), + ExprKind::OffsetOf { container, fields } => { + block.and(Rvalue::NullaryOp(NullOp::OffsetOf(fields), container)) + } ExprKind::Literal { .. } | ExprKind::NamedConst { .. } diff --git a/library/core/tests/mem.rs b/library/core/tests/mem.rs index 0a9850146e5..aee9c89b595 100644 --- a/library/core/tests/mem.rs +++ b/library/core/tests/mem.rs @@ -394,6 +394,8 @@ fn offset_of() { z: T } + trait Trait {} + // Ensure that this type of generics works fn offs_of_z<T>() -> usize { offset_of!(Generic<T>, z) @@ -401,6 +403,9 @@ fn offset_of() { assert_eq!(offset_of!(Generic<u8>, z), 8); assert_eq!(offs_of_z::<u8>(), 8); + + // Ensure that it works with the implicit lifetime in `Box<dyn Trait + '_>`. + assert_eq!(offset_of!(Generic<Box<dyn Trait>>, z), 8); } #[test] diff --git a/tests/ui/offset-of/offset-of-arg-count.rs b/tests/ui/offset-of/offset-of-arg-count.rs index 92a205f14d9..31de45bc756 100644 --- a/tests/ui/offset-of/offset-of-arg-count.rs +++ b/tests/ui/offset-of/offset-of-arg-count.rs @@ -13,7 +13,7 @@ fn main() { offset_of!(S, f..); //~ ERROR no rules expected the token offset_of!(S, f..,); //~ ERROR no rules expected the token offset_of!(Lt<'static>, bar); // issue #111657 - + offset_of!(Lt<'_>, bar); // issue #111678 } struct S { f: u8, } diff --git a/tests/ui/offset-of/offset-of-dst-field.rs b/tests/ui/offset-of/offset-of-dst-field.rs index 89e73b8c6b8..3b8dc0b84a4 100644 --- a/tests/ui/offset-of/offset-of-dst-field.rs +++ b/tests/ui/offset-of/offset-of-dst-field.rs @@ -41,6 +41,7 @@ fn main() { fn delta() { offset_of!(Delta<Alpha>, z); //~ ERROR the size for values of type offset_of!(Delta<Extern>, z); //~ ERROR the size for values of type + offset_of!(Delta<dyn Trait>, z); //~ ERROR the size for values of type } fn generic_with_maybe_sized<T: ?Sized>() -> usize { diff --git a/tests/ui/offset-of/offset-of-dst-field.stderr b/tests/ui/offset-of/offset-of-dst-field.stderr index 992eab3d4bd..128c783d5dd 100644 --- a/tests/ui/offset-of/offset-of-dst-field.stderr +++ b/tests/ui/offset-of/offset-of-dst-field.stderr @@ -34,6 +34,15 @@ LL | offset_of!(Delta<Extern>, z); = help: the trait `Sized` is not implemented for `Extern` = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info) +error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time + --> $DIR/offset-of-dst-field.rs:44:5 + | +LL | offset_of!(Delta<dyn Trait>, z); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `dyn Trait` + = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info) + error[E0277]: the size for values of type `[u8]` cannot be known at compilation time --> $DIR/offset-of-dst-field.rs:42:5 | @@ -49,7 +58,7 @@ LL | struct Alpha { = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the size for values of type `T` cannot be known at compilation time - --> $DIR/offset-of-dst-field.rs:47:5 + --> $DIR/offset-of-dst-field.rs:48:5 | LL | fn generic_with_maybe_sized<T: ?Sized>() -> usize { | - this type parameter needs to be `std::marker::Sized` @@ -63,6 +72,6 @@ LL - fn generic_with_maybe_sized<T: ?Sized>() -> usize { LL + fn generic_with_maybe_sized<T>() -> usize { | -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/offset-of/offset-of-inference.rs b/tests/ui/offset-of/offset-of-inference.rs new file mode 100644 index 00000000000..ba87574eae0 --- /dev/null +++ b/tests/ui/offset-of/offset-of-inference.rs @@ -0,0 +1,11 @@ +// Test that inference types in `offset_of!` don't ICE. + +#![feature(offset_of)] + +struct Foo<T> { + x: T, +} + +fn main() { + let _ = core::mem::offset_of!(Foo<_>, x); //~ ERROR: type annotations needed +} diff --git a/tests/ui/offset-of/offset-of-inference.stderr b/tests/ui/offset-of/offset-of-inference.stderr new file mode 100644 index 00000000000..2a520f6f906 --- /dev/null +++ b/tests/ui/offset-of/offset-of-inference.stderr @@ -0,0 +1,9 @@ +error[E0282]: type annotations needed + --> $DIR/offset-of-inference.rs:10:35 + | +LL | let _ = core::mem::offset_of!(Foo<_>, x); + | ^^^^^^ cannot infer type + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0282`. |
