summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_hir/src/hir.rs
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/hir.rs
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/hir.rs')
-rw-r--r--compiler/rustc_hir/src/hir.rs118
1 files changed, 69 insertions, 49 deletions
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 {