Skip to content

Commit b236e49

Browse files
authored
Rollup merge of #73708 - Aaron1011:feature/reland-move-fn-self-msg, r=davidtwco
Explain move errors that occur due to method calls involving `self` (take two) This is a re-attempt of #72389 (which was reverted in #73594) Instead of using `ExpnKind::Desugaring` to represent operators, this PR checks the lang item directly.
2 parents d227a82 + fa6a61c commit b236e49

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+779
-123
lines changed

src/librustc_ast_lowering/expr.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_data_structures::thin_vec::ThinVec;
99
use rustc_errors::struct_span_err;
1010
use rustc_hir as hir;
1111
use rustc_hir::def::Res;
12-
use rustc_span::source_map::{respan, DesugaringKind, Span, Spanned};
12+
use rustc_span::source_map::{respan, DesugaringKind, ForLoopLoc, Span, Spanned};
1313
use rustc_span::symbol::{sym, Ident, Symbol};
1414
use rustc_target::asm;
1515
use std::collections::hash_map::Entry;
@@ -1361,9 +1361,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
13611361
body: &Block,
13621362
opt_label: Option<Label>,
13631363
) -> hir::Expr<'hir> {
1364+
let orig_head_span = head.span;
13641365
// expand <head>
13651366
let mut head = self.lower_expr_mut(head);
1366-
let desugared_span = self.mark_span_with_reason(DesugaringKind::ForLoop, head.span, None);
1367+
let desugared_span = self.mark_span_with_reason(
1368+
DesugaringKind::ForLoop(ForLoopLoc::Head),
1369+
orig_head_span,
1370+
None,
1371+
);
13671372
head.span = desugared_span;
13681373

13691374
let iter = Ident::with_dummy_span(sym::iter);
@@ -1458,10 +1463,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
14581463
// `mut iter => { ... }`
14591464
let iter_arm = self.arm(iter_pat, loop_expr);
14601465

1466+
let into_iter_span = self.mark_span_with_reason(
1467+
DesugaringKind::ForLoop(ForLoopLoc::IntoIter),
1468+
orig_head_span,
1469+
None,
1470+
);
1471+
14611472
// `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
14621473
let into_iter_expr = {
14631474
let into_iter_path = &[sym::iter, sym::IntoIterator, sym::into_iter];
1464-
self.expr_call_std_path(desugared_span, into_iter_path, arena_vec![self; head])
1475+
self.expr_call_std_path(into_iter_span, into_iter_path, arena_vec![self; head])
14651476
};
14661477

