Skip to content

Commit 6f67208

Browse files
authored
Rollup merge of #118799 - GKFX:stabilize-simple-offsetof, r=wesleywiser
Stabilize single-field offset_of This PR stabilizes offset_of for a single field. There has been some further discussion at #106655 about whether this is advisable; I'm opening the PR anyway so that the code is available.
2 parents 17c95b6 + 7924c9b commit 6f67208

35 files changed

+145
-56
lines changed

compiler/rustc_error_codes/src/error_codes/E0795.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Invalid argument for the `offset_of!` macro.
33
Erroneous code example:
44

55
```compile_fail,E0795
6-
#![feature(offset_of, offset_of_enum)]
6+
#![feature(offset_of_enum, offset_of_nested)]
77
88
let x = std::mem::offset_of!(Option<u8>, Some);
99
```
@@ -16,7 +16,7 @@ The offset of the contained `u8` in the `Option<u8>` can be found by specifying
1616
the field name `0`:
1717

1818
```
19-
#![feature(offset_of, offset_of_enum)]
19+
#![feature(offset_of_enum, offset_of_nested)]
2020
2121
let x: usize = std::mem::offset_of!(Option<u8>, Some.0);
2222
```

compiler/rustc_feature/src/unstable.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,9 @@ declare_features! (
549549
/// casts in safe Rust to `dyn Trait` for such a `Trait` is also forbidden.
550550
(unstable, object_safe_for_dispatch, "1.40.0", Some(43561)),
551551
/// Allows using enums in offset_of!
552-
(unstable, offset_of_enum, "1.75.0", Some(106655)),
552+
(unstable, offset_of_enum, "1.75.0", Some(120141)),
553+
/// Allows using multiple nested field accesses in offset_of!
554+
(unstable, offset_of_nested, "CURRENT_RUSTC_VERSION", Some(120140)),
553555
/// Allows using `#[optimize(X)]`.
554556
(unstable, optimize_attribute, "1.34.0", Some(54882)),
555557
/// Allows macro attributes on expressions, statements and non-inline modules.

compiler/rustc_hir_typeck/src/expr.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3246,6 +3246,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
32463246
) -> Ty<'tcx> {
32473247
let container = self.to_ty(container).normalized;
32483248

3249+
if let Some(ident_2) = fields.get(1)
3250+
&& !self.tcx.features().offset_of_nested
3251+
{
3252+
rustc_session::parse::feature_err(
3253+
&self.tcx.sess,
3254+
sym::offset_of_nested,
3255+
ident_2.span,
3256+
"only a single ident or integer is stable as the field in offset_of",
3257+
)
3258+
.emit();
3259+
}
3260+
32493261
let mut field_indices = Vec::with_capacity(fields.len());
32503262
let mut current_container = container;
32513263
let mut fields = fields.into_iter();

