rust/library/coretests/tests
Matthias Krüger 59a645ac25
Rollup merge of #145174 - 197g:issue-145148-select-unpredictable-drop, r=joboet
Ensure consistent drop for panicking drop in hint::select_unpredictable

There are a few alternatives to the implementation. The principal problem is that the selected value must be owned (in the sense of having a drop flag of sorts) when the unselected value is dropped, such that panic unwind goes through the drop of both. This ownership must then be passed on in return when the drop went smoothly.

The basic way of achieving this is by extracting the selected value first, at the cost of relying on the optimizer a little more for detecting the copy as constructing the return value despite having a place in the body. Unfortunately, that causes LLVM to discard the !unpredictable annotation (for some reason that is beyond my comprehension of LLVM).

<details>
<summary>Extract from the build log showing an unannotated select being used</summary>

```
2025-08-09T16:51:06.8790764Z            39: define noundef i64 `@test_int2(i1` noundef zeroext %p, i64 noundef %a, i64 noundef %b) unnamed_addr #0 personality ptr `@rust_eh_personality` {
2025-08-09T16:51:06.8791368Z check:47'0                                  X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
2025-08-09T16:51:06.8791700Z            40: start:
2025-08-09T16:51:06.8791858Z check:47'0     ~~~~~~~
2025-08-09T16:51:06.8792043Z            41:  %ret.i = select i1 %p, i64 %a, i64 %b
2025-08-09T16:51:06.8792293Z check:47'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2025-08-09T16:51:06.8792686Z check:47'1               ?                             possible intended match
2025-08-09T16:51:06.8792946Z            42:  ret i64 %ret.i
2025-08-09T16:51:06.8793127Z check:47'0     ~~~~~~~~~~~~~~~~
```

</details>

So instead, this PR includes a guard to drop the selected `MaybeUnit<T>` which is active only for the section where the unselected value is dropped. That leaves the code for selecting the result intact leading to the expected ir. That complicates the 'unselection' process a little bit since we require _both_ values as a result of that intrinsic call. Since the arguments alias, this portion as well as the drop guard uses raw pointers.

Closes: rust-lang/rust#145148
Prior: rust-lang/rust#139977
2025-08-31 13:40:35 +02:00
..
async_iter Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
ffi Delegate <CStr as Debug> to ByteStr 2025-06-12 12:53:14 -04:00
floats Hoist zero and one out into TestableFloat 2025-08-07 22:51:46 -04:00
fmt Add test for new format_args!() temporary lifetimes. 2025-06-18 10:20:20 +02:00
hash library: Use size_of from the prelude instead of imported 2025-03-06 20:20:38 -08:00
io Rollup merge of #142741 - a1phyr:fix_unsoundness, r=Mark-Simulacrum 2025-08-14 11:39:33 +02:00
iter implement Sum and Product for Saturating(u*) 2025-08-28 18:38:53 -04:00
net Recognise new IPv6 non-global range from RFC9602 2025-03-21 17:53:29 +11:00
num Implement feature int_lowest_highest_one for integer and NonZero types 2025-08-18 18:59:44 +09:00
ops moved simple test to coretests, introduced more fleshed out doctests for break_ok/continue_ok 2025-04-26 12:57:12 +02:00
panic updated line number in test 2025-08-02 17:34:59 -04:00
alloc.rs library: Use size_of from the prelude instead of imported 2025-03-06 20:20:38 -08:00
any.rs Add opaque TypeId handles for CTFE 2025-07-09 16:37:11 +00:00
array.rs Add #[must_use] to Array::map 2025-05-13 12:34:53 +09:00
ascii.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
ascii_char.rs Implement Extend<AsciiChar> for String 2025-02-08 16:51:04 -05:00
asserting.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
atomic.rs atomic tests: remove static mut 2025-06-19 12:08:24 +00:00
bool.rs Add methods for converting bool to Result<(), E> 2025-06-19 23:20:06 +02:00
bstr.rs Actually run the bstr test 2025-01-26 10:45:09 +00:00
cell.rs make RefCell unstably const 2025-06-25 17:06:49 -07:00
char.rs Clean up some resolved test regressions of const trait removals in std 2025-08-08 00:58:54 +09:00
clone.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
cmp.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
const_ptr.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
convert.rs Clean up some resolved test regressions of const trait removals in std 2025-08-08 00:58:54 +09:00
error.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
ffi.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
future.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
hint.rs Clarify panic-drop test for select_unpredictable 2025-08-30 13:01:32 +02:00
intrinsics.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
lazy.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
lib.rs Rollup merge of #145969 - actuallylost:duration-from-nanos-128, r=tgross35 2025-08-30 20:29:08 +10:00
macros.rs Add regression test for matches! + non_exhaustive_omitted_patterns lint 2025-07-23 14:35:44 +02:00
manually_drop.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
mem.rs Add core::mem::DropGuard 2025-07-28 12:12:40 +02:00
nonzero.rs Implement feature int_lowest_highest_one for integer and NonZero types 2025-08-18 18:59:44 +09:00
ops.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
option.rs Clean up some resolved test regressions of const trait removals in std 2025-08-08 00:58:54 +09:00
panic.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
pattern.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
pin.rs Put pin!() tests in the right file. 2025-03-28 10:18:04 +01:00
pin_macro.rs update cfg(bootstrap) 2025-05-12 15:33:37 +02:00
ptr.rs const-eval: full support for pointer fragments 2025-07-30 08:13:58 +02:00
result.rs Constify additional Result functions 2025-08-01 08:55:50 +03:00
simd.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
slice.rs Consolidate panicking functions in slice/index.rs 2025-08-21 11:07:25 +01:00
str.rs tidy: Fix paths to coretests and alloctests 2025-04-05 12:15:49 -07:00
str_lossy.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
task.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
time.rs Add Duration::from_nanos_u128 2025-08-30 01:38:14 +03:00
tuple.rs Remove unnecessary parentheses in assert!s 2025-08-10 21:59:04 +00:00
unicode.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
waker.rs Put all coretests in a separate crate 2025-01-26 10:26:36 +00:00
wtf8.rs Move WTF-8 code from std to core/alloc 2025-08-20 20:31:33 -04:00