From 4cb19853ed057b0e4a4d35494dc670aef7163b25 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Fri, 2 Aug 2024 14:39:50 +0200 Subject: [PATCH] bytes inside implicitly const-promoted expressions are immutable --- src/behavior-considered-undefined.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/behavior-considered-undefined.md b/src/behavior-considered-undefined.md index bee50109c..57ae4dbcf 100644 --- a/src/behavior-considered-undefined.md +++ b/src/behavior-considered-undefined.md @@ -49,10 +49,11 @@ Please read the [Rustonomicon] before writing unsafe code. All this also applies when values of these types are passed in a (nested) field of a compound type, but not behind pointer indirections. -* Mutating immutable bytes. All bytes inside a [`const`] item are immutable. +* Mutating immutable bytes. All bytes inside a [`const`] item are immutable, including implicitly [const-promoted] expressions. The bytes owned by an immutable binding or immutable `static` are immutable, unless those bytes are part of an [`UnsafeCell`]. - Moreover, the bytes [pointed to] by a shared reference, including transitively through other references (both shared and mutable) and `Box`es, are immutable; transitivity includes those references stored in fields of compound types. + Moreover, the bytes [pointed to] by a shared reference, including transitively through other references (both shared and mutable) and `Box`es, are immutable; + transitivity includes those references stored in fields of compound types. A mutation is any write of more than 0 bytes which overlaps with any of the relevant bytes (even if that write does not change the memory contents). * Invoking undefined behavior via compiler intrinsics. @@ -189,3 +190,4 @@ reading uninitialized memory is permitted are inside `union`s and in "padding" [project-field]: expressions/field-expr.md [project-tuple]: expressions/tuple-expr.md#tuple-indexing-expressions [project-slice]: expressions/array-expr.md#array-and-slice-indexing-expressions +[const-promoted]: destructors.md#constant-promotion