compiler/rustc_span/src/symbol.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,7 @@ symbols! {
11531153
offset,
11541154
offset_of,
11551155
offset_of_enum,
1156+
offset_of_nested,
11561157
ok_or_else,
11571158
omit_gdb_pretty_printer_section,
11581159
on,

library/core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
//
112112
// Library features:
113113
// tidy-alphabetical-start
114+
#![cfg_attr(not(bootstrap), feature(offset_of_nested))]
114115
#![feature(char_indices_offset)]
115116
#![feature(const_align_of_val)]
116117
#![feature(const_align_of_val_raw)]
@@ -176,7 +177,6 @@
176177
#![feature(isqrt)]
177178
#![feature(maybe_uninit_uninit_array)]
178179
#![feature(non_null_convenience)]
179-
#![feature(offset_of)]
180180
#![feature(offset_of_enum)]
181181
#![feature(panic_internals)]
182182
#![feature(ptr_alignment_type)]

library/core/src/mem/mod.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,11 +1303,12 @@ impl<T> SizedTypeProperties for T {}
13031303
/// Enum variants may be traversed as if they were fields. Variants themselves do
13041304
/// not have an offset.
13051305
///
1306+
/// However, on stable only a single field name is supported, which blocks the use of
1307+
/// enum support.
1308+
///
13061309
/// Visibility is respected - all types and fields must be visible to the call site:
13071310
///
13081311
/// ```
1309-
/// #![feature(offset_of)]
1310-
///
13111312
/// mod nested {
13121313
/// #[repr(C)]
13131314
/// pub struct Struct {
@@ -1330,8 +1331,6 @@ impl<T> SizedTypeProperties for T {}
13301331
/// not *identical*, e.g.:
13311332
///
13321333
/// ```
1333-
/// #![feature(offset_of)]
1334-
///
13351334
/// struct Wrapper<T, U>(T, U);
13361335
///
13371336
/// type A = Wrapper<u8, u8>;
@@ -1359,8 +1358,7 @@ impl<T> SizedTypeProperties for T {}
13591358
/// # Examples
13601359
///
13611360
/// ```
1362-
/// #![feature(offset_of)]
1363-
/// # #![feature(offset_of_enum)]
1361+
/// #![feature(offset_of_enum, offset_of_nested)]
13641362
///
13651363
/// use std::mem;
13661364
/// #[repr(C)]
@@ -1396,15 +1394,15 @@ impl<T> SizedTypeProperties for T {}
13961394
/// assert_eq!(mem::offset_of!(Option<&u8>, Some.0), 0);
13971395
/// ```
13981396
#[cfg(not(bootstrap))]
1399-
#[unstable(feature = "offset_of", issue = "106655")]
1397+
#[stable(feature = "offset_of", since = "CURRENT_RUSTC_VERSION")]
14001398
#[allow_internal_unstable(builtin_syntax, hint_must_use)]
14011399
pub macro offset_of($Container:ty, $($fields:expr)+ $(,)?) {
14021400
// The `{}` is for better error messages
14031401
crate::hint::must_use({builtin # offset_of($Container, $($fields)+)})
14041402
}
14051403

14061404
#[cfg(bootstrap)]
1407-
#[unstable(feature = "offset_of", issue = "106655")]
1405+
#[stable(feature = "offset_of", since = "CURRENT_RUSTC_VERSION")]
14081406
#[allow_internal_unstable(builtin_syntax, hint_must_use)]
14091407
#[allow(missing_docs)]
14101408
pub macro offset_of($Container:ty, $($fields:tt).+ $(,)?) {

library/core/tests/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
#![feature(noop_waker)]
6060
#![feature(numfmt)]
6161
#![feature(num_midpoint)]
62+
#![cfg_attr(not(bootstrap), feature(offset_of_nested))]
6263
#![feature(isqrt)]
6364
#![feature(step_trait)]
6465
#![feature(str_internals)]
@@ -115,7 +116,6 @@
115116
#![feature(utf8_chunks)]
116117
#![feature(is_ascii_octdigit)]
117118
#![feature(get_many_mut)]
118-
#![feature(offset_of)]
119119
#![feature(iter_map_windows)]
120120
#![allow(internal_features)]
121121
#![deny(unsafe_op_in_unsafe_fn)]

library/std/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,6 @@
329329
#![feature(maybe_uninit_slice)]
330330
#![feature(maybe_uninit_uninit_array)]
331331
#![feature(maybe_uninit_write_slice)]
332-
#![feature(offset_of)]
333332
#![feature(panic_can_unwind)]
334333
#![feature(panic_info_message)]
335334
#![feature(panic_internals)]

tests/mir-opt/const_prop/offset_of.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// unit-test: GVN
33
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
44

5-
#![feature(offset_of, offset_of_enum)]
5+
#![feature(offset_of_enum, offset_of_nested)]
66

77
use std::marker::PhantomData;
88
use std::mem::offset_of;

tests/mir-opt/dataflow-const-prop/offset_of.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// unit-test: DataflowConstProp
33
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
44

5-
#![feature(offset_of)]
5+
#![feature(offset_of_nested)]
66

77
use std::marker::PhantomData;
88
use std::mem::offset_of;

0 commit comments

Comments
 (0)