diff options
| author | bors <bors@rust-lang.org> | 2022-09-09 20:43:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-09-09 20:43:13 +0000 |
| commit | 1d37ed661a6922e7a167609b8cd7eb31e972b19b (patch) | |
| tree | d05693f2376caa5a9725b030558f246f5edf995a /compiler | |
| parent | 98f3001eecbe4cbd091c10ffab45b4c164bb507b (diff) | |
| parent | 2e258cec0505f58ffc2d1997acb5f4ea2e279500 (diff) | |
| download | rust-1d37ed661a6922e7a167609b8cd7eb31e972b19b.tar.gz rust-1d37ed661a6922e7a167609b8cd7eb31e972b19b.zip | |
Auto merge of #101611 - GuillaumeGomez:rollup-yw3qtug, r=GuillaumeGomez
Rollup of 5 pull requests Successful merges: - #101475 (Use futex-based locks and thread parker on Hermit) - #101492 (Suggest adding array lengths to references to arrays if possible) - #101495 (Compile spin_loop_hint as pause on x86 even without sse2 enabled) - #101529 (Fix the example code and doctest for Formatter::sign_plus) - #101600 (rustdoc: simplify the codeblock tooltip) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_hir/src/hir.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/check/expr.rs | 47 |
2 files changed, 31 insertions, 24 deletions
diff --git a/compiler/rustc_hir/src/hir.rs b/compiler/rustc_hir/src/hir.rs index a57fdc3bfb1..0de99f7a3db 100644 --- a/compiler/rustc_hir/src/hir.rs +++ b/compiler/rustc_hir/src/hir.rs @@ -2401,6 +2401,14 @@ impl<'hir> Ty<'hir> { _ => None, } } + + pub fn peel_refs(&self) -> &Self { + let mut final_ty = self; + while let TyKind::Rptr(_, MutTy { ty, .. }) = &final_ty.kind { + final_ty = &ty; + } + final_ty + } } /// Not represented directly in the AST; referred to by name through a `ty_path`. diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs index 0e6a8ef8265..21392001364 100644 --- a/compiler/rustc_typeck/src/check/expr.rs +++ b/compiler/rustc_typeck/src/check/expr.rs @@ -1305,31 +1305,30 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } fn suggest_array_len(&self, expr: &'tcx hir::Expr<'tcx>, array_len: u64) { - if let Some(parent_hir_id) = self.tcx.hir().find_parent_node(expr.hir_id) { - let ty = match self.tcx.hir().find(parent_hir_id) { - Some( - hir::Node::Local(hir::Local { ty: Some(ty), .. }) - | hir::Node::Item(hir::Item { kind: hir::ItemKind::Const(ty, _), .. }), - ) => Some(ty), - _ => None, - }; - if let Some(ty) = ty - && let hir::TyKind::Array(_, length) = ty.kind - && let hir::ArrayLen::Body(hir::AnonConst { hir_id, .. }) = length - && let Some(span) = self.tcx.hir().opt_span(hir_id) - { - match self.tcx.sess.diagnostic().steal_diagnostic(span, StashKey::UnderscoreForArrayLengths) { - Some(mut err) => { - err.span_suggestion( - span, - "consider specifying the array length", - array_len, - Applicability::MaybeIncorrect, - ); - err.emit(); - } - None => () + let parent_node = self.tcx.hir().parent_iter(expr.hir_id).find(|(_, node)| { + !matches!(node, hir::Node::Expr(hir::Expr { kind: hir::ExprKind::AddrOf(..), .. })) + }); + let Some((_, + hir::Node::Local(hir::Local { ty: Some(ty), .. }) + | hir::Node::Item(hir::Item { kind: hir::ItemKind::Const(ty, _), .. })) + ) = parent_node else { + return + }; + if let hir::TyKind::Array(_, length) = ty.peel_refs().kind + && let hir::ArrayLen::Body(hir::AnonConst { hir_id, .. }) = length + && let Some(span) = self.tcx.hir().opt_span(hir_id) + { + match self.tcx.sess.diagnostic().steal_diagnostic(span, StashKey::UnderscoreForArrayLengths) { + Some(mut err) => { + err.span_suggestion( + span, + "consider specifying the array length", + array_len, + Applicability::MaybeIncorrect, + ); + err.emit(); } + None => () } } } |
