about summary refs log tree commit diff
path: root/library/core/src
AgeCommit message (Collapse)AuthorLines
2023-04-03Add links to <cell.rs>Sergey Kaunov-1/+1
`UnsafeCell` page could benefit too from having links to these most popular structs in the module.
2023-04-02Rollup merge of #109839 - sartak:iter-grammar, r=scottmcmNilstrieb-2/+2
Improve grammar of Iterator.partition_in_place This is my first PR against Rust, please let me know if there's anything I should be providing here! I didn't find any instructions specific to documentation grammar in the [std-dev guide](https://std-dev-guide.rust-lang.org/documentation/summary.html).
2023-04-01Auto merge of #109483 - joboet:optimize_lazycell, r=Mark-Simulacrumbors-11/+77
Optimize `LazyCell` size `LazyCell` can only store either the initializing function or the data it produces, so it does not need to reserve the space for both. Similar to #107329, but uses an `enum` instead of a `union`.
2023-04-01Improve grammar of Iterator.partition_in_placeShawn M Moore-2/+2
b9535c0b7d6 Auto merge of #109801 - aliemjay:test-implied-normalization, r=petrochenkov
2023-03-31Rollup merge of #109443 - GuillaumeGomez:doc-primitive-hard-error, r=notriddleGuillaume Gomez-25/+50
Move `doc(primitive)` future incompat warning to `invalid_doc_attributes` Fixes #88070. It's been a while since this was turned into a "future incompatible lint" so I think we can now turn it into a hard error without problem. r? `@jyn514`
2023-03-31Auto merge of #98112 - saethlin:mir-alignment-checks, r=oli-obkbors-0/+14
Insert alignment checks for pointer dereferences when debug assertions are enabled Closes https://github.com/rust-lang/rust/issues/54915 - [x] Jake tells me this sounds like a place to use `MirPatch`, but I can't figure out how to insert a new basic block with a new terminator in the middle of an existing basic block, using `MirPatch`. (if nobody else backs up this point I'm checking this as "not actually a good idea" because the code looks pretty clean to me after rearranging it a bit) - [x] Using `CastKind::PointerExposeAddress` is definitely wrong, we don't want to expose. Calling a function to get the pointer address seems quite excessive. ~I'll see if I can add a new `CastKind`.~ `CastKind::Transmute` to the rescue! - [x] Implement a more helpful panic message like slice bounds checking. r? `@oli-obk`
2023-03-30Replace doc(primitive) with rustc_doc_primitiveGuillaume Gomez-25/+50
2023-03-30add comment to `impl !Error for &str`Lukas Markeffsky-0/+1
2023-03-30fix typo and adjust commentjoboet-2/+2
Co-authored-by: Ralf Jung <post@ralfj.de>
2023-03-30core: use `pointer::write` to cleanup `LazyCell` initializationjoboet-8/+7
2023-03-30core: improve code documentation for `LazyCell`joboet-5/+24
2023-03-30core: optimize `LazyCell` sizejoboet-11/+59
2023-03-30Auto merge of #109769 - JohnTitor:rollup-7n2bnpg, r=JohnTitorbors-10/+10
Rollup of 7 pull requests Successful merges: - #106985 (Enhanced doucmentation of binary search methods for `slice` and `VecDeque` for unsorted instances) - #109509 (compiletest: Don't allow tests with overlapping prefix names) - #109719 (RELEASES: Add "Only support Android NDK 25 or newer" to 1.68.0) - #109748 (Don't ICE on `DiscriminantKind` projection in new solver) - #109749 (Canonicalize float var as float in new solver) - #109761 (Drop binutils on powerpc-unknown-freebsd) - #109766 (Fix title for openharmony.md) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2023-03-30Rollup merge of #106985 - jofas:106746-fix, r=ChrisDentonYuki Okushi-10/+10
Enhanced doucmentation of binary search methods for `slice` and `VecDeque` for unsorted instances Fixes #106746. Issue #106746 raises the concern that the binary search methods for slices and deques aren't explicit enough about the fact that they are only applicable to sorted slices/deques. I changed the explanation for these methods. I took the relatively harsh description of the behaviour of binary search on unsorted collections ("unspecified and meaningless") from the description of the [`partition_point`](https://doc.rust-lang.org/std/primitive.slice.html#method.partition_point) method: > If this slice is not partitioned, the returned result is unspecified and meaningless, as this method performs a kind of binary search.
2023-03-30removed deprecated markdown links from documentationjofas-3/+0
2023-03-29Em dashes are cooler than hyphens.Mara Bos-1/+1
2023-03-29Documentation updates to better share the purpose of OnceCell/OnceLockTrevor Gross-27/+72
2023-03-29Stabilize a portion of 'once_cell'Trevor Gross-38/+30
Move items not part of this stabilization to 'lazy_cell' or 'once_cell_try'
2023-03-29enhanced documentation of binary search methods for slice and VecDeque for ↵jofas-7/+10
unsorted instances
2023-03-28Auto merge of #108095 - soc:drop-contains, r=Amanieubors-92/+0
Drop unstable `Option::contains`, `Result::contains`, `Result::contains_err` This is a proposal to drop the three functions `Option::contains`, `Result::contains` and `Result::contains_err`. The discovery of `Option::is_some_with`/`Result::is_ok_with`/`Result::is_err_with` in https://github.com/rust-lang/rust/pull/93051 obviates the need for these methods (non-stabilization tracked in https://github.com/rust-lang/rust/issues/62358). An additional benefit of change is that it avoids spurious error messages in IDEs, when `contains` is supplied by a third-party library: ![option-result-unstable](https://user-images.githubusercontent.com/42493/219127961-13cb559e-6ee8-4449-8dc9-d28d07270ad5.png)
2023-03-28Auto merge of #109692 - Nilstrieb:rollup-hq65rps, r=Nilstriebbors-173/+174
Rollup of 8 pull requests Successful merges: - #91793 (socket ancillary data implementation for FreeBSD (from 13 and above).) - #92284 (Change advance(_back)_by to return the remainder instead of the number of processed elements) - #102472 (stop special-casing `'static` in evaluation) - #108480 (Use Rayon's TLV directly) - #109321 (Erase impl regions when checking for impossible to eagerly monomorphize items) - #109470 (Correctly substitute GAT's type used in `normalize_param_env` in `check_type_bounds`) - #109562 (Update ar_archive_writer to 0.1.3) - #109629 (remove obsolete `givens` from regionck) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2023-03-28Auto merge of #108080 - oli-obk:FnPtr-trait, r=lcnrbors-106/+176
Add a builtin `FnPtr` trait that is implemented for all function pointers r? `@ghost` Rebased version of https://github.com/rust-lang/rust/pull/99531 (plus adjustments mentioned in the PR). If perf is happy with this version, I would like to land it, even if the diagnostics fix in 9df8e1befb5031a5bf9d8dfe25170620642d3c59 only works for `FnPtr` specifically, and does not generally improve blanket impls.
2023-03-28Rollup merge of #92284 - the8472:simplify-advance-by, r=scottmcmnils-173/+174
Change advance(_back)_by to return the remainder instead of the number of processed elements When advance_by can't advance the iterator by the number of requested elements it now returns the amount by which it couldn't be advanced instead of the amount by which it did. This simplifies adapters like chain, flatten or cycle because the remainder doesn't have to be calculated as the difference between requested steps and completed steps anymore. Additionally switching from `Result<(), usize>` to `Result<(), NonZeroUsize>` reduces the size of the result and makes converting from/to a usize representing the number of remaining steps cheap.
2023-03-28Rollup merge of #109682 - clubby789:c-str-inline, r=scottmcmMatthias Krüger-0/+5
Add `#[inline]` to CStr trait implementations Fixes #109674 I noticed other usages of traits on `CStr` weren't being inlined, so also added hints to the other implementations
2023-03-28Add `#[inline]` to CStr trait implementationsclubby789-0/+5
2023-03-27Fix ASCII case commentclubby789-1/+1
2023-03-27update documentationThe 8472-8/+10
2023-03-27replace advance_by returning usize with Result<(), NonZeroUsize>The 8472-119/+152
2023-03-27Use the FnPtr trait to avoid implementing common traits via macrosOli Scherer-107/+162
2023-03-27Add a builtin `FnPtr` traitlcnr-0/+15
2023-03-27Change advance(_back)_by to return `usize` instead of `Result<(), usize>`The 8472-188/+154
A successful advance is now signalled by returning `0` and other values now represent the remaining number of steps that couldn't be advanced as opposed to the amount of steps that have been advanced during a partial advance_by. This simplifies adapters a bit, replacing some `match`/`if` with arithmetic. Whether this is beneficial overall depends on whether `advance_by` is mostly used as a building-block for other iterator methods and adapters or whether we also see uses by users where `Result` might be more useful.
2023-03-27Rollup merge of #97506 - JohnTitor:stabilize-nonnull-slice-from-raw-parts, ↵Matthias Krüger-8/+5
r=m-ou-se,the8472 Stabilize `nonnull_slice_from_raw_parts` FCP is done: https://github.com/rust-lang/rust/issues/71941#issuecomment-1100910416 Note that this doesn't const-stabilize `NonNull::slice_from_raw_parts` as `slice_from_raw_parts_mut` isn't const-stabilized yet. Given #67456 and #57349, it's not likely available soon, meanwhile, stabilizing only the feature makes some sense, I think. Closes #71941
2023-03-26Auto merge of #109357 - saethlin:inline-as-deref, r=thomccbors-0/+4
Add #[inline] to as_deref While working on https://github.com/rust-lang/rust/pull/109247 I found an `as_deref` call in the compiler that should have been inlined. This fixes the missing inlining (but doesn't address the perf issues I was chasing). r? `@thomcc`
2023-03-26Rollup merge of #109620 - eievui5:patch-1, r=compiler-errorsMatthias Krüger-1/+1
Correct typo (`back_box` -> `black_box`)
2023-03-26Auto merge of #105096 - LegionMammal978:copied-allocators, r=Amanieubors-3/+3
Clarify that copied allocators must behave the same Currently, the safety documentation for `Allocator` says that a cloned or moved allocator must behave the same as the original. However, it does not specify that a copied allocator must behave the same, and it's possible to construct an allocator that permits being moved or cloned, but sometimes produces a new allocator when copied. <details> <summary>Contrived example which results in a Miri error</summary> ```rust #![feature(allocator_api, once_cell, strict_provenance)] use std::{ alloc::{AllocError, Allocator, Global, Layout}, collections::HashMap, hint, marker::PhantomPinned, num::NonZeroUsize, pin::Pin, ptr::{addr_of, NonNull}, sync::{LazyLock, Mutex}, }; mod source_allocator { use super::*; // `SourceAllocator` has 3 states: // - invalid value: is_cloned == false, source != self.addr() // - source value: is_cloned == false, source == self.addr() // - cloned value: is_cloned == true pub struct SourceAllocator { is_cloned: bool, source: usize, _pin: PhantomPinned, } impl SourceAllocator { // Returns a pinned source value (pointing to itself). pub fn new_source() -> Pin<Box<Self>> { let mut b = Box::new(Self { is_cloned: false, source: 0, _pin: PhantomPinned, }); b.source = b.addr(); Box::into_pin(b) } fn addr(&self) -> usize { addr_of!(*self).addr() } // Invalid values point to source 0. // Source values point to themselves. // Cloned values point to their corresponding source. fn source(&self) -> usize { if self.is_cloned || self.addr() == self.source { self.source } else { 0 } } } // Copying an invalid value produces an invalid value. // Copying a source value produces an invalid value. // Copying a cloned value produces a cloned value with the same source. impl Copy for SourceAllocator {} // Cloning an invalid value produces an invalid value. // Cloning a source value produces a cloned value with that source. // Cloning a cloned value produces a cloned value with the same source. impl Clone for SourceAllocator { fn clone(&self) -> Self { if self.is_cloned || self.addr() != self.source { *self } else { Self { is_cloned: true, source: self.source, _pin: PhantomPinned, } } } } static SOURCE_MAP: LazyLock<Mutex<HashMap<NonZeroUsize, usize>>> = LazyLock::new(Default::default); // SAFETY: Wraps `Global`'s methods with additional tracking. // All invalid values share blocks with each other. // Each source value shares blocks with all cloned values pointing to it. // Cloning an allocator always produces a compatible allocator: // - Cloning an invalid value produces another invalid value. // - Cloning a source value produces a cloned value pointing to it. // - Cloning a cloned value produces another cloned value with the same source. // Moving an allocator always produces a compatible allocator: // - Invalid values remain invalid when moved. // - Source values cannot be moved, since they are always pinned to the heap. // - Cloned values keep the same source when moved. unsafe impl Allocator for SourceAllocator { fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> { let mut map = SOURCE_MAP.lock().unwrap(); let block = Global.allocate(layout)?; let block_addr = block.cast::<u8>().addr(); map.insert(block_addr, self.source()); Ok(block) } unsafe fn deallocate(&self, block: NonNull<u8>, layout: Layout) { let mut map = SOURCE_MAP.lock().unwrap(); let block_addr = block.addr(); // SAFETY: `block` came from an allocator that shares blocks with this allocator. if map.remove(&block_addr) != Some(self.source()) { hint::unreachable_unchecked() } Global.deallocate(block, layout) } } } use source_allocator::SourceAllocator; // SAFETY: `alloc1` and `alloc2` must share blocks. unsafe fn test_same(alloc1: &SourceAllocator, alloc2: &SourceAllocator) { let ptr = alloc1.allocate(Layout::new::<i32>()).unwrap(); alloc2.deallocate(ptr.cast(), Layout::new::<i32>()); } fn main() { let orig = &*SourceAllocator::new_source(); let orig_cloned1 = &orig.clone(); let orig_cloned2 = &orig.clone(); let copied = &{ *orig }; let copied_cloned1 = &copied.clone(); let copied_cloned2 = &copied.clone(); unsafe { test_same(orig, orig_cloned1); test_same(orig_cloned1, orig_cloned2); test_same(copied, copied_cloned1); test_same(copied_cloned1, copied_cloned2); test_same(orig, copied); // error } } ``` </details> This could result in issues in the future for algorithms that specialize on `Copy` types. Right now, nothing in the standard library that depends on `Allocator + Clone` is susceptible to this issue, but I still think it would make sense to specify that copying an allocator is always as valid as cloning it.
2023-03-25Correct typo (`back_box` -> `black_box`)Evie M-1/+1
2023-03-25Auto merge of #99929 - the8472:default-iters, r=scottmcmbors-0/+125
Implement Default for some alloc/core iterators Add `Default` impls to the following collection iterators: * slice::{Iter, IterMut} * binary_heap::IntoIter * btree::map::{Iter, IterMut, Keys, Values, Range, IntoIter, IntoKeys, IntoValues} * btree::set::{Iter, IntoIter, Range} * linked_list::IntoIter * vec::IntoIter and these adapters: * adapters::{Chain, Cloned, Copied, Rev, Enumerate, Flatten, Fuse, Rev} For iterators which are generic over allocators it only implements it for the global allocator because we can't conjure an allocator from nothing or would have to turn the allocator field into an `Option` just for this change. These changes will be insta-stable. ACP: https://github.com/rust-lang/libs-team/issues/77
2023-03-25Auto merge of #109546 - saethlin:inline-into, r=scottmcmbors-0/+1
Add #[inline] to the Into for From impl I was skimming through the standard library MIR and I noticed a handful of very suspicious `Into::into` calls in `alloc`. ~Since this is a trivial wrapper function, `#[inline(always)]` seems appropriate.;~ `#[inline]` works too and is a lot less spooky. r? `@thomcc`
2023-03-24Add #[inline] to the Into for From implBen Kimock-0/+1
2023-03-24Auto merge of #109216 - martingms:unicode-case-lut-shrink, r=Mark-Simulacrumbors-1794/+783
Shrink unicode case-mapping LUTs by 24k I was looking into the binary bloat of a small program using `str::to_lowercase` and `str::to_uppercase`, and noticed that the lookup tables used for case mapping had a lot of zero-bytes in them. The reason for this is that since some characters map to up to three other characters when lower or uppercased, the LUTs store a `[char; 3]` for each character. However, the vast majority of cases only map to a single new character, in other words most of the entries are e.g. `(lowerc, [upperc, '\0', '\0'])`. This PR introduces a new encoding scheme for these tables. The changes reduces the size of my test binary by about 24K. I've also done some `#[bench]`marks on unicode-heavy test data, and found that the performance of both `str::to_lowercase` and `str::to_uppercase` improves by up to 20%. These measurements are obviously very dependent on the character distribution of the data. Someone else will have to decide whether this more complex scheme is worth it or not, I was just goofing around a bit and here's what came out of it :man_shrugging: No hard feelings if this isn't wanted!
2023-03-24Rollup merge of #108924 - tmiasko:panic-immediate-abort, r=thomccMatthias Krüger-0/+3
panic_immediate_abort requires abort as a panic strategy Guide `panic_immediate_abort` users away from `-Cpanic=unwind` and towards `-Cpanic=abort` to avoid an accidental use of the feature with the unwind strategy, e.g., on a targets where unwind is the default. The `-Cpanic=unwind` combination doesn't offer the same benefits, since the code would still be generated under the assumption that functions implemented in Rust can unwind.
2023-03-23A MIR transform that checks pointers are alignedBen Kimock-0/+14
2023-03-23Auto merge of #108442 - scottmcm:mir-transmute, r=oli-obkbors-0/+8
Add `CastKind::Transmute` to MIR ~~Nothing actually produces it in this commit, so I don't know how to test it, but it also means it shouldn't be possible for it to break anything.~~ Includes lowering `transmute` calls to it, so it's used. Zulip Conversation: <https://rust-lang.zulipchat.com/#narrow/stream/189540-t-compiler.2Fwg-mir-opt/topic/Good.20first.20isssue/near/321849610>
2023-03-23Auto merge of #109503 - matthiaskrgr:rollup-cnp7kdd, r=matthiaskrgrbors-0/+1
Rollup of 9 pull requests Successful merges: - #108954 (rustdoc: handle generics better when matching notable traits) - #109203 (refactor/feat: refactor identifier parsing a bit) - #109213 (Eagerly intern and check CrateNum/StableCrateId collisions) - #109358 (rustc: Remove unused `Session` argument from some attribute functions) - #109359 (Update stdarch) - #109378 (Remove Ty::is_region_ptr) - #109423 (Use region-erased self type during IAT selection) - #109447 (new solver cleanup + implement coherence) - #109501 (make link clickable) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2023-03-22Add `CastKind::Transmute` to MIRScott McMurray-0/+8
Updates `interpret`, `codegen_ssa`, and `codegen_cranelift` to consume the new cast instead of the intrinsic. Includes `CastTransmute` for custom MIR building, to be able to test the extra UB.
2023-03-22Rollup merge of #109359 - Nilstrieb:bump-stdarch, r=AmanieuMatthias Krüger-0/+1
Update stdarch Bring the the `#![allow(internal_features)]` for #108955 r? `@Amanieu`
2023-03-22Auto merge of #109497 - matthiaskrgr:rollup-6txuxm0, r=matthiaskrgrbors-1/+16
Rollup of 10 pull requests Successful merges: - #109373 (Set LLVM `LLVM_UNREACHABLE_OPTIMIZE` to `OFF`) - #109392 (Custom MIR: Allow optional RET type annotation) - #109394 (adapt tests/codegen/vec-shrink-panik for LLVM 17) - #109412 (rustdoc: Add GUI test for "Auto-hide item contents for large items" setting) - #109452 (Ignore the vendor directory for tidy tests.) - #109457 (Remove comment about reusing rib allocations) - #109461 (rustdoc: remove redundant `.content` prefix from span/a colors) - #109477 (`HirId` to `LocalDefId` cleanup) - #109489 (More general captures) - #109494 (Do not feed param_env for RPITITs impl side) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2023-03-22Rollup merge of #109392 - cbeuw:composite-ret, r=JakobDegenMatthias Krüger-1/+16
Custom MIR: Allow optional RET type annotation This currently doesn't compile because the type of `RET` is inferred, which fails if RET is a composite type and fields are initialised separately. ```rust #![feature(custom_mir, core_intrinsics)] extern crate core; use core::intrinsics::mir::*; #[custom_mir(dialect = "runtime", phase = "optimized")] fn fn0() -> (i32, bool) { mir! ({ RET.0 = 0; RET.1 = true; Return() }) } ``` ``` error[E0282]: type annotations needed --> src/lib.rs:8:9 | 8 | RET.0 = 0; | ^^^ cannot infer type For more information about this error, try `rustc --explain E0282`. ``` This PR allows the user to manually specify the return type with `type RET = ...;` if required: ```rust #[custom_mir(dialect = "runtime", phase = "optimized")] fn fn0() -> (i32, bool) { mir! ( type RET = (i32, bool); { RET.0 = 0; RET.1 = true; Return() } ) } ``` The syntax is not optimal, I'm happy to see other suggestions. Ideally I wanted it to be a normal type annotation like `let RET: ...;`, but this runs into the multiple parsing options error during macro expansion, as it can be parsed as a normal `let` declaration as well. r? ```@oli-obk``` or ```@tmiasko``` or ```@JakobDegen```
2023-03-23Rollup merge of #109179 - llogiq:intrinsically-option-as-slice, r=eholkDylan DPC-72/+42
move Option::as_slice to intrinsic ````@scottmcm```` suggested on #109095 I use a direct approach of unpacking the operation in MIR lowering, so here's the implementation. cc ````@nikic```` as this should hopefully unblock #107224 (though perhaps other changes to the prior implementation, which I left for bootstrapping, are needed).
2023-03-23Rollup merge of #100311 - xfix:lines-fix-handling-of-bare-cr, r=ChrisDentonDylan DPC-7/+7
Fix handling of trailing bare CR in str::lines Continuing from #91191. Fixes #94435.