Skip to content

Commit

Permalink
Auto merge of #111696 - lukas-code:offset-of-erase-regions-harder, r=…
Browse files Browse the repository at this point in the history
…compiler-errors

don't skip inference for type in `offset_of!`

Fixes #111678 by no longer skipping inference on the type in `offset_of!`. Simply erasing the regions the during writeback isn't enough and can cause ICEs. A test case for this is included.

This reverts #111661, because it becomes redundant, since inference already erases the regions.
  • Loading branch information
bors committed May 21, 2023
2 parents 1b67f8b + 7cdb23b commit a11235d
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 16 deletions.
10 changes: 1 addition & 9 deletions compiler/rustc_hir_typeck/src/writeback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
}
}
Expand Down
7 changes: 3 additions & 4 deletions compiler/rustc_mir_build/src/build/expr/as_rvalue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 { .. }
Expand Down
5 changes: 5 additions & 0 deletions library/core/tests/mem.rs
Original file line number Diff line number Diff line change
Expand Up @@ -394,13 +394,18 @@ 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)
}

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]
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/offset-of/offset-of-arg-count.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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, }
Expand Down
1 change: 1 addition & 0 deletions tests/ui/offset-of/offset-of-dst-field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
13 changes: 11 additions & 2 deletions tests/ui/offset-of/offset-of-dst-field.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
|
Expand All @@ -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`
Expand All @@ -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`.
11 changes: 11 additions & 0 deletions tests/ui/offset-of/offset-of-inference.rs
Original file line number Diff line number Diff line change
@@ -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
}
9 changes: 9 additions & 0 deletions tests/ui/offset-of/offset-of-inference.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit a11235d

Please sign in to comment.