rust/compiler
bors 9b72238eb8 Auto merge of #128543 - RalfJung:const-interior-mut, r=fee1-dead
const-eval interning: accept interior mutable pointers in final value

…but keep rejecting mutable references

This fixes https://github.com/rust-lang/rust/issues/121610 by no longer firing the lint when there is a pointer with interior mutability in the final value of the constant. On stable, such pointers can be created with code like:
```rust
pub enum JsValue {
    Undefined,
    Object(Cell<bool>),
}
impl Drop for JsValue {
    fn drop(&mut self) {}
}
// This does *not* get promoted since `JsValue` has a destructor.
// However, the outer scope rule applies, still giving this 'static lifetime.
const UNDEFINED: &JsValue = &JsValue::Undefined;
```
It's not great to accept such values since people *might* think that it is legal to mutate them with unsafe code. (This is related to how "infectious" `UnsafeCell` is, which is a [wide open question](https://github.com/rust-lang/unsafe-code-guidelines/issues/236).) However, we [explicitly document](https://doc.rust-lang.org/reference/behavior-considered-undefined.html) that things created by `const` are immutable. Furthermore, we also accept the following even more questionable code without any lint today:
```rust
let x: &'static Option<Cell<i32>> = &None;
```
This is even more questionable since it does *not* involve a `const`, and yet still puts the data into immutable memory. We could view this as promotion [potentially introducing UB](https://github.com/rust-lang/unsafe-code-guidelines/issues/493). However, we've accepted this since ~forever and it's [too late to reject this now](https://github.com/rust-lang/rust/pull/122789); the pattern is just too useful.

So basically, if you think that `UnsafeCell` should be tracked fully precisely, then you should want the lint we currently emit to be removed, which this PR does. If you think `UnsafeCell` should "infect" surrounding `enum`s, the big problem is really https://github.com/rust-lang/unsafe-code-guidelines/issues/493 which does not trigger the lint -- the cases the lint triggers on are actually the "harmless" ones as there is an explicit surrounding `const` explaining why things end up being immutable.

What all this goes to show is that the hard error added in https://github.com/rust-lang/rust/pull/118324 (later turned into the future-compat lint that I am now suggesting we remove) was based on some wrong assumptions, at least insofar as it concerns shared references. Furthermore, that lint does not help at all for the most problematic case here where the potential UB is completely implicit. (In fact, the lint is actively in the way of [my preferred long-term strategy](https://github.com/rust-lang/unsafe-code-guidelines/issues/493#issuecomment-2028674105) for dealing with this UB.) So I think we should go back to square one and remove that error/lint for shared references. For mutable references, it does seem to work as intended, so we can keep it. Here it serves as a safety net in case the static checks that try to contain mutable references to the inside of a const initializer are not working as intended; I therefore made the check ICE to encourage users to tell us if that safety net is triggered.

Closes https://github.com/rust-lang/rust/issues/122153 by removing the lint.

Cc `@rust-lang/opsem` `@rust-lang/lang`
2024-09-14 21:11:04 +00:00
..
rustc disable size asserts in the compiler when randomizing layouts 2024-08-31 23:56:45 +02:00
rustc_abi inhibit layout randomization for Box 2024-08-31 23:56:45 +02:00
rustc_arena Remove unnecessary lifetimes from Arena. 2024-09-13 15:33:19 +10:00
rustc_ast Fix anon const def-creation when macros are involved 2024-09-12 13:48:30 -04:00
rustc_ast_ir
rustc_ast_lowering Re-enable ConstArgKind::Path lowering by default 2024-09-12 13:56:01 -04:00
rustc_ast_passes Rollup merge of #130252 - compiler-errors:const-gen, r=chenyukang 2024-09-12 20:37:18 +10:00
rustc_ast_pretty Add initial support for raw lifetimes 2024-09-06 10:32:48 -04:00
rustc_attr Remove needless returns detected by clippy in the compiler 2024-09-09 13:32:22 +02:00
rustc_baked_icu_data Don't add warn(unreachable_pub) to rustc_baked_icu. 2024-08-16 08:46:52 +10:00
rustc_borrowck Rollup merge of #130294 - nnethercote:more-lifetimes, r=lcnr 2024-09-14 18:12:13 +02:00
rustc_builtin_macros Rename and reorder lots of lifetimes. 2024-09-13 15:46:20 +10:00
rustc_codegen_cranelift simd_shuffle: require index argument to be a vector 2024-09-14 14:43:24 +02:00
rustc_codegen_gcc simd_shuffle: require index argument to be a vector 2024-09-14 14:43:24 +02:00
rustc_codegen_llvm simd_shuffle: require index argument to be a vector 2024-09-14 14:43:24 +02:00
rustc_codegen_ssa Rollup merge of #130268 - RalfJung:simd-shuffle-idx-vector, r=compiler-errors 2024-09-14 18:12:10 +02:00
rustc_const_eval Auto merge of #128543 - RalfJung:const-interior-mut, r=fee1-dead 2024-09-14 21:11:04 +00:00
rustc_data_structures Add an internal lint that warns when accessing untracked data 2024-09-03 19:14:19 +02:00
rustc_driver
rustc_driver_impl Remove unnecessary lifetime from RunCompiler. 2024-09-13 15:36:55 +10:00
rustc_error_codes Ban non-array SIMD 2024-09-09 19:39:43 -07:00
rustc_error_messages Add warn(unreachable_pub) to rustc_error_messages. 2024-08-27 11:52:08 +10:00
rustc_errors clippy::useless_conversion 2024-09-11 17:52:53 -04:00
rustc_expand Remove unnecessary lifetimes from rustc_expand. 2024-09-13 15:33:21 +10:00
rustc_feature Auto merge of #107251 - dingxiangfei2009:let-chain-rescope, r=jieyouxu 2024-09-13 03:47:30 +00:00
rustc_fluent_macro Add warn(unreachable_pub) to rustc_fluent_macro. 2024-08-27 12:56:54 +10:00
rustc_fs_util
rustc_graphviz Add warn(unreachable_pub) to rustc_graphviz. 2024-08-27 12:58:29 +10:00
rustc_hir disallow naked_asm! outside of #[naked] functions 2024-09-10 15:19:14 +02:00
rustc_hir_analysis Auto merge of #107251 - dingxiangfei2009:let-chain-rescope, r=jieyouxu 2024-09-13 03:47:30 +00:00
rustc_hir_pretty Add warn(unreachable_pub) to rustc_hir_pretty. 2024-08-27 13:25:40 +10:00
rustc_hir_typeck Rollup merge of #130294 - nnethercote:more-lifetimes, r=lcnr 2024-09-14 18:12:13 +02:00
rustc_incremental Also fix if in else 2024-09-11 17:24:01 -04:00
rustc_index IntervalSet: add comment about representation 2024-09-08 16:54:28 +02:00
rustc_index_macros
rustc_infer Rollup merge of #130114 - eduardosm:needless-returns, r=compiler-errors 2024-09-11 15:53:22 -07:00
rustc_interface Rollup merge of #130199 - compiler-errors:by-move, r=cjgillot 2024-09-14 11:53:12 +10:00
rustc_lexer Add initial support for raw lifetimes 2024-09-06 10:32:48 -04:00
rustc_lint Auto merge of #128543 - RalfJung:const-interior-mut, r=fee1-dead 2024-09-14 21:11:04 +00:00
rustc_lint_defs const-eval interning: accpt interior mutable pointers in final value (but keep rejecting mutable references) 2024-09-10 10:26:16 +02:00
rustc_llvm update cfgs 2024-09-05 17:24:01 +01:00
rustc_log
rustc_macros Add warn(unreachable_pub) to rustc_metadata. 2024-08-29 20:13:06 +10:00
rustc_metadata Auto merge of #130036 - weiznich:diagnostic_unstable_tracking, r=compiler-errors 2024-09-08 23:39:00 +00:00
rustc_middle Auto merge of #128543 - RalfJung:const-interior-mut, r=fee1-dead 2024-09-14 21:11:04 +00:00
rustc_mir_build Rollup merge of #130294 - nnethercote:more-lifetimes, r=lcnr 2024-09-14 18:12:13 +02:00
rustc_mir_dataflow Rollup merge of #130294 - nnethercote:more-lifetimes, r=lcnr 2024-09-14 18:12:13 +02:00
rustc_mir_transform Auto merge of #130357 - fmease:rollup-j3ej4q0, r=fmease 2024-09-14 16:18:12 +00:00
rustc_monomorphize Rollup merge of #130235 - compiler-errors:nested-if, r=michaelwoerister 2024-09-12 20:37:16 +10:00
rustc_next_trait_solver Rollup merge of #130273 - lcnr:overflow-no-constraints, r=compiler-errors 2024-09-12 19:03:43 +02:00
rustc_parse Refactor Parser::break_up_float 2024-09-14 13:17:16 +02:00
rustc_parse_format Add warn(unreachable_pub) to rustc_parse_format. 2024-08-29 20:13:06 +10:00
rustc_passes Remove sess from CheckLoopVisitor. 2024-09-13 17:52:44 +10:00
rustc_pattern_analysis Revert warning empty patterns as unreachable 2024-09-11 18:36:45 +02:00
rustc_privacy Rename and reorder lots of lifetimes. 2024-09-13 15:46:20 +10:00
rustc_query_impl Rename and reorder lots of lifetimes. 2024-09-13 15:46:20 +10:00
rustc_query_system chore: Fix typos in 'compiler' (batch 2) 2024-09-02 07:50:22 +02:00
rustc_resolve Auto merge of #129137 - camelid:lazy-def-macro-const, r=BoxyUwU 2024-09-13 01:10:51 +00:00
rustc_sanitizers Also fix if in else 2024-09-11 17:24:01 -04:00
rustc_serialize Auto merge of #129777 - nnethercote:unreachable_pub-4, r=Urgau 2024-09-03 01:27:20 +00:00
rustc_session Add set_dcx to ParseSess 2024-09-13 11:15:19 +02:00
rustc_smir Auto merge of #129777 - nnethercote:unreachable_pub-4, r=Urgau 2024-09-03 01:27:20 +00:00
rustc_span Auto merge of #107251 - dingxiangfei2009:let-chain-rescope, r=jieyouxu 2024-09-13 03:47:30 +00:00
rustc_symbol_mangling clippy::useless_conversion 2024-09-11 17:52:53 -04:00
rustc_target Rollup merge of #130266 - heiher:loong-medium-cmodel, r=compiler-errors 2024-09-13 18:25:45 +02:00
rustc_trait_selection Rollup merge of #130294 - nnethercote:more-lifetimes, r=lcnr 2024-09-14 18:12:13 +02:00
rustc_traits Add warn(unreachable_pub) to rustc_traits. 2024-09-03 08:49:54 +10:00
rustc_transmute update cfgs 2024-09-05 17:24:01 +01:00
rustc_ty_utils Rename and reorder lots of lifetimes. 2024-09-13 15:46:20 +10:00
rustc_type_ir Rollup merge of #130311 - heiseish:issue-70849-fix, r=fmease 2024-09-14 20:22:41 +10:00
rustc_type_ir_macros
stable_mir chore: Fix typos in 'compiler' (batch 3) 2024-09-02 07:33:41 +02:00