rust/compiler
Matthias Krüger 9aaebd481a
Rollup merge of #129392 - compiler-errors:raw-ref-op-doesnt-diverge-but-more, r=lcnr
Do not consider match/let/ref of place that evaluates to `!` to diverge, disallow coercions from them too

Fixes #117288.

This PR implements a heuristic which disables two things that are currently being performed on the HIR when we have **expressions that involve place-like expressions that point to `!`**. Specifically, it will (in certain cases explained below):

### (1.) Disable the `NeverToAny` coercion we implicitly insert for `!`.

Which fixes this inadvertent, sneaky unsoundness:

```
unsafe {
    let x: *const ! = &0 as *const u8 as *const !;
    let _: () = *x;
}
```

which is UB because currently rust emits an *implicit* NeverToAny coercion even though we really shouldn't be, since there's no read of the value pointed by `x`.

### (2.) Disable the logic which considers expression which evaluate to `!` to diverge, which affects the type returned by the containing block.

Which fixes this unsoundness:

```
fn make_up_a_value<T>() -> T {
    unsafe {
        let x: *const ! = &0 as *const u8 as *const !;
        let _ = *x;
    }
}
```

We disable these two operations **if** the expression is a place-like expression (locals, statics, field projections, index operations, and deref operations), and if the parent expression is either:
(1.) the LHS of an assignment
(2.) AddrOf
(3.) A match or let **unless** all of the *patterns consitute a read*, which is explained below:

And finally, a pattern currently is considered to constitute a read **unless** it is a wildcard, or an OR pattern. An OR pattern is considered to constitute a read if all of its subpatterns constitute a read, to remain as conservative as possible in cases like `_ | subpat` or `subpat | _`.

All other patterns are considered currently to constitute a read. Specifically, because `NeverToAny` is a coercion performed on a *value* and not a *place*, `Struct { .. }` on a `!` type must be a coercion currently, and we currently rely on this behavior to allow us to perform coercions like `let _: i32 = x;` where `x: !`.

This is already considered UB by [miri](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=daf3a2246433fe43fdc07d1389c276c9), but also means it does not affect the preexisting UB in this case:

```
let Struct { .. } = *never_ptr;
```

