Auto merge of #75145 - davidtwco:issue-60607-preallocate-defid-for-lang-items, r=petrochenkov
Reference lang items during AST lowering Fixes #60607 and fixes #61019. This PR introduces `QPath::LangItem` to the HIR and uses it in AST lowering instead of constructing a `hir::Path` from a slice of symbols: - Credit for much of this work goes to @matthewjasper, I basically just [rebased their earlier work](a227c706b7 (diff-c0f791ead38d2d02916faaad0f56f41d)
). - ~~Changes to Clippy might not be correct, they compile but attempting to run tests through `./x.py` produced failures which appeared spurious, so I didn't run any clippy tests.~~ - Changes to save analysis might not be correct - tests pass but I don't have a lot of confidence in those changes being correct. - I've used `GenericBounds::LangItemTrait` rather than changing `PolyTraitRef`, as suggested by @matthewjasper [in this comment](a227c706b7 (r40107992)
) but I'd prefer that be left for a follow-up. - I've split things into smaller commits fairly arbitrarily to make the diff easier to review, each commit should compile but might not pass tests until the final commit. r? @oli-obk cc @matthewjasper
This commit is contained in:
commit
792c645ca7
61 changed files with 588 additions and 458 deletions
|
@ -385,6 +385,7 @@ pub trait Into<T>: Sized {
|
|||
))]
|
||||
pub trait From<T>: Sized {
|
||||
/// Performs the conversion.
|
||||
#[cfg_attr(not(bootstrap), lang = "from")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
fn from(_: T) -> Self;
|
||||
}
|
||||
|
|
|
@ -96,6 +96,7 @@ pub trait Future {
|
|||
/// [`Context`]: ../task/struct.Context.html
|
||||
/// [`Waker`]: ../task/struct.Waker.html
|
||||
/// [`Waker::wake`]: ../task/struct.Waker.html#method.wake
|
||||
#[cfg_attr(not(bootstrap), lang = "poll")]
|
||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
|
||||
}
|
||||
|
|
|
@ -53,6 +53,7 @@ unsafe impl Sync for ResumeTy {}
|
|||
/// This function returns a `GenFuture` underneath, but hides it in `impl Trait` to give
|
||||
/// better error messages (`impl Future` rather than `GenFuture<[closure.....]>`).
|
||||
// This is `const` to avoid extra errors after we recover from `const async fn`
|
||||
#[cfg_attr(not(bootstrap), lang = "from_generator")]
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "gen_future", issue = "50547")]
|
||||
#[inline]
|
||||
|
@ -85,6 +86,7 @@ where
|
|||
GenFuture(gen)
|
||||
}
|
||||
|
||||
#[cfg_attr(not(bootstrap), lang = "get_context")]
|
||||
#[doc(hidden)]
|
||||
#[unstable(feature = "gen_future", issue = "50547")]
|
||||
#[inline]
|
||||
|
|
|
@ -235,6 +235,7 @@ pub trait IntoIterator {
|
|||
/// assert_eq!(Some(3), iter.next());
|
||||
/// assert_eq!(None, iter.next());
|
||||
/// ```
|
||||
#[cfg_attr(not(bootstrap), lang = "into_iter")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
fn into_iter(self) -> Self::IntoIter;
|
||||
}
|
||||
|
|
|
@ -129,6 +129,7 @@ pub trait Iterator {
|
|||
/// assert_eq!(None, iter.next());
|
||||
/// assert_eq!(None, iter.next());
|
||||
/// ```
|
||||
#[cfg_attr(not(bootstrap), lang = "next")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
fn next(&mut self) -> Option<Self::Item>;
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ use crate::hash::Hash;
|
|||
/// [`IntoIterator`]: ../iter/trait.Iterator.html
|
||||
/// [`Iterator`]: ../iter/trait.IntoIterator.html
|
||||
/// [slicing index]: ../slice/trait.SliceIndex.html
|
||||
#[cfg_attr(not(bootstrap), lang = "RangeFull")]
|
||||
#[doc(alias = "..")]
|
||||
#[derive(Copy, Clone, Default, PartialEq, Eq, Hash)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -70,6 +71,7 @@ impl fmt::Debug for RangeFull {
|
|||
/// assert_eq!(arr[1.. 3], [ 1,2 ]); // Range
|
||||
/// assert_eq!(arr[1..=3], [ 1,2,3 ]);
|
||||
/// ```
|
||||
#[cfg_attr(not(bootstrap), lang = "Range")]
|
||||
#[doc(alias = "..")]
|
||||
#[derive(Clone, Default, PartialEq, Eq, Hash)] // not Copy -- see #27186
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -178,6 +180,7 @@ impl<Idx: PartialOrd<Idx>> Range<Idx> {
|
|||
/// ```
|
||||
///
|
||||
/// [`Iterator`]: ../iter/trait.IntoIterator.html
|
||||
#[cfg_attr(not(bootstrap), lang = "RangeFrom")]
|
||||
#[doc(alias = "..")]
|
||||
#[derive(Clone, PartialEq, Eq, Hash)] // not Copy -- see #27186
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -260,6 +263,7 @@ impl<Idx: PartialOrd<Idx>> RangeFrom<Idx> {
|
|||
/// [`IntoIterator`]: ../iter/trait.Iterator.html
|
||||
/// [`Iterator`]: ../iter/trait.IntoIterator.html
|
||||
/// [slicing index]: ../slice/trait.SliceIndex.html
|
||||
#[cfg_attr(not(bootstrap), lang = "RangeTo")]
|
||||
#[doc(alias = "..")]
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -328,6 +332,7 @@ impl<Idx: PartialOrd<Idx>> RangeTo<Idx> {
|
|||
/// assert_eq!(arr[1.. 3], [ 1,2 ]);
|
||||
/// assert_eq!(arr[1..=3], [ 1,2,3 ]); // RangeInclusive
|
||||
/// ```
|
||||
#[cfg_attr(not(bootstrap), lang = "RangeInclusive")]
|
||||
#[doc(alias = "..=")]
|
||||
#[derive(Clone, PartialEq, Eq, Hash)] // not Copy -- see #27186
|
||||
#[stable(feature = "inclusive_range", since = "1.26.0")]
|
||||
|
@ -359,6 +364,7 @@ impl<Idx> RangeInclusive<Idx> {
|
|||
///
|
||||
/// assert_eq!(3..=5, RangeInclusive::new(3, 5));
|
||||
/// ```
|
||||
#[cfg_attr(not(bootstrap), lang = "range_inclusive_new")]
|
||||
#[stable(feature = "inclusive_range_methods", since = "1.27.0")]
|
||||
#[inline]
|
||||
#[rustc_promotable]
|
||||
|
@ -555,6 +561,7 @@ impl<Idx: PartialOrd<Idx>> RangeInclusive<Idx> {
|
|||
/// [`IntoIterator`]: ../iter/trait.Iterator.html
|
||||
/// [`Iterator`]: ../iter/trait.IntoIterator.html
|
||||
/// [slicing index]: ../slice/trait.SliceIndex.html
|
||||
#[cfg_attr(not(bootstrap), lang = "RangeToInclusive")]
|
||||
#[doc(alias = "..=")]
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
|
||||
#[stable(feature = "inclusive_range", since = "1.26.0")]
|
||||
|
|
|
@ -43,16 +43,19 @@ pub trait Try {
|
|||
/// in the return type of the enclosing scope (which must itself implement
|
||||
/// `Try`). Specifically, the value `X::from_error(From::from(e))`
|
||||
/// is returned, where `X` is the return type of the enclosing function.
|
||||
#[cfg_attr(not(bootstrap), lang = "into_result")]
|
||||
#[unstable(feature = "try_trait", issue = "42327")]
|
||||
fn into_result(self) -> Result<Self::Ok, Self::Error>;
|
||||
|
||||
/// Wrap an error value to construct the composite result. For example,
|
||||
/// `Result::Err(x)` and `Result::from_error(x)` are equivalent.
|
||||
#[cfg_attr(not(bootstrap), lang = "from_error")]
|
||||
#[unstable(feature = "try_trait", issue = "42327")]
|
||||
fn from_error(v: Self::Error) -> Self;
|
||||
|
||||
/// Wrap an OK value to construct the composite result. For example,
|
||||
/// `Result::Ok(x)` and `Result::from_ok(x)` are equivalent.
|
||||
#[cfg_attr(not(bootstrap), lang = "from_ok")]
|
||||
#[unstable(feature = "try_trait", issue = "42327")]
|
||||
fn from_ok(v: Self::Ok) -> Self;
|
||||
}
|
||||
|
|
|
@ -144,9 +144,11 @@ use crate::{
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub enum Option<T> {
|
||||
/// No value
|
||||
#[cfg_attr(not(bootstrap), lang = "None")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
None,
|
||||
/// Some value `T`
|
||||
#[cfg_attr(not(bootstrap), lang = "Some")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
|
||||
}
|
||||
|
|
|
@ -569,6 +569,7 @@ impl<P: Deref> Pin<P> {
|
|||
/// ```
|
||||
///
|
||||
/// [`mem::swap`]: ../../std/mem/fn.swap.html
|
||||
#[cfg_attr(not(bootstrap), lang = "new_unchecked")]
|
||||
#[stable(feature = "pin", since = "1.33.0")]
|
||||
#[inline(always)]
|
||||
pub unsafe fn new_unchecked(pointer: P) -> Pin<P> {
|
||||
|
|
|
@ -246,10 +246,12 @@ use crate::{convert, fmt};
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub enum Result<T, E> {
|
||||
/// Contains the success value
|
||||
#[cfg_attr(not(bootstrap), lang = "Ok")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
|
||||
|
||||
/// Contains the error value
|
||||
#[cfg_attr(not(bootstrap), lang = "Err")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
Err(#[stable(feature = "rust1", since = "1.0.0")] E),
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ use crate::result::Result;
|
|||
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||
pub enum Poll<T> {
|
||||
/// Represents that a value is immediately ready.
|
||||
#[cfg_attr(not(bootstrap), lang = "Ready")]
|
||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||
Ready(#[stable(feature = "futures_api", since = "1.36.0")] T),
|
||||
|
||||
|
@ -18,6 +19,7 @@ pub enum Poll<T> {
|
|||
/// When a function returns `Pending`, the function *must* also
|
||||
/// ensure that the current task is scheduled to be awoken when
|
||||
/// progress can be made.
|
||||
#[cfg_attr(not(bootstrap), lang = "Pending")]
|
||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||
Pending,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue