summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_hir/src
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_hir/src
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_hir/src')
-rw-r--r--compiler/rustc_hir/src/def.rs14
-rw-r--r--compiler/rustc_hir/src/hir.rs118
-rw-r--r--compiler/rustc_hir/src/intravisit.rs2
-rw-r--r--compiler/rustc_hir/src/lang_items.rs6
-rw-r--r--compiler/rustc_hir/src/tests.rs4
5 files changed, 82 insertions, 62 deletions
diff --git a/compiler/rustc_hir/src/def.rs b/compiler/rustc_hir/src/def.rs
index 3a4eb90f7..ed1dc751f 100644
--- a/compiler/rustc_hir/src/def.rs
+++ b/compiler/rustc_hir/src/def.rs
@@ -118,7 +118,7 @@ pub enum DefKind {
of_trait: bool,
},
Closure,
- Generator,
+ Coroutine,
}
impl DefKind {
@@ -126,7 +126,7 @@ impl DefKind {
///
/// If you have access to `TyCtxt`, use `TyCtxt::def_descr` or
/// `TyCtxt::def_kind_descr` instead, because they give better
- /// information for generators and associated functions.
+ /// information for coroutines and associated functions.
pub fn descr(self, def_id: DefId) -> &'static str {
match self {
DefKind::Fn => "function",
@@ -161,7 +161,7 @@ impl DefKind {
DefKind::Field => "field",
DefKind::Impl { .. } => "implementation",
DefKind::Closure => "closure",
- DefKind::Generator => "generator",
+ DefKind::Coroutine => "coroutine",
DefKind::ExternCrate => "extern crate",
DefKind::GlobalAsm => "global assembly block",
}
@@ -171,7 +171,7 @@ impl DefKind {
///
/// If you have access to `TyCtxt`, use `TyCtxt::def_descr_article` or
/// `TyCtxt::def_kind_descr_article` instead, because they give better
- /// information for generators and associated functions.
+ /// information for coroutines and associated functions.
pub fn article(&self) -> &'static str {
match *self {
DefKind::AssocTy
@@ -220,7 +220,7 @@ impl DefKind {
| DefKind::LifetimeParam
| DefKind::ExternCrate
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::Use
| DefKind::ForeignMod
| DefKind::GlobalAsm
@@ -230,7 +230,7 @@ impl DefKind {
#[inline]
pub fn is_fn_like(self) -> bool {
- matches!(self, DefKind::Fn | DefKind::AssocFn | DefKind::Closure | DefKind::Generator)
+ matches!(self, DefKind::Fn | DefKind::AssocFn | DefKind::Closure | DefKind::Coroutine)
}
/// Whether `query get_codegen_attrs` should be used with this definition.
@@ -240,7 +240,7 @@ impl DefKind {
| DefKind::AssocFn
| DefKind::Ctor(..)
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::Static(_) => true,
DefKind::Mod
| DefKind::Struct
diff --git a/compiler/rustc_hir/src/hir.rs b/compiler/rustc_hir/src/hir.rs
index 3eec66611..c4e44a6a4 100644
--- a/compiler/rustc_hir/src/hir.rs
+++ b/compiler/rustc_hir/src/hir.rs
@@ -246,6 +246,8 @@ impl<'hir> PathSegment<'hir> {
pub struct ConstArg {
pub value: AnonConst,
pub span: Span,
+ /// Indicates whether this comes from a `~const` desugaring.
+ pub is_desugared_from_effects: bool,
}
#[derive(Clone, Copy, Debug, HashStable_Generic)]
@@ -400,7 +402,14 @@ impl<'hir> GenericArgs<'hir> {
/// This function returns the number of type and const generic params.
/// It should only be used for diagnostics.
pub fn num_generic_params(&self) -> usize {
- self.args.iter().filter(|arg| !matches!(arg, GenericArg::Lifetime(_))).count()
+ self.args
+ .iter()
+ .filter(|arg| match arg {
+ GenericArg::Lifetime(_)
+ | GenericArg::Const(ConstArg { is_desugared_from_effects: true, .. }) => false,
+ _ => true,
+ })
+ .count()
}
/// The span encompassing the text inside the surrounding brackets.
@@ -1485,7 +1494,7 @@ pub struct BodyId {
///
/// - an `params` array containing the `(x, y)` pattern
/// - a `value` containing the `x + y` expression (maybe wrapped in a block)
-/// - `generator_kind` would be `None`
+/// - `coroutine_kind` would be `None`
///
/// All bodies have an **owner**, which can be accessed via the HIR
/// map using `body_owner_def_id()`.
@@ -1493,7 +1502,7 @@ pub struct BodyId {
pub struct Body<'hir> {
pub params: &'hir [Param<'hir>],
pub value: &'hir Expr<'hir>,
- pub generator_kind: Option<GeneratorKind>,
+ pub coroutine_kind: Option<CoroutineKind>,
}
impl<'hir> Body<'hir> {
@@ -1501,75 +1510,75 @@ impl<'hir> Body<'hir> {
BodyId { hir_id: self.value.hir_id }
}
- pub fn generator_kind(&self) -> Option<GeneratorKind> {
- self.generator_kind
+ pub fn coroutine_kind(&self) -> Option<CoroutineKind> {
+ self.coroutine_kind
}
}
-/// The type of source expression that caused this generator to be created.
+/// The type of source expression that caused this coroutine to be created.
#[derive(Clone, PartialEq, Eq, Debug, Copy, Hash)]
#[derive(HashStable_Generic, Encodable, Decodable)]
-pub enum GeneratorKind {
+pub enum CoroutineKind {
/// An explicit `async` block or the body of an async function.
- Async(AsyncGeneratorKind),
+ Async(CoroutineSource),
- /// A generator literal created via a `yield` inside a closure.
- Gen,
-}
+ /// An explicit `gen` block or the body of a `gen` function.
+ Gen(CoroutineSource),
-impl fmt::Display for GeneratorKind {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- match self {
- GeneratorKind::Async(k) => fmt::Display::fmt(k, f),
- GeneratorKind::Gen => f.write_str("generator"),
- }
- }
+ /// A coroutine literal created via a `yield` inside a closure.
+ Coroutine,
}
-impl GeneratorKind {
- pub fn descr(&self) -> &'static str {
+impl fmt::Display for CoroutineKind {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
- GeneratorKind::Async(ask) => ask.descr(),
- GeneratorKind::Gen => "generator",
+ CoroutineKind::Async(k) => {
+ if f.alternate() {
+ f.write_str("`async` ")?;
+ } else {
+ f.write_str("async ")?
+ }
+ k.fmt(f)
+ }
+ CoroutineKind::Coroutine => f.write_str("coroutine"),
+ CoroutineKind::Gen(k) => {
+ if f.alternate() {
+ f.write_str("`gen` ")?;
+ } else {
+ f.write_str("gen ")?
+ }
+ k.fmt(f)
+ }
}
}
}
-/// In the case of a generator created as part of an async construct,
-/// which kind of async construct caused it to be created?
+/// In the case of a coroutine created as part of an async/gen construct,
+/// which kind of async/gen construct caused it to be created?
///
/// This helps error messages but is also used to drive coercions in
/// type-checking (see #60424).
#[derive(Clone, PartialEq, Eq, Hash, Debug, Copy)]
#[derive(HashStable_Generic, Encodable, Decodable)]
-pub enum AsyncGeneratorKind {
- /// An explicit `async` block written by the user.
+pub enum CoroutineSource {
+ /// An explicit `async`/`gen` block written by the user.
Block,
- /// An explicit `async` closure written by the user.
+ /// An explicit `async`/`gen` closure written by the user.
Closure,
- /// The `async` block generated as the body of an async function.
+ /// The `async`/`gen` block generated as the body of an async/gen function.
Fn,
}
-impl fmt::Display for AsyncGeneratorKind {
+impl fmt::Display for CoroutineSource {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.write_str(match self {
- AsyncGeneratorKind::Block => "async block",
- AsyncGeneratorKind::Closure => "async closure body",
- AsyncGeneratorKind::Fn => "async fn body",
- })
- }
-}
-
-impl AsyncGeneratorKind {
- pub fn descr(&self) -> &'static str {
match self {
- AsyncGeneratorKind::Block => "`async` block",
- AsyncGeneratorKind::Closure => "`async` closure body",
- AsyncGeneratorKind::Fn => "`async fn` body",
+ CoroutineSource::Block => "block",
+ CoroutineSource::Closure => "closure body",
+ CoroutineSource::Fn => "fn body",
}
+ .fmt(f)
}
}
@@ -2004,7 +2013,7 @@ pub enum ExprKind<'hir> {
///
/// The `Span` is the argument block `|...|`.
///
- /// This may also be a generator literal or an `async block` as indicated by the
+ /// This may also be a coroutine literal or an `async block` as indicated by the
/// `Option<Movability>`.
Closure(&'hir Closure<'hir>),
/// A block (e.g., `'label: { ... }`).
@@ -2055,7 +2064,7 @@ pub enum ExprKind<'hir> {
/// to be repeated; the second is the number of times to repeat it.
Repeat(&'hir Expr<'hir>, ArrayLen),
- /// A suspension point for generators (i.e., `yield <expr>`).
+ /// A suspension point for coroutines (i.e., `yield <expr>`).
Yield(&'hir Expr<'hir>, YieldSource),
/// A placeholder for an expression that wasn't syntactically well formed in some way.
@@ -2247,12 +2256,13 @@ impl fmt::Display for YieldSource {
}
}
-impl From<GeneratorKind> for YieldSource {
- fn from(kind: GeneratorKind) -> Self {
+impl From<CoroutineKind> for YieldSource {
+ fn from(kind: CoroutineKind) -> Self {
match kind {
- // Guess based on the kind of the current generator.
- GeneratorKind::Gen => Self::Yield,
- GeneratorKind::Async(_) => Self::Await { expr: None },
+ // Guess based on the kind of the current coroutine.
+ CoroutineKind::Coroutine => Self::Yield,
+ CoroutineKind::Async(_) => Self::Await { expr: None },
+ CoroutineKind::Gen(_) => Self::Yield,
}
}
}
@@ -3556,6 +3566,15 @@ impl<'hir> OwnerNode<'hir> {
}
}
+ pub fn fn_sig(self) -> Option<&'hir FnSig<'hir>> {
+ match self {
+ OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
+ | OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
+ | OwnerNode::Item(Item { kind: ItemKind::Fn(fn_sig, _, _), .. }) => Some(fn_sig),
+ _ => None,
+ }
+ }
+
pub fn fn_decl(self) -> Option<&'hir FnDecl<'hir>> {
match self {
OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
@@ -3781,6 +3800,7 @@ impl<'hir> Node<'hir> {
ItemKind::TyAlias(ty, _)
| ItemKind::Static(ty, _, _)
| ItemKind::Const(ty, _, _) => Some(ty),
+ ItemKind::Impl(impl_item) => Some(&impl_item.self_ty),
_ => None,
},
Node::TraitItem(it) => match it.kind {
diff --git a/compiler/rustc_hir/src/intravisit.rs b/compiler/rustc_hir/src/intravisit.rs
index d9195a374..8a6728559 100644
--- a/compiler/rustc_hir/src/intravisit.rs
+++ b/compiler/rustc_hir/src/intravisit.rs
@@ -62,7 +62,7 @@
//! respectively. (This follows from RPO respecting CFG domination).
//!
//! This order consistency is required in a few places in rustc, for
-//! example generator inference, and possibly also HIR borrowck.
+//! example coroutine inference, and possibly also HIR borrowck.
use crate::hir::*;
use rustc_ast::walk_list;
diff --git a/compiler/rustc_hir/src/lang_items.rs b/compiler/rustc_hir/src/lang_items.rs
index 23b20543d..1d1a1ee88 100644
--- a/compiler/rustc_hir/src/lang_items.rs
+++ b/compiler/rustc_hir/src/lang_items.rs
@@ -210,9 +210,10 @@ language_item_table! {
FnOnceOutput, sym::fn_once_output, fn_once_output, Target::AssocTy, GenericRequirement::None;
+ Iterator, sym::iterator, iterator_trait, Target::Trait, GenericRequirement::Exact(0);
Future, sym::future_trait, future_trait, Target::Trait, GenericRequirement::Exact(0);
- GeneratorState, sym::generator_state, gen_state, Target::Enum, GenericRequirement::None;
- Generator, sym::generator, gen_trait, Target::Trait, GenericRequirement::Minimum(1);
+ CoroutineState, sym::coroutine_state, coroutine_state, Target::Enum, GenericRequirement::None;
+ Coroutine, sym::coroutine, coroutine_trait, Target::Trait, GenericRequirement::Minimum(1);
Unpin, sym::unpin, unpin_trait, Target::Trait, GenericRequirement::None;
Pin, sym::pin, pin_type, Target::Struct, GenericRequirement::None;
@@ -230,7 +231,6 @@ language_item_table! {
Panic, sym::panic, panic_fn, Target::Fn, GenericRequirement::Exact(0);
PanicNounwind, sym::panic_nounwind, panic_nounwind, Target::Fn, GenericRequirement::Exact(0);
PanicFmt, sym::panic_fmt, panic_fmt, Target::Fn, GenericRequirement::None;
- PanicDisplay, sym::panic_display, panic_display, Target::Fn, GenericRequirement::None;
ConstPanicFmt, sym::const_panic_fmt, const_panic_fmt, Target::Fn, GenericRequirement::None;
PanicBoundsCheck, sym::panic_bounds_check, panic_bounds_check_fn, Target::Fn, GenericRequirement::Exact(0);
PanicMisalignedPointerDereference, sym::panic_misaligned_pointer_dereference, panic_misaligned_pointer_dereference_fn, Target::Fn, GenericRequirement::Exact(0);
diff --git a/compiler/rustc_hir/src/tests.rs b/compiler/rustc_hir/src/tests.rs
index a40a01787..74b8e88a9 100644
--- a/compiler/rustc_hir/src/tests.rs
+++ b/compiler/rustc_hir/src/tests.rs
@@ -2,7 +2,7 @@ use crate::definitions::{DefKey, DefPathData, DisambiguatedDefPathData};
use rustc_data_structures::stable_hasher::Hash64;
use rustc_span::def_id::{DefPathHash, StableCrateId};
use rustc_span::edition::Edition;
-use rustc_span::{create_session_if_not_set_then, Symbol};
+use rustc_span::{create_session_globals_then, Symbol};
#[test]
fn def_path_hash_depends_on_crate_id() {
@@ -14,7 +14,7 @@ fn def_path_hash_depends_on_crate_id() {
// the crate by changing the crate disambiguator (e.g. via bumping the
// crate's version number).
- create_session_if_not_set_then(Edition::Edition2024, |_| {
+ create_session_globals_then(Edition::Edition2024, || {
let id0 = StableCrateId::new(Symbol::intern("foo"), false, vec!["1".to_string()], "");
let id1 = StableCrateId::new(Symbol::intern("foo"), false, vec!["2".to_string()], "");