Even though it's likely up for debate since we're not actually reading any data out of the struct, it almost certainly causes inference changes which I do *NOT* want to fix in this PR.
2024-10-06 11:06:57 +02:00
..
rustc disable size asserts in the compiler when randomizing layouts 2024-08-31 23:56:45 +02:00
rustc_abi Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_arena Remove unnecessary lifetimes from Arena. 2024-09-13 15:33:19 +10:00
rustc_ast Implement boolean lit support in cfg predicates 2024-10-01 10:01:33 +02:00
rustc_ast_ir Add warn(unreachable_pub) to several crates. 2024-08-16 08:46:13 +10:00
rustc_ast_lowering rm ItemKind::OpaqueTy 2024-10-04 23:28:22 +00:00
rustc_ast_passes Rollup merge of #130419 - nnethercote:streamline-HirCollector, r=GuillaumeGomez 2024-10-03 13:47:59 +02:00
rustc_ast_pretty Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_attr Rollup merge of #131034 - Urgau:cfg-true-false, r=nnethercote 2024-10-04 15:42:53 +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 Auto merge of #129244 - cjgillot:opaque-hir, r=compiler-errors 2024-10-05 06:19:35 +00:00
rustc_builtin_macros Use ast::NestedMetaItem when evaluating cfg predicate 2024-10-01 10:01:09 +02:00
rustc_codegen_cranelift Use wide pointers consistenly across the compiler 2024-10-04 14:06:48 +02:00
rustc_codegen_gcc Use wide pointers consistenly across the compiler 2024-10-04 14:06:48 +02:00
rustc_codegen_llvm Use wide pointers consistenly across the compiler 2024-10-04 14:06:48 +02:00
rustc_codegen_ssa Rollup merge of #131202 - Urgau:wide-ptrs-compiler, r=jieyouxu 2024-10-04 15:42:54 +02:00
rustc_const_eval Use wide pointers consistenly across the compiler 2024-10-04 14:06:48 +02:00
rustc_data_structures format 2024-10-01 17:21:56 -04:00
rustc_driver Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_driver_impl bump few deps 2024-09-27 09:23:05 +03:00
rustc_error_codes Use wide pointers consistenly across the compiler 2024-10-04 14:06:48 +02:00
rustc_error_messages Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_errors bump few deps 2024-09-27 09:23:05 +03:00
rustc_expand Rollup merge of #131034 - Urgau:cfg-true-false, r=nnethercote 2024-10-04 15:42:53 +02:00
rustc_feature Rollup merge of #131034 - Urgau:cfg-true-false, r=nnethercote 2024-10-04 15:42:53 +02:00
rustc_fluent_macro Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_fs_util Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_graphviz Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_hir rm ItemKind::OpaqueTy 2024-10-04 23:28:22 +00:00
rustc_hir_analysis Auto merge of #129244 - cjgillot:opaque-hir, r=compiler-errors 2024-10-05 06:19:35 +00:00
rustc_hir_pretty rm ItemKind::OpaqueTy 2024-10-04 23:28:22 +00:00
rustc_hir_typeck Be far more strict about what we consider to be a read of never 2024-10-05 19:10:47 -04:00
rustc_incremental Dogfood feature(file_buffered) 2024-09-24 14:25:16 -07:00
rustc_index Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_index_macros Remove usage of specialization from newtype_index! 2024-06-30 16:42:53 +00:00
rustc_infer Rollup merge of #130518 - scottmcm:stabilize-controlflow-extra, r=dtolnay 2024-10-04 14:11:34 -07:00
rustc_interface Handle rustc_interface cases of rustc::potential_query_instability lint 2024-10-05 10:01:27 +03:00
rustc_lexer Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_lint Auto merge of #129244 - cjgillot:opaque-hir, r=compiler-errors 2024-10-05 06:19:35 +00:00
rustc_lint_defs Auto merge of #130540 - veera-sivarajan:fix-87525, r=estebank 2024-10-06 02:39:23 +00:00
rustc_llvm Unpin cc and upgrade to the latest version 2024-09-30 13:31:42 -04:00
rustc_log Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_macros Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_metadata Rollup merge of #130518 - scottmcm:stabilize-controlflow-extra, r=dtolnay 2024-10-04 14:11:34 -07:00
rustc_middle clarify semantics of ConstantIndex MIR projection 2024-10-05 12:19:14 +02:00
rustc_mir_build tweak Const::identity_unevaluated name and docs 2024-09-28 21:28:08 +02:00
rustc_mir_dataflow Fix some pub(crate) that were undetected bc of instrument 2024-10-04 14:02:09 -04:00
rustc_mir_transform Auto merge of #130540 - veera-sivarajan:fix-87525, r=estebank 2024-10-06 02:39:23 +00:00
rustc_monomorphize Use wide pointers consistenly across the compiler 2024-10-04 14:06:48 +02:00
rustc_next_trait_solver Auto merge of #130821 - lcnr:nalgebra-hang-2, r=compiler-errors 2024-10-02 19:21:44 +00:00
rustc_parse Rollup merge of #131034 - Urgau:cfg-true-false, r=nnethercote 2024-10-04 15:42:53 +02:00
rustc_parse_format Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_passes fix typo in 'lang item with track_caller' message 2024-10-05 17:12:46 +02:00
rustc_pattern_analysis cleanup: don't clone types that are Copy 2024-09-29 13:31:30 +02:00
rustc_privacy Visit opaques for visibilities. 2024-10-04 23:31:55 +00:00
rustc_query_impl Handle rustc_query_impl cases of rustc::potential_query_instability lint 2024-10-03 12:47:08 +03:00
rustc_query_system add unstable support for outputting file checksums for use in cargo 2024-10-01 21:23:20 -06:00
rustc_resolve rustdoc: prevent ctors from resolving 2024-10-03 22:01:23 -07:00
rustc_sanitizers Fix some pub(crate) that were undetected bc of instrument 2024-10-04 14:02:09 -04:00
rustc_serialize Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_session Rollup merge of #131034 - Urgau:cfg-true-false, r=nnethercote 2024-10-04 15:42:53 +02:00
rustc_smir Rollup merge of #130826 - fmease:compiler-mv-obj-safe-dyn-compat, r=compiler-errors 2024-09-27 21:35:08 +02:00
rustc_span Rollup merge of #131034 - Urgau:cfg-true-false, r=nnethercote 2024-10-04 15:42:53 +02:00
rustc_symbol_mangling Rollup merge of #130344 - Jaic1:fix-116306, r=BoxyUwU 2024-09-23 06:45:33 +02:00
rustc_target Update target fns to latest main 2024-10-05 12:14:35 +03:00
rustc_trait_selection Auto merge of #129244 - cjgillot:opaque-hir, r=compiler-errors 2024-10-05 06:19:35 +00:00
rustc_traits Compiler: Rename "object safe" to "dyn compatible" 2024-09-25 13:26:48 +02:00
rustc_transmute Fix some pub(crate) that were undetected bc of instrument 2024-10-04 14:02:09 -04:00
rustc_ty_utils rm ItemKind::OpaqueTy 2024-10-04 23:28:22 +00:00
rustc_type_ir Elaborate supertrait span correctly to label the error better 2024-10-04 17:15:28 -04:00
rustc_type_ir_macros Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
stable_mir clarify semantics of ConstantIndex MIR projection 2024-10-05 12:19:14 +02:00