From 2b1cfe5b5b3c33b71002e71b7d2e6d6505d551f2 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Fri, 29 Nov 2019 13:43:03 +0100 Subject: [PATCH 1/7] Syntax for hir::Expr. --- src/librustc/arena.rs | 2 +- src/librustc/hir/check_attr.rs | 8 +- src/librustc/hir/intravisit.rs | 28 +-- src/librustc/hir/lowering.rs | 66 +++--- src/librustc/hir/lowering/expr.rs | 110 +++++----- src/librustc/hir/lowering/item.rs | 20 +- src/librustc/hir/map/blocks.rs | 4 +- src/librustc/hir/map/collector.rs | 14 +- src/librustc/hir/map/mod.rs | 4 +- src/librustc/hir/mod.rs | 193 +++++++++--------- src/librustc/hir/pat_util.rs | 2 +- src/librustc/hir/print.rs | 66 +++--- src/librustc/hir/upvars.rs | 4 +- src/librustc/ich/impls_hir.rs | 2 +- .../infer/error_reporting/need_type_info.rs | 14 +- .../error_reporting/nice_region_error/util.rs | 2 +- src/librustc/lint/context.rs | 14 +- src/librustc/lint/mod.rs | 26 +-- src/librustc/middle/reachable.rs | 2 +- src/librustc/middle/region.rs | 36 ++-- src/librustc/middle/resolve_lifetime.rs | 4 +- src/librustc/traits/error_reporting.rs | 25 +-- src/librustc/ty/context.rs | 16 +- src/librustc_typeck/expr_use_visitor.rs | 34 +-- 24 files changed, 355 insertions(+), 341 deletions(-) diff --git a/src/librustc/arena.rs b/src/librustc/arena.rs index 3d5bd313f88..e93cddf5799 100644 --- a/src/librustc/arena.rs +++ b/src/librustc/arena.rs @@ -131,7 +131,7 @@ macro_rules! arena_types { [] foreign_item: rustc::hir::ForeignItem<$tcx>, [] impl_item_ref: rustc::hir::ImplItemRef, [few] macro_def: rustc::hir::MacroDef<$tcx>, - [] param: rustc::hir::Param, + [] param: rustc::hir::Param<$tcx>, [] path: rustc::hir::Path, [] struct_field: rustc::hir::StructField<$tcx>, [] trait_item_ref: rustc::hir::TraitItemRef, diff --git a/src/librustc/hir/check_attr.rs b/src/librustc/hir/check_attr.rs index 5918ff03d58..511244ca516 100644 --- a/src/librustc/hir/check_attr.rs +++ b/src/librustc/hir/check_attr.rs @@ -458,7 +458,7 @@ impl CheckAttrVisitor<'tcx> { .emit(); } - fn check_stmt_attributes(&self, stmt: &hir::Stmt) { + fn check_stmt_attributes(&self, stmt: &hir::Stmt<'_>) { // When checking statements ignore expressions, they will be checked later if let hir::StmtKind::Local(ref l) = stmt.kind { for attr in l.attrs.iter() { @@ -477,7 +477,7 @@ impl CheckAttrVisitor<'tcx> { } } - fn check_expr_attributes(&self, expr: &hir::Expr) { + fn check_expr_attributes(&self, expr: &hir::Expr<'_>) { let target = match expr.kind { hir::ExprKind::Closure(..) => Target::Closure, _ => Target::Expression, @@ -537,12 +537,12 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { intravisit::walk_impl_item(self, impl_item) } - fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt) { + fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt<'tcx>) { self.check_stmt_attributes(stmt); intravisit::walk_stmt(self, stmt) } - fn visit_expr(&mut self, expr: &'tcx hir::Expr) { + fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) { self.check_expr_attributes(expr); intravisit::walk_expr(self, expr) } diff --git a/src/librustc/hir/intravisit.rs b/src/librustc/hir/intravisit.rs index a7a8673d49e..5b8612ede35 100644 --- a/src/librustc/hir/intravisit.rs +++ b/src/librustc/hir/intravisit.rs @@ -212,7 +212,7 @@ pub trait Visitor<'v>: Sized { } } - fn visit_param(&mut self, param: &'v Param) { + fn visit_param(&mut self, param: &'v Param<'v>) { walk_param(self, param) } @@ -253,25 +253,25 @@ pub trait Visitor<'v>: Sized { fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) { walk_foreign_item(self, i) } - fn visit_local(&mut self, l: &'v Local) { + fn visit_local(&mut self, l: &'v Local<'v>) { walk_local(self, l) } - fn visit_block(&mut self, b: &'v Block) { + fn visit_block(&mut self, b: &'v Block<'v>) { walk_block(self, b) } - fn visit_stmt(&mut self, s: &'v Stmt) { + fn visit_stmt(&mut self, s: &'v Stmt<'v>) { walk_stmt(self, s) } - fn visit_arm(&mut self, a: &'v Arm) { + fn visit_arm(&mut self, a: &'v Arm<'v>) { walk_arm(self, a) } - fn visit_pat(&mut self, p: &'v Pat) { + fn visit_pat(&mut self, p: &'v Pat<'v>) { walk_pat(self, p) } fn visit_anon_const(&mut self, c: &'v AnonConst) { walk_anon_const(self, c) } - fn visit_expr(&mut self, ex: &'v Expr) { + fn visit_expr(&mut self, ex: &'v Expr<'v>) { walk_expr(self, ex) } fn visit_ty(&mut self, t: &'v Ty) { @@ -409,7 +409,7 @@ pub fn walk_body<'v, V: Visitor<'v>>(visitor: &mut V, body: &'v Body<'v>) { visitor.visit_expr(&body.value); } -pub fn walk_local<'v, V: Visitor<'v>>(visitor: &mut V, local: &'v Local) { +pub fn walk_local<'v, V: Visitor<'v>>(visitor: &mut V, local: &'v Local<'v>) { // Intentionally visiting the expr first - the initialization expr // dominates the local's definition. walk_list!(visitor, visit_expr, &local.init); @@ -462,7 +462,7 @@ where visitor.visit_path(&trait_ref.path, trait_ref.hir_ref_id) } -pub fn walk_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Param) { +pub fn walk_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Param<'v>) { visitor.visit_id(param.hir_id); visitor.visit_pat(¶m.pat); walk_list!(visitor, visit_attribute, ¶m.attrs); @@ -684,7 +684,7 @@ pub fn walk_assoc_type_binding<'v, V: Visitor<'v>>(visitor: &mut V, type_binding } } -pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) { +pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat<'v>) { visitor.visit_id(pattern.hir_id); match pattern.kind { PatKind::TupleStruct(ref qpath, ref children, _) => { @@ -955,13 +955,13 @@ pub fn walk_struct_field<'v, V: Visitor<'v>>(visitor: &mut V, struct_field: &'v walk_list!(visitor, visit_attribute, struct_field.attrs); } -pub fn walk_block<'v, V: Visitor<'v>>(visitor: &mut V, block: &'v Block) { +pub fn walk_block<'v, V: Visitor<'v>>(visitor: &mut V, block: &'v Block<'v>) { visitor.visit_id(block.hir_id); walk_list!(visitor, visit_stmt, &block.stmts); walk_list!(visitor, visit_expr, &block.expr); } -pub fn walk_stmt<'v, V: Visitor<'v>>(visitor: &mut V, statement: &'v Stmt) { +pub fn walk_stmt<'v, V: Visitor<'v>>(visitor: &mut V, statement: &'v Stmt<'v>) { visitor.visit_id(statement.hir_id); match statement.kind { StmtKind::Local(ref local) => visitor.visit_local(local), @@ -977,7 +977,7 @@ pub fn walk_anon_const<'v, V: Visitor<'v>>(visitor: &mut V, constant: &'v AnonCo visitor.visit_nested_body(constant.body); } -pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { +pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>) { visitor.visit_id(expression.hir_id); walk_list!(visitor, visit_attribute, expression.attrs.iter()); match expression.kind { @@ -1087,7 +1087,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { } } -pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm) { +pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm<'v>) { visitor.visit_id(arm.hir_id); visitor.visit_pat(&arm.pat); if let Some(ref g) = arm.guard { diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index f6db451d57e..4bc41c444e6 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -2022,7 +2022,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }) } - fn lower_local(&mut self, l: &Local) -> (hir::Local, SmallVec<[NodeId; 1]>) { + fn lower_local(&mut self, l: &Local) -> (hir::Local<'hir>, SmallVec<[NodeId; 1]>) { let mut ids = SmallVec::<[NodeId; 1]>::new(); if self.sess.features_untracked().impl_trait_in_bindings { if let Some(ref ty) = l.ty { @@ -2586,7 +2586,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { bounds.iter().map(|bound| self.lower_param_bound(bound, itctx.reborrow())).collect() } - fn lower_block(&mut self, b: &Block, targeted_by_break: bool) -> P { + fn lower_block(&mut self, b: &Block, targeted_by_break: bool) -> P> { let mut stmts = vec![]; let mut expr = None; @@ -2614,12 +2614,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { /// Lowers a block directly to an expression, presuming that it /// has no attributes and is not targeted by a `break`. - fn lower_block_expr(&mut self, b: &Block) -> hir::Expr { + fn lower_block_expr(&mut self, b: &Block) -> hir::Expr<'hir> { let block = self.lower_block(b, false); self.expr_block(block, AttrVec::new()) } - fn lower_pat(&mut self, p: &Pat) -> P { + fn lower_pat(&mut self, p: &Pat) -> P> { let node = match p.kind { PatKind::Wild => hir::PatKind::Wild, PatKind::Ident(ref binding_mode, ident, ref sub) => { @@ -2700,7 +2700,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { &mut self, pats: &[AstP], ctx: &str, - ) -> (HirVec>, Option) { + ) -> (HirVec>>, Option) { let mut elems = Vec::with_capacity(pats.len()); let mut rest = None; @@ -2737,7 +2737,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { /// When encountering `($binding_mode $ident @)? ..` (`slice`), /// this is interpreted as a sub-slice pattern semantically. /// Patterns that follow, which are not like `slice` -- or an error occurs, are in `after`. - fn lower_pat_slice(&mut self, pats: &[AstP]) -> hir::PatKind { + fn lower_pat_slice(&mut self, pats: &[AstP]) -> hir::PatKind<'hir> { let mut before = Vec::new(); let mut after = Vec::new(); let mut slice = None; @@ -2796,8 +2796,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { p: &Pat, binding_mode: &BindingMode, ident: Ident, - lower_sub: impl FnOnce(&mut Self) -> Option>, - ) -> hir::PatKind { + lower_sub: impl FnOnce(&mut Self) -> Option>>, + ) -> hir::PatKind<'hir> { match self.resolver.get_partial_res(p.id).map(|d| d.base_res()) { // `None` can occur in body-less function signatures res @ None | res @ Some(Res::Local(_)) => { @@ -2824,12 +2824,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } } - fn pat_wild_with_node_id_of(&mut self, p: &Pat) -> P { + fn pat_wild_with_node_id_of(&mut self, p: &Pat) -> P> { self.pat_with_node_id_of(p, hir::PatKind::Wild) } /// Construct a `Pat` with the `HirId` of `p.id` lowered. - fn pat_with_node_id_of(&mut self, p: &Pat, kind: hir::PatKind) -> P { + fn pat_with_node_id_of(&mut self, p: &Pat, kind: hir::PatKind<'hir>) -> P> { P(hir::Pat { hir_id: self.lower_node_id(p.id), kind, span: p.span }) } @@ -2843,7 +2843,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } /// Used to ban the `..` pattern in places it shouldn't be semantically. - fn ban_illegal_rest_pat(&self, sp: Span) -> hir::PatKind { + fn ban_illegal_rest_pat(&self, sp: Span) -> hir::PatKind<'hir> { self.diagnostic() .struct_span_err(sp, "`..` patterns are not allowed here") .note("only allowed in tuple, tuple struct, and slice patterns") @@ -2869,11 +2869,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }) } - fn lower_stmt(&mut self, s: &Stmt) -> SmallVec<[hir::Stmt; 1]> { + fn lower_stmt(&mut self, s: &Stmt) -> SmallVec<[hir::Stmt<'hir>; 1]> { let kind = match s.kind { StmtKind::Local(ref l) => { let (l, item_ids) = self.lower_local(l); - let mut ids: SmallVec<[hir::Stmt; 1]> = item_ids + let mut ids: SmallVec<[hir::Stmt<'hir>; 1]> = item_ids .into_iter() .map(|item_id| { let item_id = hir::ItemId { id: self.lower_node_id(item_id) }; @@ -2944,11 +2944,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // Helper methods for building HIR. - fn stmt(&mut self, span: Span, kind: hir::StmtKind) -> hir::Stmt { + fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> { hir::Stmt { span, kind, hir_id: self.next_id() } } - fn stmt_expr(&mut self, span: Span, expr: hir::Expr) -> hir::Stmt { + fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> { self.stmt(span, hir::StmtKind::Expr(P(expr))) } @@ -2956,24 +2956,24 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { &mut self, attrs: AttrVec, span: Span, - init: Option>, - pat: P, + init: Option>>, + pat: P>, source: hir::LocalSource, - ) -> hir::Stmt { + ) -> hir::Stmt<'hir> { let local = hir::Local { attrs, hir_id: self.next_id(), init, pat, source, span, ty: None }; self.stmt(span, hir::StmtKind::Local(P(local))) } - fn block_expr(&mut self, expr: P) -> hir::Block { + fn block_expr(&mut self, expr: P>) -> hir::Block<'hir> { self.block_all(expr.span, hir::HirVec::new(), Some(expr)) } fn block_all( &mut self, span: Span, - stmts: hir::HirVec, - expr: Option>, - ) -> hir::Block { + stmts: hir::HirVec>, + expr: Option>>, + ) -> hir::Block<'hir> { hir::Block { stmts, expr, @@ -2985,24 +2985,24 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } /// Constructs a `true` or `false` literal pattern. - fn pat_bool(&mut self, span: Span, val: bool) -> P { + fn pat_bool(&mut self, span: Span, val: bool) -> P> { let expr = self.expr_bool(span, val); self.pat(span, hir::PatKind::Lit(P(expr))) } - fn pat_ok(&mut self, span: Span, pat: P) -> P { + fn pat_ok(&mut self, span: Span, pat: P>) -> P> { self.pat_std_enum(span, &[sym::result, sym::Result, sym::Ok], hir_vec![pat]) } - fn pat_err(&mut self, span: Span, pat: P) -> P { + fn pat_err(&mut self, span: Span, pat: P>) -> P> { self.pat_std_enum(span, &[sym::result, sym::Result, sym::Err], hir_vec![pat]) } - fn pat_some(&mut self, span: Span, pat: P) -> P { + fn pat_some(&mut self, span: Span, pat: P>) -> P> { self.pat_std_enum(span, &[sym::option, sym::Option, sym::Some], hir_vec![pat]) } - fn pat_none(&mut self, span: Span) -> P { + fn pat_none(&mut self, span: Span) -> P> { self.pat_std_enum(span, &[sym::option, sym::Option, sym::None], hir_vec![]) } @@ -3010,8 +3010,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { &mut self, span: Span, components: &[Symbol], - subpats: hir::HirVec>, - ) -> P { + subpats: hir::HirVec>>, + ) -> P> { let path = self.std_path(span, components, None, true); let qpath = hir::QPath::Resolved(None, P(path)); let pt = if subpats.is_empty() { @@ -3022,7 +3022,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { self.pat(span, pt) } - fn pat_ident(&mut self, span: Span, ident: Ident) -> (P, hir::HirId) { + fn pat_ident(&mut self, span: Span, ident: Ident) -> (P>, hir::HirId) { self.pat_ident_binding_mode(span, ident, hir::BindingAnnotation::Unannotated) } @@ -3031,7 +3031,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { span: Span, ident: Ident, bm: hir::BindingAnnotation, - ) -> (P, hir::HirId) { + ) -> (P>, hir::HirId) { let hir_id = self.next_id(); ( @@ -3044,11 +3044,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ) } - fn pat_wild(&mut self, span: Span) -> P { + fn pat_wild(&mut self, span: Span) -> P> { self.pat(span, hir::PatKind::Wild) } - fn pat(&mut self, span: Span, kind: hir::PatKind) -> P { + fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> P> { P(hir::Pat { hir_id: self.next_id(), kind, span }) } diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc/hir/lowering/expr.rs index 8311b9168e4..19a732a864a 100644 --- a/src/librustc/hir/lowering/expr.rs +++ b/src/librustc/hir/lowering/expr.rs @@ -13,12 +13,12 @@ use syntax::symbol::{sym, Symbol}; use rustc_error_codes::*; -impl LoweringContext<'_, '_> { - fn lower_exprs(&mut self, exprs: &[AstP]) -> HirVec { +impl<'hir> LoweringContext<'_, 'hir> { + fn lower_exprs(&mut self, exprs: &[AstP]) -> HirVec> { exprs.iter().map(|x| self.lower_expr(x)).collect() } - pub(super) fn lower_expr(&mut self, e: &Expr) -> hir::Expr { + pub(super) fn lower_expr(&mut self, e: &Expr) -> hir::Expr<'hir> { let kind = match e.kind { ExprKind::Box(ref inner) => hir::ExprKind::Box(P(self.lower_expr(inner))), ExprKind::Array(ref exprs) => hir::ExprKind::Array(self.lower_exprs(exprs)), @@ -237,7 +237,7 @@ impl LoweringContext<'_, '_> { /// ```rust /// match scrutinee { pats => true, _ => false } /// ``` - fn lower_expr_let(&mut self, span: Span, pat: &Pat, scrutinee: &Expr) -> hir::ExprKind { + fn lower_expr_let(&mut self, span: Span, pat: &Pat, scrutinee: &Expr) -> hir::ExprKind<'hir> { // If we got here, the `let` expression is not allowed. if self.sess.opts.unstable_features.is_nightly_build() { @@ -286,7 +286,7 @@ impl LoweringContext<'_, '_> { cond: &Expr, then: &Block, else_opt: Option<&Expr>, - ) -> hir::ExprKind { + ) -> hir::ExprKind<'hir> { // FIXME(#53667): handle lowering of && and parens. // `_ => else_block` where `else_block` is `{}` if there's `None`: @@ -331,7 +331,7 @@ impl LoweringContext<'_, '_> { cond: &Expr, body: &Block, opt_label: Option