---
# System prepended metadata

title: Lang-docs office hours 2026-01-20

---

---
title: "Lang-docs office hours 2026-01-20"
date: 2026-01-20
url: https://hackmd.io/hXAWQDOiS6eOgqV-BShWcQ
---

# Lang-docs office hours 2026-01-20

People: TC, ehuss

https://meet.jit.si/rust-t-lang-docs

## Unwrap more chapters #2134

https://github.com/rust-lang/reference/pull/2134

Easy.  Merging.

## Rename the ".general" rules #2133

https://github.com/rust-lang/reference/pull/2133

Make sense.  Rebased and merged.

## const-eval: explain the final-value-byte-provenance restriction #2138

https://github.com/rust-lang/reference/pull/2138

Decided to keep it in const-eval for now, in a separate section.

Want to leave space, when doing a typed copy, we want to unintialize padding bytes in the destination. But we cannot do that right now (for perf or other reasons). We want to keep it unspecified how typed copies work. We don't want it observable. 

Eric doesn't understand why linkers care about this, or how they know that there are pointer fragments inside padding.

The perf run (for making bytes uninit during the typed copies in consteval) was:

https://github.com/rust-lang/rust/pull/149901

Opened https://github.com/rust-lang/mdBook/issues/3009 about `mdbook test --chapter` path confusion.

## fix field-less `repr(C)` enum docs #2018

https://github.com/rust-lang/reference/pull/2018

Eric: Could use a little wordsmithing, and style update (unwrapping, parentheticals, and such).

Confused on layout.repr.c.enum, it says it's either int or unsigned int, but doesn't say why it would be one or the other? Dealer's choice? An example could maybe clear up why it is "crucial"? 


## `cfg_select!` #2103

https://github.com/rust-lang/reference/pull/2103

Statement
Item
Expression
Pattern
Type

Responded at https://github.com/rust-lang/reference/pull/2103#discussion_r2710591524

Stabilization itself is still blocked on:
- unreachable_cfg_select_predicates lint https://github.com/rust-lang/rust/pull/149960
- rustfmt support https://github.com/rust-lang/rust/pull/144323 (though may want to move forward regardless)

```rust
fn main() {
    let cfg_select! {
        any() => (0..=255, ..), // OK.
        _ => _,
    }: (u8, u8) = (0, 0);
}
```

```rust
fn main() {
    let cfg_select! {
        any() => (x @ 0..=255, ..), // ERROR.
        _ => _,
    }: (u8, u8) = (0, 0);
}
```

```rust
fn main() {
    let cfg_select! {
        any() => { (x @ 0..=255, ..) } // OK.
        _ => _,
    }: (u8, u8) = (0, 0);
}
```

### Token splitting

Eric muses on the pain of how to model token splitting.

Example is MacroRepSep cannot be `*=` or `+=` because it doesn't split. Splitting is somewhat hard-coded based on circumstance, and the compiler doesn't do it in that case.

Wonders if the rule should be that rustc should always be splitting, and when it doesn't it's a bug.

PEG section 2.1 https://bford.info/pub/lang/peg.pdf talks about how to unify lexical and cfg.

## Add a chapter on divergence #2067

https://github.com/rust-lang/reference/pull/2067

Question on LUBs:

We have proposed text along the lines of:

> r[expr.loop.block-labels.type]
> The type of a labeled block expression is the [least upper bound] of all of the break operands, and the final operand. If the final operand is omitted, the type of the final operand defaults to the [unit type], unless the block [diverges][expr.block.diverging], in which case it is the [never type].

Is the following rule redundant:

r[expr.loop.break-value.diverging]
A `loop` with associated `break` expressions does not [diverge] if any of the break operands do not diverge. If all of the `break` operands diverge, then the `loop` expression also diverges.

when compared with this rule:

r[expr.loop.break-value.type]
The type of a `loop` with associated `break` expressions is the [least upper bound] of all of the break operands.

There's a difference between the type of an expression and whether it diverges, and that comes into play here.

```rust
loop {
	break {
		panic!();
		()
	};
}
```

So...do we need to have the same language for arrays? What about all other expressions?


```rust
[{panic!(); ()}]; // This diverges?

struct S {
    x: i32
}

fn s() -> ! {
    let s = S{         // This diverges?
        x: panic!() 
    };
}

```

That is an array of type `[(); 1]` that is a diverging expression.

Is there a way to probe the compiler to determine if an expression diverges?

If we write a function that returns type `!` and contains some expression:

```rust
fn f() -> ! { //~ ERROR mismatched types
    {
        (panic!(), ());
        ()
    } // This is a diverging expression.
}
```

We can say, I think, that "if this type checks, then the expression is diverging" but we can't say the inverse, "if the expression is diverging, then this type checks".

We can do this, I think, by using the rules about reading from a diverging place:

```rust!
struct W<T>(T);

fn f() -> ! {
    let x = W({ // <-- This block is what we're testing.
        panic!();
        ()
    });
    let _x = x.0;
}
```

With a bit of code golf:

```rust
fn f() -> ! {
    let _x = ({
        panic!();
        ()
    },).0;
}
```

This is a path expression that diverges:


```rust
fn f(x: !) -> ! {
    x;
}
```

To express that without nightly never, we can say, e.g.:

```rust
fn phantom_call<T>(_: impl FnOnce(T) -> T) {}

fn main() {
    phantom_call(|x /* : ! */| -> ! {
        x;
    });
}
```

## Add cut operator (^) to grammar #2104

https://github.com/rust-lang/reference/pull/2104

## Add a contributor guide #2097

https://github.com/rust-lang/reference/pull/2097

## Rework the introduction and add a scope chapter

https://github.com/rust-lang/reference/pull/2100