14671478
let match_expr = self.arena.alloc(self.expr_match(

src/librustc_hir/lang_items.rs

+55-25
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,26 @@ use rustc_span::Span;
2121

2222
use lazy_static::lazy_static;
2323

24+
pub enum LangItemGroup {
25+
Op,
26+
}
27+
28+
const NUM_GROUPS: usize = 1;
29+
30+
macro_rules! expand_group {
31+
() => {
32+
None
33+
};
34+
($group:expr) => {
35+
Some($group)
36+
};
37+
}
38+
2439
// The actual lang items defined come at the end of this file in one handy table.
2540
// So you probably just want to nip down to the end.
2641
macro_rules! language_item_table {
2742
(
28-
$( $variant:ident, $name:expr, $method:ident, $target:expr; )*
43+
$( $variant:ident $($group:expr)?, $name:expr, $method:ident, $target:expr; )*
2944
) => {
3045

3146
enum_from_u32! {
@@ -45,6 +60,13 @@ macro_rules! language_item_table {
4560
$( $variant => $name, )*
4661
}
4762
}
63+
64+
pub fn group(self) -> Option<LangItemGroup> {
65+
use LangItemGroup::*;
66+
match self {
67+
$( $variant => expand_group!($($group)*), )*
68+
}
69+
}
4870
}
4971

5072
#[derive(HashStable_Generic)]
@@ -54,6 +76,9 @@ macro_rules! language_item_table {
5476
pub items: Vec<Option<DefId>>,
5577
/// Lang items that were not found during collection.
5678
pub missing: Vec<LangItem>,
79+
/// Mapping from `LangItemGroup` discriminants to all
80+
/// `DefId`s of lang items in that group.
81+
pub groups: [Vec<DefId>; NUM_GROUPS],
5782
}
5883

5984
impl LanguageItems {
@@ -64,6 +89,7 @@ macro_rules! language_item_table {
6489
Self {
6590
items: vec![$(init_none($variant)),*],
6691
missing: Vec::new(),
92+
groups: [vec![]; NUM_GROUPS],
6793
}
6894
}
6995

@@ -79,6 +105,10 @@ macro_rules! language_item_table {
79105
self.items[it as usize].ok_or_else(|| format!("requires `{}` lang_item", it.name()))
80106
}
81107

108+
pub fn group(&self, group: LangItemGroup) -> &[DefId] {
109+
self.groups[group as usize].as_ref()
110+
}
111+
82112
$(
83113
/// Returns the corresponding `DefId` for the lang item
84114
#[doc = $name]
@@ -171,30 +201,30 @@ language_item_table! {
171201
CoerceUnsizedTraitLangItem, "coerce_unsized", coerce_unsized_trait, Target::Trait;
172202
DispatchFromDynTraitLangItem,"dispatch_from_dyn", dispatch_from_dyn_trait, Target::Trait;
173203

174-
AddTraitLangItem, "add", add_trait, Target::Trait;
175-
SubTraitLangItem, "sub", sub_trait, Target::Trait;
176-
MulTraitLangItem, "mul", mul_trait, Target::Trait;
177-
DivTraitLangItem, "div", div_trait, Target::Trait;
178-
RemTraitLangItem, "rem", rem_trait, Target::Trait;
179-
NegTraitLangItem, "neg", neg_trait, Target::Trait;
180-
NotTraitLangItem, "not", not_trait, Target::Trait;
181-
BitXorTraitLangItem, "bitxor", bitxor_trait, Target::Trait;
182-
BitAndTraitLangItem, "bitand", bitand_trait, Target::Trait;
183-
BitOrTraitLangItem, "bitor", bitor_trait, Target::Trait;
184-
ShlTraitLangItem, "shl", shl_trait, Target::Trait;
185-
ShrTraitLangItem, "shr", shr_trait, Target::Trait;
186-
AddAssignTraitLangItem, "add_assign", add_assign_trait, Target::Trait;
187-
SubAssignTraitLangItem, "sub_assign", sub_assign_trait, Target::Trait;
188-
MulAssignTraitLangItem, "mul_assign", mul_assign_trait, Target::Trait;
189-
DivAssignTraitLangItem, "div_assign", div_assign_trait, Target::Trait;
190-
RemAssignTraitLangItem, "rem_assign", rem_assign_trait, Target::Trait;
191-
BitXorAssignTraitLangItem, "bitxor_assign", bitxor_assign_trait, Target::Trait;
192-
BitAndAssignTraitLangItem, "bitand_assign", bitand_assign_trait, Target::Trait;
193-
BitOrAssignTraitLangItem, "bitor_assign", bitor_assign_trait, Target::Trait;
194-
ShlAssignTraitLangItem, "shl_assign", shl_assign_trait, Target::Trait;
195-
ShrAssignTraitLangItem, "shr_assign", shr_assign_trait, Target::Trait;
196-
IndexTraitLangItem, "index", index_trait, Target::Trait;
197-
IndexMutTraitLangItem, "index_mut", index_mut_trait, Target::Trait;
204+
AddTraitLangItem(Op), "add", add_trait, Target::Trait;
205+
SubTraitLangItem(Op), "sub", sub_trait, Target::Trait;
206+
MulTraitLangItem(Op), "mul", mul_trait, Target::Trait;
207+
DivTraitLangItem(Op), "div", div_trait, Target::Trait;
208+
RemTraitLangItem(Op), "rem", rem_trait, Target::Trait;
209+
NegTraitLangItem(Op), "neg", neg_trait, Target::Trait;
210+
NotTraitLangItem(Op), "not", not_trait, Target::Trait;
211+
BitXorTraitLangItem(Op), "bitxor", bitxor_trait, Target::Trait;
212+
BitAndTraitLangItem(Op), "bitand", bitand_trait, Target::Trait;
213+
BitOrTraitLangItem(Op), "bitor", bitor_trait, Target::Trait;
214+
ShlTraitLangItem(Op), "shl", shl_trait, Target::Trait;
215+
ShrTraitLangItem(Op), "shr", shr_trait, Target::Trait;
216+
AddAssignTraitLangItem(Op), "add_assign", add_assign_trait, Target::Trait;
217+
SubAssignTraitLangItem(Op), "sub_assign", sub_assign_trait, Target::Trait;
218+
MulAssignTraitLangItem(Op), "mul_assign", mul_assign_trait, Target::Trait;
219+
DivAssignTraitLangItem(Op), "div_assign", div_assign_trait, Target::Trait;
220+
RemAssignTraitLangItem(Op), "rem_assign", rem_assign_trait, Target::Trait;
221+
BitXorAssignTraitLangItem(Op),"bitxor_assign", bitxor_assign_trait, Target::Trait;
222+
BitAndAssignTraitLangItem(Op),"bitand_assign", bitand_assign_trait, Target::Trait;
223+
BitOrAssignTraitLangItem(Op),"bitor_assign", bitor_assign_trait, Target::Trait;
224+
ShlAssignTraitLangItem(Op), "shl_assign", shl_assign_trait, Target::Trait;
225+
ShrAssignTraitLangItem(Op), "shr_assign", shr_assign_trait, Target::Trait;
226+
IndexTraitLangItem(Op), "index", index_trait, Target::Trait;
227+
IndexMutTraitLangItem(Op), "index_mut", index_mut_trait, Target::Trait;
198228

199229
UnsafeCellTypeLangItem, "unsafe_cell", unsafe_cell_type, Target::Struct;
200230
VaListTypeLangItem, "va_list", va_list, Target::Struct;

src/librustc_infer/infer/error_reporting/need_type_info.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
468468
let msg = if let Some(simple_ident) = pattern.simple_ident() {
469469
match pattern.span.desugaring_kind() {
470470
None => format!("consider giving `{}` {}", simple_ident, suffix),
471-
Some(DesugaringKind::ForLoop) => {
471+
Some(DesugaringKind::ForLoop(_)) => {
472472
"the element type for this iterator is not specified".to_string()
473473
}
474474
_ => format!("this needs {}", suffix),

src/librustc_metadata/rmeta/decoder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1339,13 +1339,13 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
13391339
}
13401340
}
13411341

1342-
fn get_fn_param_names(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> &'tcx [Symbol] {
1342+
fn get_fn_param_names(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> &'tcx [Ident] {
13431343
let param_names = match self.kind(id) {
13441344
EntryKind::Fn(data) | EntryKind::ForeignFn(data) => data.decode(self).param_names,
13451345
EntryKind::AssocFn(data) => data.decode(self).fn_data.param_names,
13461346
_ => Lazy::empty(),
13471347
};
1348-
tcx.arena.alloc_from_iter(param_names.decode(self))
1348+
tcx.arena.alloc_from_iter(param_names.decode((self, tcx)))
13491349
}
13501350

13511351
fn exported_symbols(

src/librustc_metadata/rmeta/encoder.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use rustc_middle::ty::{self, SymbolName, Ty, TyCtxt};
3030
use rustc_serialize::{opaque, Encodable, Encoder, SpecializedEncoder, UseSpecializedEncodable};
3131
use rustc_session::config::CrateType;
3232
use rustc_span::source_map::Spanned;
33-
use rustc_span::symbol::{kw, sym, Ident, Symbol};
33+
use rustc_span::symbol::{sym, Ident, Symbol};
3434
use rustc_span::{self, ExternalSource, FileName, SourceFile, Span};
3535
use rustc_target::abi::VariantIdx;
3636
use std::hash::Hash;
@@ -1004,18 +1004,12 @@ impl EncodeContext<'tcx> {
10041004
}
10051005
}
10061006

1007-
fn encode_fn_param_names_for_body(&mut self, body_id: hir::BodyId) -> Lazy<[Symbol]> {
1008-
self.tcx.dep_graph.with_ignore(|| {
1009-
let body = self.tcx.hir().body(body_id);
1010-
self.lazy(body.params.iter().map(|arg| match arg.pat.kind {
1011-
hir::PatKind::Binding(_, _, ident, _) => ident.name,
1012-
_ => kw::Invalid,
1013-
}))
1014-
})
1007+
fn encode_fn_param_names_for_body(&mut self, body_id: hir::BodyId) -> Lazy<[Ident]> {
1008+
self.tcx.dep_graph.with_ignore(|| self.lazy(self.tcx.hir().body_param_names(body_id)))
10151009
}
10161010

1017-
fn encode_fn_param_names(&mut self, param_names: &[Ident]) -> Lazy<[Symbol]> {
1018-
self.lazy(param_names.iter().map(|ident| ident.name))
1011+
fn encode_fn_param_names(&mut self, param_names: &[Ident]) -> Lazy<[Ident]> {
1012+
self.lazy(param_names.iter())
10191013
}
10201014

10211015
fn encode_optimized_mir(&mut self, def_id: LocalDefId) {

src/librustc_metadata/rmeta/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use rustc_serialize::opaque::Encoder;
1919
use rustc_session::config::SymbolManglingVersion;
2020
use rustc_session::CrateDisambiguator;
2121
use rustc_span::edition::Edition;
22-
use rustc_span::symbol::Symbol;
22+
use rustc_span::symbol::{Ident, Symbol};
2323
use rustc_span::{self, Span};
2424
use rustc_target::spec::{PanicStrategy, TargetTriple};
2525

@@ -327,7 +327,7 @@ struct ModData {
327327
struct FnData {
328328
asyncness: hir::IsAsync,
329329
constness: hir::Constness,
330-
param_names: Lazy<[Symbol]>,
330+
param_names: Lazy<[Ident]>,
331331
}
332332

333333
#[derive(RustcEncodable, RustcDecodable)]

src/librustc_middle/hir/map/mod.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use rustc_hir::*;
1414
use rustc_index::vec::IndexVec;
1515
use rustc_span::hygiene::MacroKind;
1616
use rustc_span::source_map::Spanned;
17-
use rustc_span::symbol::{kw, Symbol};
17+
use rustc_span::symbol::{kw, Ident, Symbol};
1818
use rustc_span::Span;
1919
use rustc_target::spec::abi::Abi;
2020

@@ -374,6 +374,13 @@ impl<'hir> Map<'hir> {
374374
})
375375
}
376376

377+
pub fn body_param_names(&self, id: BodyId) -> impl Iterator<Item = Ident> + 'hir {
378+
self.body(id).params.iter().map(|arg| match arg.pat.kind {
379+
PatKind::Binding(_, _, ident, _) => ident,
380+
_ => Ident::new(kw::Invalid, rustc_span::DUMMY_SP),
381+
})
382+
}
383+
377384
/// Returns the `BodyOwnerKind` of this `LocalDefId`.
378385
///
379386
/// Panics if `LocalDefId` does not have an associated body.

src/librustc_middle/hir/mod.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ use rustc_data_structures::fingerprint::Fingerprint;
1212
use rustc_data_structures::fx::FxHashMap;
1313
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
1414
use rustc_hir::def_id::{LocalDefId, LOCAL_CRATE};
15-
use rustc_hir::Body;
16-
use rustc_hir::HirId;
17-
use rustc_hir::ItemLocalId;
18-
use rustc_hir::Node;
15+
use rustc_hir::*;
1916
use rustc_index::vec::IndexVec;
2017

2118
pub struct Owner<'tcx> {
@@ -79,5 +76,20 @@ pub fn provide(providers: &mut Providers<'_>) {
7976
};
8077
providers.hir_owner = |tcx, id| tcx.index_hir(LOCAL_CRATE).map[id].signature;
8178
providers.hir_owner_nodes = |tcx, id| tcx.index_hir(LOCAL_CRATE).map[id].with_bodies.as_deref();
79+
providers.fn_arg_names = |tcx, id| {
80+
let hir = tcx.hir();
81+
let hir_id = hir.as_local_hir_id(id.expect_local());
82+
if let Some(body_id) = hir.maybe_body_owned_by(hir_id) {
83+
tcx.arena.alloc_from_iter(hir.body_param_names(body_id))
84+
} else if let Node::TraitItem(&TraitItem {
85+
kind: TraitItemKind::Fn(_, TraitFn::Required(idents)),
86+
..
87+
}) = hir.get(hir_id)
88+
{
89+
tcx.arena.alloc_slice(idents)
90+
} else {
91+
span_bug!(hir.span(hir_id), "fn_arg_names: unexpected item {:?}", id);
92+
}
93+
};
8294
map::provide(providers);
8395
}

src/librustc_middle/lint.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ pub fn struct_lint_level<'s, 'd>(
339339
pub fn in_external_macro(sess: &Session, span: Span) -> bool {
340340
let expn_data = span.ctxt().outer_expn_data();
341341
match expn_data.kind {
342-
ExpnKind::Root | ExpnKind::Desugaring(DesugaringKind::ForLoop) => false,
342+
ExpnKind::Root | ExpnKind::Desugaring(DesugaringKind::ForLoop(_)) => false,
343343
ExpnKind::AstPass(_) | ExpnKind::Desugaring(_) => true, // well, it's "external"
344344
ExpnKind::Macro(MacroKind::Bang, _) => {
345345
// Dummy span for the `def_site` means it's an external macro.

src/librustc_middle/query/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ rustc_queries! {
729729
}
730730

731731
Other {
732-
query fn_arg_names(def_id: DefId) -> &'tcx [Symbol] {
732+
query fn_arg_names(def_id: DefId) -> &'tcx [rustc_span::symbol::Ident] {
733733
desc { |tcx| "looking up function parameter names for `{}`", tcx.def_path_str(def_id) }
734734
}
735735
/// Gets the rendered value of the specified constant or associated constant.

0 commit comments

Comments
 (0)