diff --git a/compiler/rustc_resolve/src/build_reduced_graph.rs b/compiler/rustc_resolve/src/build_reduced_graph.rs index 736648c125b69..bf00de3f557ef 100644 --- a/compiler/rustc_resolve/src/build_reduced_graph.rs +++ b/compiler/rustc_resolve/src/build_reduced_graph.rs @@ -26,7 +26,7 @@ use rustc_middle::metadata::{ModChild, Reexport}; use rustc_middle::ty::{Feed, Visibility}; use rustc_middle::{bug, span_bug}; use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind}; -use rustc_span::{Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym}; +use rustc_span::{Ident, Span, Symbol, kw, sym}; use thin_vec::ThinVec; use tracing::debug; @@ -36,9 +36,9 @@ use crate::imports::{ImportData, ImportKind}; use crate::macros::{MacroRulesDecl, MacroRulesScope, MacroRulesScopeRef}; use crate::ref_mut::CmCell; use crate::{ - BindingKey, Decl, DeclData, DeclKind, ExternPreludeEntry, Finalize, MacroData, Module, - ModuleKind, ModuleOrUniformRoot, ParentScope, PathResult, ResolutionError, Resolver, Segment, - Used, VisResolutionError, errors, + BindingKey, Decl, DeclData, DeclKind, ExternPreludeEntry, Finalize, IdentKey, MacroData, + Module, ModuleKind, ModuleOrUniformRoot, ParentScope, PathResult, ResolutionError, Resolver, + Segment, Used, VisResolutionError, errors, }; type Res = def::Res; @@ -48,12 +48,15 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { /// and report an error in case of a collision. pub(crate) fn plant_decl_into_local_module( &mut self, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, ns: Namespace, decl: Decl<'ra>, ) { - if let Err(old_decl) = self.try_plant_decl_into_local_module(ident, ns, decl, false) { - self.report_conflict(ident.0, ns, old_decl, decl); + if let Err(old_decl) = + self.try_plant_decl_into_local_module(ident, orig_ident_span, ns, decl, false) + { + self.report_conflict(ident, ns, old_decl, decl); } } @@ -61,7 +64,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn define_local( &mut self, parent: Module<'ra>, - ident: Ident, + orig_ident: Ident, ns: Namespace, res: Res, vis: Visibility, @@ -69,15 +72,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { expn_id: LocalExpnId, ) { let decl = self.arenas.new_def_decl(res, vis.to_def_id(), span, expn_id, Some(parent)); - let ident = Macros20NormalizedIdent::new(ident); - self.plant_decl_into_local_module(ident, ns, decl); + let ident = IdentKey::new(orig_ident); + self.plant_decl_into_local_module(ident, orig_ident.span, ns, decl); } /// Create a name definitinon from the given components, and put it into the extern module. fn define_extern( &self, parent: Module<'ra>, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, ns: Namespace, child_index: usize, res: Res, @@ -102,7 +106,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let key = BindingKey::new_disambiguated(ident, ns, || (child_index + 1).try_into().unwrap()); // 0 indicates no underscore if self - .resolution_or_default(parent, key) + .resolution_or_default(parent, key, orig_ident_span) .borrow_mut_unchecked() .non_glob_decl .replace(decl) @@ -279,8 +283,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { .unwrap_or_else(|| res.def_id()), ) }; - let ModChild { ident, res, vis, ref reexport_chain } = *child; - let ident = Macros20NormalizedIdent::new(ident); + let ModChild { ident: orig_ident, res, vis, ref reexport_chain } = *child; + let ident = IdentKey::new(orig_ident); let span = child_span(self, reexport_chain, res); let res = res.expect_non_local(); let expansion = parent_scope.expansion; @@ -293,7 +297,18 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // Record primary definitions. let define_extern = |ns| { - self.define_extern(parent, ident, ns, child_index, res, vis, span, expansion, ambig) + self.define_extern( + parent, + ident, + orig_ident.span, + ns, + child_index, + res, + vis, + span, + expansion, + ambig, + ) }; match res { Res::Def( @@ -533,8 +548,8 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { if target.name != kw::Underscore { self.r.per_ns(|this, ns| { if !type_ns_only || ns == TypeNS { - let key = BindingKey::new(Macros20NormalizedIdent::new(target), ns); - this.resolution_or_default(current_module, key) + let key = BindingKey::new(IdentKey::new(target), ns); + this.resolution_or_default(current_module, key, target.span) .borrow_mut(this) .single_imports .insert(import); @@ -971,7 +986,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { &mut self, orig_name: Option, item: &Item, - ident: Ident, + orig_ident: Ident, local_def_id: LocalDefId, vis: Visibility, ) { @@ -980,7 +995,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { let parent = parent_scope.module; let expansion = parent_scope.expansion; - let (used, module, decl) = if orig_name.is_none() && ident.name == kw::SelfLower { + let (used, module, decl) = if orig_name.is_none() && orig_ident.name == kw::SelfLower { self.r.dcx().emit_err(errors::ExternCrateSelfRequiresRenaming { span: sp }); return; } else if orig_name == Some(kw::SelfLower) { @@ -1005,7 +1020,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { }) .unwrap_or((true, None, self.r.dummy_decl)); let import = self.r.arenas.alloc_import(ImportData { - kind: ImportKind::ExternCrate { source: orig_name, target: ident, id: item.id }, + kind: ImportKind::ExternCrate { source: orig_name, target: orig_ident, id: item.id }, root_id: item.id, parent_scope, imported_module: CmCell::new(module), @@ -1023,7 +1038,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { } self.r.potentially_unused_imports.push(import); let import_decl = self.r.new_import_decl(decl, import); - let ident = Macros20NormalizedIdent::new(ident); + let ident = IdentKey::new(orig_ident); if ident.name != kw::Underscore && parent == self.r.graph_root { // FIXME: this error is technically unnecessary now when extern prelude is split into // two scopes, remove it with lang team approval. @@ -1042,20 +1057,20 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { Entry::Occupied(mut occupied) => { let entry = occupied.get_mut(); if entry.item_decl.is_some() { - let msg = format!("extern crate `{ident}` already in extern prelude"); + let msg = format!("extern crate `{orig_ident}` already in extern prelude"); self.r.tcx.dcx().span_delayed_bug(item.span, msg); } else { - entry.item_decl = Some((import_decl, orig_name.is_some())); + entry.item_decl = Some((import_decl, orig_ident.span, orig_name.is_some())); } entry } Entry::Vacant(vacant) => vacant.insert(ExternPreludeEntry { - item_decl: Some((import_decl, true)), + item_decl: Some((import_decl, orig_ident.span, true)), flag_decl: None, }), }; } - self.r.plant_decl_into_local_module(ident, TypeNS, import_decl); + self.r.plant_decl_into_local_module(ident, orig_ident.span, TypeNS, import_decl); } /// Constructs the reduced graph for one foreign item. @@ -1156,7 +1171,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { if let Some(span) = import_all { let import = macro_use_import(self, span, false); self.r.potentially_unused_imports.push(import); - module.for_each_child_mut(self, |this, ident, ns, binding| { + module.for_each_child_mut(self, |this, ident, _, ns, binding| { if ns == MacroNS { let import = if this.r.is_accessible_from(binding.vis(), this.parent_scope.module) { @@ -1267,7 +1282,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { let expansion = parent_scope.expansion; let feed = self.r.feed(item.id); let def_id = feed.key(); - let (res, ident, span, macro_rules) = match &item.kind { + let (res, orig_ident, span, macro_rules) = match &item.kind { ItemKind::MacroDef(ident, def) => { (self.res(def_id), *ident, item.span, def.macro_rules) } @@ -1290,8 +1305,8 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { self.r.local_macro_def_scopes.insert(def_id, parent_scope.module); if macro_rules { - let ident = Macros20NormalizedIdent::new(ident); - self.r.macro_names.insert(ident.0); + let ident = IdentKey::new(orig_ident); + self.r.macro_names.insert(ident); let is_macro_export = ast::attr::contains_name(&item.attrs, sym::macro_export); let vis = if is_macro_export { Visibility::Public @@ -1323,10 +1338,10 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { }); self.r.import_use_map.insert(import, Used::Other); let import_decl = self.r.new_import_decl(decl, import); - self.r.plant_decl_into_local_module(ident, MacroNS, import_decl); + self.r.plant_decl_into_local_module(ident, orig_ident.span, MacroNS, import_decl); } else { - self.r.check_reserved_macro_name(ident.0, res); - self.insert_unused_macro(ident.0, def_id, item.id); + self.r.check_reserved_macro_name(ident.name, orig_ident.span, res); + self.insert_unused_macro(orig_ident, def_id, item.id); } self.r.feed_visibility(feed, vis); let scope = self.r.arenas.alloc_macro_rules_scope(MacroRulesScope::Def( @@ -1334,6 +1349,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { parent_macro_rules_scope: parent_scope.macro_rules, decl, ident, + orig_ident_span: orig_ident.span, }), )); self.r.macro_rules_scopes.insert(def_id, scope); @@ -1349,9 +1365,9 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> { _ => self.resolve_visibility(&item.vis), }; if !vis.is_public() { - self.insert_unused_macro(ident, def_id, item.id); + self.insert_unused_macro(orig_ident, def_id, item.id); } - self.r.define_local(module, ident, MacroNS, res, vis, span, expansion); + self.r.define_local(module, orig_ident, MacroNS, res, vis, span, expansion); self.r.feed_visibility(feed, vis); self.parent_scope.macro_rules } @@ -1493,7 +1509,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> { { // Don't add underscore names, they cannot be looked up anyway. let impl_def_id = self.r.tcx.local_parent(local_def_id); - let key = BindingKey::new(Macros20NormalizedIdent::new(ident), ns); + let key = BindingKey::new(IdentKey::new(ident), ns); self.r.impl_binding_keys.entry(impl_def_id).or_default().insert(key); } diff --git a/compiler/rustc_resolve/src/check_unused.rs b/compiler/rustc_resolve/src/check_unused.rs index 3724fcfce40f3..45fdea82d47bc 100644 --- a/compiler/rustc_resolve/src/check_unused.rs +++ b/compiler/rustc_resolve/src/check_unused.rs @@ -33,10 +33,10 @@ use rustc_session::lint::BuiltinLintDiag; use rustc_session::lint::builtin::{ MACRO_USE_EXTERN_CRATE, UNUSED_EXTERN_CRATES, UNUSED_IMPORTS, UNUSED_QUALIFICATIONS, }; -use rustc_span::{DUMMY_SP, Ident, Macros20NormalizedIdent, Span, kw}; +use rustc_span::{DUMMY_SP, Ident, Span, kw}; use crate::imports::{Import, ImportKind}; -use crate::{DeclKind, LateDecl, Resolver, module_to_string}; +use crate::{DeclKind, IdentKey, LateDecl, Resolver, module_to_string}; struct UnusedImport { use_tree: ast::UseTree, @@ -203,7 +203,7 @@ impl<'a, 'ra, 'tcx> UnusedImportCheckVisitor<'a, 'ra, 'tcx> { if self .r .extern_prelude - .get(&Macros20NormalizedIdent::new(extern_crate.ident)) + .get(&IdentKey::new(extern_crate.ident)) .is_none_or(|entry| entry.introduced_by_item()) { continue; diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index a5b3def4b5f8f..5c401c3bf8280 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -32,9 +32,7 @@ use rustc_span::edit_distance::find_best_match_for_name; use rustc_span::edition::Edition; use rustc_span::hygiene::MacroKind; use rustc_span::source_map::{SourceMap, Spanned}; -use rustc_span::{ - BytePos, DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, SyntaxContext, kw, sym, -}; +use rustc_span::{BytePos, DUMMY_SP, Ident, Span, Symbol, SyntaxContext, kw, sym}; use thin_vec::{ThinVec, thin_vec}; use tracing::{debug, instrument}; @@ -47,10 +45,10 @@ use crate::imports::{Import, ImportKind}; use crate::late::{DiagMetadata, PatternSource, Rib}; use crate::{ AmbiguityError, AmbiguityKind, AmbiguityWarning, BindingError, BindingKey, Decl, DeclKind, - Finalize, ForwardGenericParamBanReason, HasGenericParams, LateDecl, MacroRulesScope, Module, - ModuleKind, ModuleOrUniformRoot, ParentScope, PathResult, PrivacyError, ResolutionError, - Resolver, Scope, ScopeSet, Segment, UseError, Used, VisResolutionError, errors as errs, - path_names_to_string, + Finalize, ForwardGenericParamBanReason, HasGenericParams, IdentKey, LateDecl, MacroRulesScope, + Module, ModuleKind, ModuleOrUniformRoot, ParentScope, PathResult, PrivacyError, + ResolutionError, Resolver, Scope, ScopeSet, Segment, UseError, Used, VisResolutionError, + errors as errs, path_names_to_string, }; type Res = def::Res; @@ -81,24 +79,14 @@ pub(crate) struct TypoSuggestion { } impl TypoSuggestion { - pub(crate) fn typo_from_ident(ident: Ident, res: Res) -> TypoSuggestion { - Self { - candidate: ident.name, - span: Some(ident.span), - res, - target: SuggestionTarget::SimilarlyNamed, - } + pub(crate) fn new(candidate: Symbol, span: Span, res: Res) -> TypoSuggestion { + Self { candidate, span: Some(span), res, target: SuggestionTarget::SimilarlyNamed } } pub(crate) fn typo_from_name(candidate: Symbol, res: Res) -> TypoSuggestion { Self { candidate, span: None, res, target: SuggestionTarget::SimilarlyNamed } } - pub(crate) fn single_item_from_ident(ident: Ident, res: Res) -> TypoSuggestion { - Self { - candidate: ident.name, - span: Some(ident.span), - res, - target: SuggestionTarget::SingleItem, - } + pub(crate) fn single_item(candidate: Symbol, span: Span, res: Res) -> TypoSuggestion { + Self { candidate, span: Some(span), res, target: SuggestionTarget::SingleItem } } } @@ -212,7 +200,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { pub(crate) fn report_conflict( &mut self, - ident: Ident, + ident: IdentKey, ns: Namespace, old_binding: Decl<'ra>, new_binding: Decl<'ra>, @@ -324,10 +312,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // Check if the target of the use for both bindings is the same. let duplicate = new_binding.res().opt_def_id() == old_binding.res().opt_def_id(); let has_dummy_span = new_binding.span.is_dummy() || old_binding.span.is_dummy(); - let from_item = self - .extern_prelude - .get(&Macros20NormalizedIdent::new(ident)) - .is_none_or(|entry| entry.introduced_by_item()); + let from_item = + self.extern_prelude.get(&ident).is_none_or(|entry| entry.introduced_by_item()); // Only suggest removing an import if both bindings are to the same def, if both spans // aren't dummy spans. Further, if both bindings are imports, then the ident must have // been introduced by an item. @@ -531,10 +517,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { filter_fn: &impl Fn(Res) -> bool, ctxt: Option, ) { - module.for_each_child(self, |_this, ident, _ns, binding| { + module.for_each_child(self, |_this, ident, orig_ident_span, _ns, binding| { let res = binding.res(); - if filter_fn(res) && ctxt.is_none_or(|ctxt| ctxt == ident.span.ctxt()) { - names.push(TypoSuggestion::typo_from_ident(ident.0, res)); + if filter_fn(res) && ctxt.is_none_or(|ctxt| ctxt == *ident.ctxt) { + names.push(TypoSuggestion::new(ident.name, orig_ident_span, res)); } }); } @@ -1187,11 +1173,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let res = Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper); if filter_fn(res) { suggestions.extend( - this.helper_attrs - .get(&expn_id) - .into_iter() - .flatten() - .map(|(ident, _)| TypoSuggestion::typo_from_ident(ident.0, res)), + this.helper_attrs.get(&expn_id).into_iter().flatten().map( + |&(ident, orig_ident_span, _)| { + TypoSuggestion::new(ident.name, orig_ident_span, res) + }, + ), ); } } @@ -1202,8 +1188,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if let MacroRulesScope::Def(macro_rules_def) = macro_rules_scope.get() { let res = macro_rules_def.decl.res(); if filter_fn(res) { - suggestions - .push(TypoSuggestion::typo_from_ident(macro_rules_def.ident.0, res)) + suggestions.push(TypoSuggestion::new( + macro_rules_def.ident.name, + macro_rules_def.orig_ident_span, + res, + )) } } } @@ -1233,9 +1222,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { } Scope::ExternPreludeItems => { // Add idents from both item and flag scopes. - suggestions.extend(this.extern_prelude.keys().filter_map(|ident| { + suggestions.extend(this.extern_prelude.iter().filter_map(|(ident, entry)| { let res = Res::Def(DefKind::Mod, CRATE_DEF_ID.to_def_id()); - filter_fn(res).then_some(TypoSuggestion::typo_from_ident(ident.0, res)) + filter_fn(res).then_some(TypoSuggestion::new(ident.name, entry.span(), res)) })); } Scope::ExternPreludeFlags => {} @@ -1244,7 +1233,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { suggestions.extend( this.registered_tools .iter() - .map(|ident| TypoSuggestion::typo_from_ident(*ident, res)), + .map(|ident| TypoSuggestion::new(ident.name, ident.span, res)), ); } Scope::StdLibPrelude => { @@ -1329,7 +1318,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { } { let in_module_is_extern = !in_module.def_id().is_local(); - in_module.for_each_child(self, |this, ident, ns, name_binding| { + in_module.for_each_child(self, |this, ident, orig_ident_span, ns, name_binding| { // Avoid non-importable candidates. if name_binding.is_assoc_item() && !this.tcx.features().import_trait_associated_functions() @@ -1382,7 +1371,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if ident.name == lookup_ident.name && ns == namespace && in_module != parent_scope.module - && !ident.span.normalize_to_macros_2_0().from_expansion() + && ident.ctxt.is_root() && filter_fn(res) { // create the path @@ -1395,7 +1384,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { }; segms.append(&mut path_segments.clone()); - segms.push(ast::PathSegment::from_ident(ident.0)); + segms.push(ast::PathSegment::from_ident(ident.orig(orig_ident_span))); let path = Path { span: name_binding.span, segments: segms, tokens: None }; if child_accessible @@ -1468,7 +1457,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if let Some(def_id) = name_binding.res().module_like_def_id() { // form the path let mut path_segments = path_segments.clone(); - path_segments.push(ast::PathSegment::from_ident(ident.0)); + path_segments.push(ast::PathSegment::from_ident(ident.orig(orig_ident_span))); let alias_import = if let DeclKind::Import { import, .. } = name_binding.kind && let ImportKind::ExternCrate { source: Some(_), .. } = import.kind @@ -1557,8 +1546,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { ); if lookup_ident.span.at_least_rust_2018() { - for &ident in self.extern_prelude.keys() { - if ident.span.from_expansion() { + for (ident, entry) in &self.extern_prelude { + if entry.span().from_expansion() { // Idents are adjusted to the root context before being // resolved in the extern prelude, so reporting this to the // user is no help. This skips the injected @@ -1582,7 +1571,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { self.resolutions(parent_scope.module).borrow().iter().any( |(key, name_resolution)| { if key.ns == TypeNS - && key.ident == ident + && key.ident == *ident && let Some(decl) = name_resolution.borrow().best_decl() { match decl.res() { @@ -1601,7 +1590,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if needs_disambiguation { crate_path.push(ast::PathSegment::path_root(rustc_span::DUMMY_SP)); } - crate_path.push(ast::PathSegment::from_ident(ident.0)); + crate_path.push(ast::PathSegment::from_ident(ident.orig(entry.span()))); suggestions.extend(self.lookup_import_candidates_from_module( lookup_ident, @@ -1777,7 +1766,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { return; } - if self.macro_names.contains(&ident.normalize_to_macros_2_0()) { + if self.macro_names.contains(&IdentKey::new(ident)) { err.subdiagnostic(AddedMacroUse); return; } @@ -2007,8 +1996,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { matches!(scope2, Scope::ExternPreludeFlags) && self .extern_prelude - .get(&Macros20NormalizedIdent::new(ident)) - .is_some_and(|entry| entry.item_decl.map(|(b, _)| b) == Some(b1)) + .get(&IdentKey::new(ident)) + .is_some_and(|entry| entry.item_decl.map(|(b, ..)| b) == Some(b1)) }; let (b1, b2, scope1, scope2, swapped) = if b2.span.is_dummy() && !b1.span.is_dummy() { // We have to print the span-less alternative first, otherwise formatting looks bad. @@ -2914,7 +2903,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { return None; } - let binding_key = BindingKey::new(Macros20NormalizedIdent::new(ident), MacroNS); + let binding_key = BindingKey::new(IdentKey::new(ident), MacroNS); let binding = self.resolution(crate_module, binding_key)?.binding()?; let Res::Def(DefKind::Macro(kinds), _) = binding.res() else { return None; diff --git a/compiler/rustc_resolve/src/errors.rs b/compiler/rustc_resolve/src/errors.rs index d614219e8eabf..205f2c6aa5395 100644 --- a/compiler/rustc_resolve/src/errors.rs +++ b/compiler/rustc_resolve/src/errors.rs @@ -601,7 +601,7 @@ pub(crate) struct ProcMacroDeriveResolutionFallback { #[label] pub span: Span, pub ns_descr: &'static str, - pub ident: Ident, + pub ident: Symbol, } #[derive(LintDiagnostic)] @@ -1151,7 +1151,7 @@ pub(crate) struct CannotUseThroughAnImport { pub(crate) struct NameReservedInAttributeNamespace { #[primary_span] pub(crate) span: Span, - pub(crate) ident: Ident, + pub(crate) ident: Symbol, } #[derive(Diagnostic)] diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index 79d08828ccc4a..3ff3aa1f0f735 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -10,11 +10,12 @@ use rustc_session::lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK; use rustc_session::parse::feature_err; use rustc_span::edition::Edition; use rustc_span::hygiene::{ExpnId, ExpnKind, LocalExpnId, MacroKind, SyntaxContext}; -use rustc_span::{Ident, Macros20NormalizedIdent, Span, kw, sym}; +use rustc_span::{Ident, Span, kw, sym}; use smallvec::SmallVec; use tracing::{debug, instrument}; use crate::errors::{ParamKindInEnumDiscriminant, ParamKindInNonTrivialAnonConst}; +use crate::hygiene::Macros20NormalizedSyntaxContext; use crate::imports::{Import, NameResolution}; use crate::late::{ ConstantHasGenerics, DiagMetadata, NoConstantGenericsReason, PathSource, Rib, RibKind, @@ -22,7 +23,7 @@ use crate::late::{ use crate::macros::{MacroRulesScope, sub_namespace_match}; use crate::{ AmbiguityError, AmbiguityKind, AmbiguityWarning, BindingKey, CmResolver, Decl, DeclKind, - Determinacy, Finalize, ImportKind, LateDecl, Module, ModuleKind, ModuleOrUniformRoot, + Determinacy, Finalize, IdentKey, ImportKind, LateDecl, Module, ModuleKind, ModuleOrUniformRoot, ParentScope, PathResult, PrivacyError, Res, ResolutionError, Resolver, Scope, ScopeSet, Segment, Stage, Used, errors, }; @@ -61,7 +62,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { &mut CmResolver<'r, 'ra, 'tcx>, Scope<'ra>, UsePrelude, - Span, + Macros20NormalizedSyntaxContext, ) -> ControlFlow, ) -> Option { // General principles: @@ -127,7 +128,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { TypeNS | ValueNS => Scope::ModuleNonGlobs(module, None), MacroNS => Scope::DeriveHelpers(parent_scope.expansion), }; - let mut ctxt = orig_ctxt.normalize_to_macros_2_0(); + let mut ctxt = Macros20NormalizedSyntaxContext::new(orig_ctxt.ctxt()); let mut use_prelude = !module.no_implicit_prelude; loop { @@ -198,7 +199,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { Scope::ModuleGlobs(..) if module_only => break, Scope::ModuleGlobs(..) if module_and_extern_prelude => match ns { TypeNS => { - ctxt.adjust(ExpnId::root()); + ctxt.update_unchecked(|ctxt| ctxt.adjust(ExpnId::root())); Scope::ExternPreludeItems } ValueNS | MacroNS => break, @@ -210,7 +211,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { Scope::ModuleNonGlobs(parent_module, lint_id.or(prev_lint_id)) } None => { - ctxt.adjust(ExpnId::root()); + ctxt.update_unchecked(|ctxt| ctxt.adjust(ExpnId::root())); match ns { TypeNS => Scope::ExternPreludeItems, ValueNS => Scope::StdLibPrelude, @@ -240,12 +241,12 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn hygienic_lexical_parent( &self, module: Module<'ra>, - span: &mut Span, + ctxt: &mut Macros20NormalizedSyntaxContext, derive_fallback_lint_id: Option, ) -> Option<(Module<'ra>, Option)> { - let ctxt = span.ctxt(); - if !module.expansion.outer_expn_is_descendant_of(ctxt) { - return Some((self.expn_def_scope(span.remove_mark()), None)); + if !module.expansion.outer_expn_is_descendant_of(**ctxt) { + let expn_id = ctxt.update_unchecked(|ctxt| ctxt.remove_mark()); + return Some((self.expn_def_scope(expn_id), None)); } if let ModuleKind::Block = module.kind { @@ -275,7 +276,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let ext = &self.get_macro_by_def_id(def_id).ext; if ext.builtin_name.is_none() && ext.macro_kinds() == MacroKinds::DERIVE - && parent.expansion.outer_expn_is_descendant_of(ctxt) + && parent.expansion.outer_expn_is_descendant_of(**ctxt) { return Some((parent, derive_fallback_lint_id)); } @@ -439,11 +440,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { orig_ident.span, derive_fallback_lint_id, |this, scope, use_prelude, ctxt| { - let ident = Ident::new(orig_ident.name, ctxt); - // The passed `ctxt` is already normalized, so avoid expensive double normalization. - let ident = Macros20NormalizedIdent(ident); + let ident = IdentKey { name: orig_ident.name, ctxt }; let res = match this.reborrow().resolve_ident_in_scope( ident, + orig_ident.span, ns, scope, use_prelude, @@ -515,7 +515,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn resolve_ident_in_scope<'r>( mut self: CmResolver<'r, 'ra, 'tcx>, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, ns: Namespace, scope: Scope<'ra>, use_prelude: UsePrelude, @@ -531,7 +532,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if let Some(decl) = self .helper_attrs .get(&expn_id) - .and_then(|attrs| attrs.iter().rfind(|(i, _)| ident == *i).map(|(_, d)| *d)) + .and_then(|attrs| attrs.iter().rfind(|(i, ..)| ident == *i).map(|(.., d)| *d)) { Ok(decl) } else { @@ -587,6 +588,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let decl = self.reborrow().resolve_ident_in_module_non_globs_unadjusted( module, ident, + orig_ident_span, ns, adjusted_parent_scope, if matches!(scope_set, ScopeSet::Module(..)) { @@ -604,11 +606,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { self.get_mut().lint_buffer.buffer_lint( PROC_MACRO_DERIVE_RESOLUTION_FALLBACK, lint_id, - ident.span, + orig_ident_span, errors::ProcMacroDeriveResolutionFallback { - span: ident.span, + span: orig_ident_span, ns_descr: ns.descr(), - ident: ident.0, + ident: ident.name, }, ); } @@ -637,6 +639,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let binding = self.reborrow().resolve_ident_in_module_globs_unadjusted( module, ident, + orig_ident_span, ns, adjusted_parent_scope, if matches!(scope_set, ScopeSet::Module(..)) { @@ -654,11 +657,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { self.get_mut().lint_buffer.buffer_lint( PROC_MACRO_DERIVE_RESOLUTION_FALLBACK, lint_id, - ident.span, + orig_ident_span, errors::ProcMacroDeriveResolutionFallback { - span: ident.span, + span: orig_ident_span, ns_descr: ns.descr(), - ident: ident.0, + ident: ident.name, }, ); } @@ -683,7 +686,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { None => Err(Determinacy::Determined), }, Scope::ExternPreludeItems => { - match self.reborrow().extern_prelude_get_item(ident, finalize.is_some()) { + match self.reborrow().extern_prelude_get_item( + ident, + orig_ident_span, + finalize.is_some(), + ) { Some(decl) => Ok(decl), None => Err(Determinacy::determined( self.graph_root.unexpanded_invocations.borrow().is_empty(), @@ -691,7 +698,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { } } Scope::ExternPreludeFlags => { - match self.extern_prelude_get_flag(ident, finalize.is_some()) { + match self.extern_prelude_get_flag(ident, orig_ident_span, finalize.is_some()) { Some(decl) => Ok(decl), None => Err(Determinacy::Determined), } @@ -704,7 +711,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let mut result = Err(Determinacy::Determined); if let Some(prelude) = self.prelude && let Ok(decl) = self.reborrow().resolve_ident_in_scope_set( - ident.0, + ident.orig(orig_ident_span.with_ctxt(*ident.ctxt)), ScopeSet::Module(ns, prelude), parent_scope, None, @@ -723,26 +730,26 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { Some(decl) => { if matches!(ident.name, sym::f16) && !self.tcx.features().f16() - && !ident.span.allows_unstable(sym::f16) + && !orig_ident_span.allows_unstable(sym::f16) && finalize.is_some() { feature_err( self.tcx.sess, sym::f16, - ident.span, + orig_ident_span, "the type `f16` is unstable", ) .emit(); } if matches!(ident.name, sym::f128) && !self.tcx.features().f128() - && !ident.span.allows_unstable(sym::f128) + && !orig_ident_span.allows_unstable(sym::f128) && finalize.is_some() { feature_err( self.tcx.sess, sym::f128, - ident.span, + orig_ident_span, "the type `f128` is unstable", ) .emit(); @@ -1001,7 +1008,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn resolve_ident_in_module_non_globs_unadjusted<'r>( mut self: CmResolver<'r, 'ra, 'tcx>, module: Module<'ra>, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, ns: Namespace, parent_scope: &ParentScope<'ra>, shadowing: Shadowing, @@ -1016,7 +1024,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // doesn't need to be mutable. It will fail when there is a cycle of imports, and without // the exclusive access infinite recursion will crash the compiler with stack overflow. let resolution = &*self - .resolution_or_default(module, key) + .resolution_or_default(module, key, orig_ident_span) .try_borrow_mut_unchecked() .map_err(|_| ControlFlow::Continue(Determined))?; @@ -1024,7 +1032,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if let Some(finalize) = finalize { return self.get_mut().finalize_module_binding( - ident.0, + ident, + orig_ident_span, binding, parent_scope, module, @@ -1064,7 +1073,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn resolve_ident_in_module_globs_unadjusted<'r>( mut self: CmResolver<'r, 'ra, 'tcx>, module: Module<'ra>, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, ns: Namespace, parent_scope: &ParentScope<'ra>, shadowing: Shadowing, @@ -1077,7 +1087,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // doesn't need to be mutable. It will fail when there is a cycle of imports, and without // the exclusive access infinite recursion will crash the compiler with stack overflow. let resolution = &*self - .resolution_or_default(module, key) + .resolution_or_default(module, key, orig_ident_span) .try_borrow_mut_unchecked() .map_err(|_| ControlFlow::Continue(Determined))?; @@ -1085,7 +1095,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if let Some(finalize) = finalize { return self.get_mut().finalize_module_binding( - ident.0, + ident, + orig_ident_span, binding, parent_scope, module, @@ -1154,8 +1165,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { None => return Err(ControlFlow::Continue(Undetermined)), }; let tmp_parent_scope; - let (mut adjusted_parent_scope, mut ident) = (parent_scope, ident); - match ident.0.span.glob_adjust(module.expansion, glob_import.span) { + let (mut adjusted_parent_scope, mut ctxt) = (parent_scope, *ident.ctxt); + match ctxt.glob_adjust(module.expansion, glob_import.span) { Some(Some(def)) => { tmp_parent_scope = ParentScope { module: self.expn_def_scope(def), ..*parent_scope }; @@ -1165,7 +1176,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { None => continue, }; let result = self.reborrow().resolve_ident_in_scope_set( - ident.0, + ident.orig(orig_ident_span.with_ctxt(ctxt)), ScopeSet::Module(ns, module), adjusted_parent_scope, None, @@ -1191,7 +1202,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn finalize_module_binding( &mut self, - ident: Ident, + ident: IdentKey, + orig_ident_span: Span, binding: Option>, parent_scope: &ParentScope<'ra>, module: Module<'ra>, @@ -1204,6 +1216,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { return Err(ControlFlow::Continue(Determined)); }; + let ident = ident.orig(orig_ident_span); if !self.is_accessible_from(binding.vis(), parent_scope.module) { if report_private { self.privacy_errors.push(PrivacyError { diff --git a/compiler/rustc_resolve/src/imports.rs b/compiler/rustc_resolve/src/imports.rs index 016fc407daabe..1d45973fc47b2 100644 --- a/compiler/rustc_resolve/src/imports.rs +++ b/compiler/rustc_resolve/src/imports.rs @@ -20,7 +20,7 @@ use rustc_session::lint::builtin::{ use rustc_session::parse::feature_err; use rustc_span::edit_distance::find_best_match_for_name; use rustc_span::hygiene::LocalExpnId; -use rustc_span::{Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym}; +use rustc_span::{Ident, Span, Symbol, kw, sym}; use tracing::debug; use crate::Namespace::{self, *}; @@ -33,8 +33,8 @@ use crate::errors::{ use crate::ref_mut::CmCell; use crate::{ AmbiguityError, BindingKey, CmResolver, Decl, DeclData, DeclKind, Determinacy, Finalize, - ImportSuggestion, Module, ModuleOrUniformRoot, ParentScope, PathResult, PerNS, ResolutionError, - Resolver, ScopeSet, Segment, Used, module_to_string, names_to_string, + IdentKey, ImportSuggestion, Module, ModuleOrUniformRoot, ParentScope, PathResult, PerNS, + ResolutionError, Resolver, ScopeSet, Segment, Used, module_to_string, names_to_string, }; type Res = def::Res; @@ -239,18 +239,23 @@ impl<'ra> ImportData<'ra> { } /// Records information about the resolution of a name in a namespace of a module. -#[derive(Clone, Default, Debug)] +#[derive(Clone, Debug)] pub(crate) struct NameResolution<'ra> { /// Single imports that may define the name in the namespace. /// Imports are arena-allocated, so it's ok to use pointers as keys. pub single_imports: FxIndexSet>, /// The non-glob declaration for this name, if it is known to exist. - pub non_glob_decl: Option>, + pub non_glob_decl: Option> = None, /// The glob declaration for this name, if it is known to exist. - pub glob_decl: Option>, + pub glob_decl: Option> = None, + pub orig_ident_span: Span, } impl<'ra> NameResolution<'ra> { + pub(crate) fn new(orig_ident_span: Span) -> Self { + NameResolution { single_imports: FxIndexSet::default(), orig_ident_span, .. } + } + /// Returns the binding for the name if it is known or None if it not known. pub(crate) fn binding(&self) -> Option> { self.best_decl().and_then(|binding| { @@ -417,14 +422,15 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { /// and return existing declaration if there is a collision. pub(crate) fn try_plant_decl_into_local_module( &mut self, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, ns: Namespace, decl: Decl<'ra>, warn_ambiguity: bool, ) -> Result<(), Decl<'ra>> { let module = decl.parent_module.unwrap(); let res = decl.res(); - self.check_reserved_macro_name(ident.0, res); + self.check_reserved_macro_name(ident.name, orig_ident_span, res); // Even if underscore names cannot be looked up, we still need to add them to modules, // because they can be fetched by glob imports from those modules, and bring traits // into scope both directly and through glob imports. @@ -432,46 +438,52 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { module.underscore_disambiguator.update_unchecked(|d| d + 1); module.underscore_disambiguator.get() }); - self.update_local_resolution(module, key, warn_ambiguity, |this, resolution| { - if let Some(old_decl) = resolution.best_decl() { - assert_ne!(decl, old_decl); - assert!(!decl.warn_ambiguity.get()); - if res == Res::Err && old_decl.res() != Res::Err { - // Do not override real declarations with `Res::Err`s from error recovery. - return Ok(()); - } - match (old_decl.is_glob_import(), decl.is_glob_import()) { - (true, true) => { - resolution.glob_decl = - Some(this.select_glob_decl(old_decl, decl, warn_ambiguity)); + self.update_local_resolution( + module, + key, + orig_ident_span, + warn_ambiguity, + |this, resolution| { + if let Some(old_decl) = resolution.best_decl() { + assert_ne!(decl, old_decl); + assert!(!decl.warn_ambiguity.get()); + if res == Res::Err && old_decl.res() != Res::Err { + // Do not override real declarations with `Res::Err`s from error recovery. + return Ok(()); } - (old_glob @ true, false) | (old_glob @ false, true) => { - let (glob_decl, non_glob_decl) = - if old_glob { (old_decl, decl) } else { (decl, old_decl) }; - resolution.non_glob_decl = Some(non_glob_decl); - if let Some(old_glob_decl) = resolution.glob_decl - && old_glob_decl != glob_decl - { + match (old_decl.is_glob_import(), decl.is_glob_import()) { + (true, true) => { resolution.glob_decl = - Some(this.select_glob_decl(old_glob_decl, glob_decl, false)); - } else { - resolution.glob_decl = Some(glob_decl); + Some(this.select_glob_decl(old_decl, decl, warn_ambiguity)); + } + (old_glob @ true, false) | (old_glob @ false, true) => { + let (glob_decl, non_glob_decl) = + if old_glob { (old_decl, decl) } else { (decl, old_decl) }; + resolution.non_glob_decl = Some(non_glob_decl); + if let Some(old_glob_decl) = resolution.glob_decl + && old_glob_decl != glob_decl + { + resolution.glob_decl = + Some(this.select_glob_decl(old_glob_decl, glob_decl, false)); + } else { + resolution.glob_decl = Some(glob_decl); + } + } + (false, false) => { + return Err(old_decl); } } - (false, false) => { - return Err(old_decl); - } - } - } else { - if decl.is_glob_import() { - resolution.glob_decl = Some(decl); } else { - resolution.non_glob_decl = Some(decl); + if decl.is_glob_import() { + resolution.glob_decl = Some(decl); + } else { + resolution.non_glob_decl = Some(decl); + } } - } - Ok(()) - }) + Ok(()) + }, + ) } // Use `f` to mutate the resolution of the name in the module. @@ -480,6 +492,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { &mut self, module: Module<'ra>, key: BindingKey, + orig_ident_span: Span, warn_ambiguity: bool, f: F, ) -> T @@ -489,7 +502,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // Ensure that `resolution` isn't borrowed when defining in the module's glob importers, // during which the resolution might end up getting re-defined via a glob cycle. let (binding, t, warn_ambiguity) = { - let resolution = &mut *self.resolution_or_default(module, key).borrow_mut_unchecked(); + let resolution = &mut *self + .resolution_or_default(module, key, orig_ident_span) + .borrow_mut_unchecked(); let old_decl = resolution.binding(); let t = f(self, resolution); @@ -510,7 +525,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // Define or update `binding` in `module`s glob importers. for import in glob_importers.iter() { let mut ident = key.ident; - let scope = match ident.0.span.reverse_glob_adjust(module.expansion, import.span) { + let scope = match ident + .ctxt + .update_unchecked(|ctxt| ctxt.reverse_glob_adjust(module.expansion, import.span)) + { Some(Some(def)) => self.expn_def_scope(def), Some(None) => import.parent_scope.module, None => continue, @@ -519,6 +537,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let import_decl = self.new_import_decl(binding, *import); let _ = self.try_plant_decl_into_local_module( ident, + orig_ident_span, key.ns, import_decl, warn_ambiguity, @@ -540,14 +559,26 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let dummy_decl = self.new_import_decl(dummy_decl, import); self.per_ns(|this, ns| { let module = import.parent_scope.module; - let ident = Macros20NormalizedIdent::new(target); - let _ = this.try_plant_decl_into_local_module(ident, ns, dummy_decl, false); + let ident = IdentKey::new(target); + let _ = this.try_plant_decl_into_local_module( + ident, + target.span, + ns, + dummy_decl, + false, + ); // Don't remove underscores from `single_imports`, they were never added. if target.name != kw::Underscore { let key = BindingKey::new(ident, ns); - this.update_local_resolution(module, key, false, |_, resolution| { - resolution.single_imports.swap_remove(&import); - }) + this.update_local_resolution( + module, + key, + target.span, + false, + |_, resolution| { + resolution.single_imports.swap_remove(&import); + }, + ) } }); self.record_use(target, dummy_decl, Used::Other); @@ -687,7 +718,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { import.root_id, import.root_span, BuiltinLintDiag::AmbiguousGlobReexports { - name: key.ident.to_string(), + name: key.ident.name.to_string(), namespace: key.ns.descr().to_string(), first_reexport_span: import.root_span, duplicate_reexport_span: amb_binding.span, @@ -922,7 +953,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // We need the `target`, `source` can be extracted. let import_decl = this.new_import_decl(binding, import); this.get_mut_unchecked().plant_decl_into_local_module( - Macros20NormalizedIdent::new(target), + IdentKey::new(target), + target.span, ns, import_decl, ); @@ -931,10 +963,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { Err(Determinacy::Determined) => { // Don't remove underscores from `single_imports`, they were never added. if target.name != kw::Underscore { - let key = BindingKey::new(Macros20NormalizedIdent::new(target), ns); + let key = BindingKey::new(IdentKey::new(target), ns); this.get_mut_unchecked().update_local_resolution( parent, key, + target.span, false, |_, resolution| { resolution.single_imports.swap_remove(&import); @@ -1531,15 +1564,19 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { .borrow() .iter() .filter_map(|(key, resolution)| { - resolution.borrow().binding().map(|binding| (*key, binding)) + let resolution = resolution.borrow(); + resolution.binding().map(|binding| (*key, binding, resolution.orig_ident_span)) }) .collect::>(); - for (mut key, binding) in bindings { - let scope = match key.ident.0.span.reverse_glob_adjust(module.expansion, import.span) { - Some(Some(def)) => self.expn_def_scope(def), - Some(None) => import.parent_scope.module, - None => continue, - }; + for (mut key, binding, orig_ident_span) in bindings { + let scope = + match key.ident.ctxt.update_unchecked(|ctxt| { + ctxt.reverse_glob_adjust(module.expansion, import.span) + }) { + Some(Some(def)) => self.expn_def_scope(def), + Some(None) => import.parent_scope.module, + None => continue, + }; if self.is_accessible_from(binding.vis(), scope) { let import_decl = self.new_import_decl(binding, import); let warn_ambiguity = self @@ -1548,6 +1585,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { .is_some_and(|binding| binding.warn_ambiguity_recursive()); let _ = self.try_plant_decl_into_local_module( key.ident, + orig_ident_span, key.ns, import_decl, warn_ambiguity, @@ -1575,19 +1613,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let mut children = Vec::new(); let mut ambig_children = Vec::new(); - module.for_each_child(self, |this, ident, _, binding| { + module.for_each_child(self, |this, ident, orig_ident_span, _, binding| { let res = binding.res().expect_non_local(); if res != def::Res::Err { - let child = |reexport_chain| ModChild { - ident: ident.0, - res, - vis: binding.vis(), - reexport_chain, - }; + let ident = ident.orig(orig_ident_span); + let child = + |reexport_chain| ModChild { ident, res, vis: binding.vis(), reexport_chain }; if let Some((ambig_binding1, ambig_binding2)) = binding.descent_to_ambiguity() { let main = child(ambig_binding1.reexport_chain(this)); let second = ModChild { - ident: ident.0, + ident, res: ambig_binding2.res().expect_non_local(), vis: ambig_binding2.vis(), reexport_chain: ambig_binding2.reexport_chain(this), diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 963bee369f6b8..fbd4d41a2f37c 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -37,15 +37,15 @@ use rustc_session::config::{CrateType, ResolveDocLinks}; use rustc_session::lint; use rustc_session::parse::feature_err; use rustc_span::source_map::{Spanned, respan}; -use rustc_span::{BytePos, DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym}; +use rustc_span::{BytePos, DUMMY_SP, Ident, Span, Symbol, kw, sym}; use smallvec::{SmallVec, smallvec}; use thin_vec::ThinVec; use tracing::{debug, instrument, trace}; use crate::{ - BindingError, BindingKey, Decl, Finalize, LateDecl, Module, ModuleOrUniformRoot, ParentScope, - PathResult, ResolutionError, Resolver, Segment, Stage, TyCtxt, UseError, Used, errors, - path_names_to_string, rustdoc, + BindingError, BindingKey, Decl, Finalize, IdentKey, LateDecl, Module, ModuleOrUniformRoot, + ParentScope, PathResult, ResolutionError, Resolver, Segment, Stage, TyCtxt, UseError, Used, + errors, path_names_to_string, rustdoc, }; mod diagnostics; @@ -3641,7 +3641,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { return; }; ident.span.normalize_to_macros_2_0_and_adjust(module.expansion); - let key = BindingKey::new(Macros20NormalizedIdent::new(ident), ns); + let key = BindingKey::new(IdentKey::new(ident), ns); let mut decl = self.r.resolution(module, key).and_then(|r| r.best_decl()); debug!(?decl); if decl.is_none() { @@ -3652,7 +3652,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { TypeNS => ValueNS, _ => ns, }; - let key = BindingKey::new(Macros20NormalizedIdent::new(ident), ns); + let key = BindingKey::new(IdentKey::new(ident), ns); decl = self.r.resolution(module, key).and_then(|r| r.best_decl()); debug!(?decl); } diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index c5d15dcc91af9..a3ee17ec4a9ac 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -1620,22 +1620,24 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { if let PathResult::Module(ModuleOrUniformRoot::Module(module)) = self.resolve_path(mod_path, None, None, *source) { - let targets: Vec<_> = - self.r - .resolutions(module) - .borrow() - .iter() - .filter_map(|(key, resolution)| { - resolution.borrow().best_decl().map(|binding| binding.res()).and_then( - |res| if filter_fn(res) { Some((*key, res)) } else { None }, - ) + let targets: Vec<_> = self + .r + .resolutions(module) + .borrow() + .iter() + .filter_map(|(key, resolution)| { + let resolution = resolution.borrow(); + resolution.best_decl().map(|binding| binding.res()).and_then(|res| { + if filter_fn(res) { + Some((key.ident.name, resolution.orig_ident_span, res)) + } else { + None + } }) - .collect(); - if let [target] = targets.as_slice() { - return Some(TypoSuggestion::single_item_from_ident( - target.0.ident.0, - target.1, - )); + }) + .collect(); + if let &[(name, orig_ident_span, res)] = targets.as_slice() { + return Some(TypoSuggestion::single_item(name, orig_ident_span, res)); } } } @@ -2662,7 +2664,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { // Locals and type parameters for (ident, &res) in &rib.bindings { if filter_fn(res) && ident.span.ctxt() == rib_ctxt { - names.push(TypoSuggestion::typo_from_ident(*ident, res)); + names.push(TypoSuggestion::new(ident.name, ident.span, res)); } } @@ -2824,7 +2826,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { break; } - in_module.for_each_child(self.r, |r, ident, _, name_binding| { + in_module.for_each_child(self.r, |r, ident, orig_ident_span, _, name_binding| { // abort if the module is already found or if name_binding is private external if result.is_some() || !name_binding.vis().is_visible_locally() { return; @@ -2832,7 +2834,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { if let Some(module_def_id) = name_binding.res().module_like_def_id() { // form the path let mut path_segments = path_segments.clone(); - path_segments.push(ast::PathSegment::from_ident(ident.0)); + path_segments.push(ast::PathSegment::from_ident(ident.orig(orig_ident_span))); let doc_visible = doc_visible && (module_def_id.is_local() || !r.tcx.is_doc_hidden(module_def_id)); if module_def_id == def_id { @@ -2868,10 +2870,10 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { fn collect_enum_ctors(&self, def_id: DefId) -> Option> { self.find_module(def_id).map(|(enum_module, enum_import_suggestion)| { let mut variants = Vec::new(); - enum_module.for_each_child(self.r, |_, ident, _, name_binding| { + enum_module.for_each_child(self.r, |_, ident, orig_ident_span, _, name_binding| { if let Res::Def(DefKind::Ctor(CtorOf::Variant, kind), def_id) = name_binding.res() { let mut segms = enum_import_suggestion.path.segments.clone(); - segms.push(ast::PathSegment::from_ident(ident.0)); + segms.push(ast::PathSegment::from_ident(ident.orig(orig_ident_span))); let path = Path { span: name_binding.span, segments: segms, tokens: None }; variants.push((path, def_id, kind)); } diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index 52b016b6bdca2..4e32deddf1269 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -33,6 +33,7 @@ use std::sync::Arc; use diagnostics::{ImportSuggestion, LabelSuggestion, Suggestion}; use effective_visibilities::EffectiveVisibilitiesVisitor; use errors::{ParamKindInEnumDiscriminant, ParamKindInNonTrivialAnonConst}; +use hygiene::Macros20NormalizedSyntaxContext; use imports::{Import, ImportData, ImportKind, NameResolution, PendingDecl}; use late::{ ForwardGenericParamBanReason, HasGenericParams, PathSource, PatternSource, @@ -75,7 +76,7 @@ use rustc_query_system::ich::StableHashingContext; use rustc_session::config::CrateType; use rustc_session::lint::builtin::PRIVATE_MACRO_USE; use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind, SyntaxContext, Transparency}; -use rustc_span::{DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym}; +use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym}; use smallvec::{SmallVec, smallvec}; use tracing::debug; @@ -552,6 +553,33 @@ impl ModuleKind { } } +/// Combination of a symbol and its macros 2.0 normalized hygiene context. +/// Used as a key in all kinds of name containers, including modules (as a part of slightly larger +/// `BindingKey`) and preludes. +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] +struct IdentKey { + name: Symbol, + ctxt: Macros20NormalizedSyntaxContext, +} + +impl IdentKey { + #[inline] + fn new(ident: Ident) -> IdentKey { + IdentKey { name: ident.name, ctxt: Macros20NormalizedSyntaxContext::new(ident.span.ctxt()) } + } + + #[inline] + fn with_root_ctxt(name: Symbol) -> Self { + let ctxt = Macros20NormalizedSyntaxContext::new_unchecked(SyntaxContext::root()); + IdentKey { name, ctxt } + } + + #[inline] + fn orig(self, orig_ident_span: Span) -> Ident { + Ident::new(self.name, orig_ident_span) + } +} + /// A key that identifies a binding in a given `Module`. /// /// Multiple bindings in the same module can have the same key (in a valid @@ -560,7 +588,7 @@ impl ModuleKind { struct BindingKey { /// The identifier for the binding, always the `normalize_to_macros_2_0` version of the /// identifier. - ident: Macros20NormalizedIdent, + ident: IdentKey, ns: Namespace, /// When we add an underscore binding (with ident `_`) to some module, this field has /// a non-zero value that uniquely identifies this binding in that module. @@ -571,12 +599,12 @@ struct BindingKey { } impl BindingKey { - fn new(ident: Macros20NormalizedIdent, ns: Namespace) -> Self { + fn new(ident: IdentKey, ns: Namespace) -> Self { BindingKey { ident, ns, disambiguator: 0 } } fn new_disambiguated( - ident: Macros20NormalizedIdent, + ident: IdentKey, ns: Namespace, disambiguator: impl FnOnce() -> u32, ) -> BindingKey { @@ -623,16 +651,7 @@ struct ModuleData<'ra> { /// Used to memoize the traits in this module for faster searches through all traits in scope. traits: CmRefCell< - Option< - Box< - [( - Macros20NormalizedIdent, - Decl<'ra>, - Option>, - bool, /* lint ambiguous */ - )], - >, - >, + Option, Option>, bool /* lint ambiguous */)]>>, >, /// Span of the module itself. Used for error reporting. @@ -699,11 +718,12 @@ impl<'ra> Module<'ra> { fn for_each_child<'tcx, R: AsRef>>( self, resolver: &R, - mut f: impl FnMut(&R, Macros20NormalizedIdent, Namespace, Decl<'ra>), + mut f: impl FnMut(&R, IdentKey, Span, Namespace, Decl<'ra>), ) { for (key, name_resolution) in resolver.as_ref().resolutions(self).borrow().iter() { - if let Some(decl) = name_resolution.borrow().best_decl() { - f(resolver, key.ident, key.ns, decl); + let name_resolution = name_resolution.borrow(); + if let Some(decl) = name_resolution.best_decl() { + f(resolver, key.ident, name_resolution.orig_ident_span, key.ns, decl); } } } @@ -711,11 +731,12 @@ impl<'ra> Module<'ra> { fn for_each_child_mut<'tcx, R: AsMut>>( self, resolver: &mut R, - mut f: impl FnMut(&mut R, Macros20NormalizedIdent, Namespace, Decl<'ra>), + mut f: impl FnMut(&mut R, IdentKey, Span, Namespace, Decl<'ra>), ) { for (key, name_resolution) in resolver.as_mut().resolutions(self).borrow().iter() { - if let Some(decl) = name_resolution.borrow().best_decl() { - f(resolver, key.ident, key.ns, decl); + let name_resolution = name_resolution.borrow(); + if let Some(decl) = name_resolution.best_decl() { + f(resolver, key.ident, name_resolution.orig_ident_span, key.ns, decl); } } } @@ -725,13 +746,13 @@ impl<'ra> Module<'ra> { let mut traits = self.traits.borrow_mut(resolver.as_ref()); if traits.is_none() { let mut collected_traits = Vec::new(); - self.for_each_child(resolver, |r, name, ns, binding| { + self.for_each_child(resolver, |r, ident, _, ns, binding| { if ns != TypeNS { return; } if let Res::Def(DefKind::Trait | DefKind::TraitAlias, def_id) = binding.res() { collected_traits.push(( - name, + ident.name, binding, r.as_ref().get_module(def_id), binding.is_ambiguity_recursive(), @@ -1081,14 +1102,14 @@ struct ExternPreludeEntry<'ra> { /// Name declaration from an `extern crate` item. /// The boolean flag is true is `item_decl` is non-redundant, happens either when /// `flag_decl` is `None`, or when `extern crate` introducing `item_decl` used renaming. - item_decl: Option<(Decl<'ra>, /* introduced by item */ bool)>, + item_decl: Option<(Decl<'ra>, Span, /* introduced by item */ bool)>, /// Name declaration from an `--extern` flag, lazily populated on first use. flag_decl: Option, /* finalized */ bool)>>, } impl ExternPreludeEntry<'_> { fn introduced_by_item(&self) -> bool { - matches!(self.item_decl, Some((_, true))) + matches!(self.item_decl, Some((.., true))) } fn flag() -> Self { @@ -1097,11 +1118,18 @@ impl ExternPreludeEntry<'_> { flag_decl: Some(CacheCell::new((PendingDecl::Pending, false))), } } + + fn span(&self) -> Span { + match self.item_decl { + Some((_, span, _)) => span, + None => DUMMY_SP, + } + } } struct DeriveData { resolutions: Vec, - helper_attrs: Vec<(usize, Macros20NormalizedIdent)>, + helper_attrs: Vec<(usize, IdentKey, Span)>, has_derive_copy: bool, } @@ -1137,7 +1165,7 @@ pub struct Resolver<'ra, 'tcx> { assert_speculative: bool, prelude: Option> = None, - extern_prelude: FxIndexMap>, + extern_prelude: FxIndexMap>, /// N.B., this is used only for better diagnostics, not name resolution itself. field_names: LocalDefIdMap> = Default::default(), @@ -1228,8 +1256,8 @@ pub struct Resolver<'ra, 'tcx> { dummy_decl: Decl<'ra>, builtin_type_decls: FxHashMap>, builtin_attr_decls: FxHashMap>, - registered_tool_decls: FxHashMap>, - macro_names: FxHashSet = default::fx_hash_set(), + registered_tool_decls: FxHashMap>, + macro_names: FxHashSet = default::fx_hash_set(), builtin_macros: FxHashMap = default::fx_hash_map(), registered_tools: &'tcx RegisteredTools, macro_use_prelude: FxIndexMap>, @@ -1265,7 +1293,7 @@ pub struct Resolver<'ra, 'tcx> { /// `macro_rules` scopes produced by `macro_rules` item definitions. macro_rules_scopes: FxHashMap> = default::fx_hash_map(), /// Helper attributes that are in scope for the given expansion. - helper_attrs: FxHashMap)>> = default::fx_hash_map(), + helper_attrs: FxHashMap)>> = default::fx_hash_map(), /// Ready or in-progress results of resolving paths inside the `#[derive(...)]` attribute /// with the given `ExpnId`. derive_data: FxHashMap = default::fx_hash_map(), @@ -1409,8 +1437,11 @@ impl<'ra> ResolverArenas<'ra> { fn alloc_import(&'ra self, import: ImportData<'ra>) -> Import<'ra> { Interned::new_unchecked(self.imports.alloc(import)) } - fn alloc_name_resolution(&'ra self) -> &'ra CmRefCell> { - self.name_resolutions.alloc(Default::default()) + fn alloc_name_resolution( + &'ra self, + orig_ident_span: Span, + ) -> &'ra CmRefCell> { + self.name_resolutions.alloc(CmRefCell::new(NameResolution::new(orig_ident_span))) } fn alloc_macro_rules_scope(&'ra self, scope: MacroRulesScope<'ra>) -> MacroRulesScopeRef<'ra> { self.dropless.alloc(CacheCell::new(scope)) @@ -1580,7 +1611,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { && let name = Symbol::intern(name) && name.can_be_raw() { - let ident = Macros20NormalizedIdent::with_dummy_span(name); + let ident = IdentKey::with_root_ctxt(name); Some((ident, ExternPreludeEntry::flag())) } else { None @@ -1589,10 +1620,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { .collect(); if !attr::contains_name(attrs, sym::no_core) { - let ident = Macros20NormalizedIdent::with_dummy_span(sym::core); + let ident = IdentKey::with_root_ctxt(sym::core); extern_prelude.insert(ident, ExternPreludeEntry::flag()); if !attr::contains_name(attrs, sym::no_std) { - let ident = Macros20NormalizedIdent::with_dummy_span(sym::std); + let ident = IdentKey::with_root_ctxt(sym::std); extern_prelude.insert(ident, ExternPreludeEntry::flag()); } } @@ -1637,10 +1668,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { .collect(), registered_tool_decls: registered_tools .iter() - .map(|ident| { + .map(|&ident| { let res = Res::ToolMod; let decl = arenas.new_pub_def_decl(res, ident.span, LocalExpnId::ROOT); - (*ident, decl) + (IdentKey::new(ident), decl) }) .collect(), registered_tools, @@ -1940,7 +1971,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { { if self.trait_may_have_item(trait_module, assoc_item) { let def_id = trait_binding.res().def_id(); - let import_ids = self.find_transitive_imports(&trait_binding.kind, trait_name.0); + let import_ids = self.find_transitive_imports(&trait_binding.kind, trait_name); found_traits.push(TraitCandidate { def_id, import_ids, lint_ambiguous }); } } @@ -1969,7 +2000,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn find_transitive_imports( &mut self, mut kind: &DeclKind<'_>, - trait_name: Ident, + trait_name: Symbol, ) -> SmallVec<[LocalDefId; 1]> { let mut import_ids = smallvec![]; while let DeclKind::Import { import, source_decl, .. } = kind { @@ -2004,11 +2035,12 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { &self, module: Module<'ra>, key: BindingKey, + orig_ident_span: Span, ) -> &'ra CmRefCell> { self.resolutions(module) .borrow_mut_unchecked() .entry(key) - .or_insert_with(|| self.arenas.alloc_name_resolution()) + .or_insert_with(|| self.arenas.alloc_name_resolution(orig_ident_span)) } /// Test if AmbiguityError ambi is any identical to any one inside ambiguity_errors @@ -2082,8 +2114,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { // Avoid marking `extern crate` items that refer to a name from extern prelude, // but not introduce it, as used if they are accessed from lexical scope. if used == Used::Scope - && let Some(entry) = self.extern_prelude.get(&Macros20NormalizedIdent::new(ident)) - && entry.item_decl == Some((used_decl, false)) + && let Some(entry) = self.extern_prelude.get(&IdentKey::new(ident)) + && let Some((item_decl, _, false)) = entry.item_decl + && item_decl == used_decl { return; } @@ -2094,7 +2127,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { if let Some(id) = import.id() { self.used_imports.insert(id); } - self.add_to_glob_map(import, ident); + self.add_to_glob_map(import, ident.name); self.record_use_inner( ident, source_decl, @@ -2105,10 +2138,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { } #[inline] - fn add_to_glob_map(&mut self, import: Import<'_>, ident: Ident) { + fn add_to_glob_map(&mut self, import: Import<'_>, name: Symbol) { if let ImportKind::Glob { id, .. } = import.kind { let def_id = self.local_def_id(id); - self.glob_map.entry(def_id).or_default().insert(ident.name); + self.glob_map.entry(def_id).or_default().insert(name); } } @@ -2230,13 +2263,14 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn extern_prelude_get_item<'r>( mut self: CmResolver<'r, 'ra, 'tcx>, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, finalize: bool, ) -> Option> { let entry = self.extern_prelude.get(&ident); - entry.and_then(|entry| entry.item_decl).map(|(decl, _)| { + entry.and_then(|entry| entry.item_decl).map(|(decl, ..)| { if finalize { - self.get_mut().record_use(ident.0, decl, Used::Scope); + self.get_mut().record_use(ident.orig(orig_ident_span), decl, Used::Scope); } decl }) @@ -2244,7 +2278,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { fn extern_prelude_get_flag( &self, - ident: Macros20NormalizedIdent, + ident: IdentKey, + orig_ident_span: Span, finalize: bool, ) -> Option> { let entry = self.extern_prelude.get(&ident); @@ -2253,14 +2288,18 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { let decl = match pending_decl { PendingDecl::Ready(decl) => { if finalize && !finalized { - self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span); + self.cstore_mut().process_path_extern( + self.tcx, + ident.name, + orig_ident_span, + ); } decl } PendingDecl::Pending => { debug_assert!(!finalized); let crate_id = if finalize { - self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span) + self.cstore_mut().process_path_extern(self.tcx, ident.name, orig_ident_span) } else { self.cstore_mut().maybe_process_path_extern(self.tcx, ident.name) }; @@ -2675,3 +2714,40 @@ mod ref_mut { } } } + +mod hygiene { + use rustc_span::SyntaxContext; + + /// An newtype around `SyntaxContext` that can only keep contexts produced by + /// [SyntaxContext::normalize_to_macros_2_0]. + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] + pub(crate) struct Macros20NormalizedSyntaxContext(SyntaxContext); + + impl Macros20NormalizedSyntaxContext { + #[inline] + pub(crate) fn new(ctxt: SyntaxContext) -> Macros20NormalizedSyntaxContext { + Macros20NormalizedSyntaxContext(ctxt.normalize_to_macros_2_0()) + } + + #[inline] + pub(crate) fn new_unchecked(ctxt: SyntaxContext) -> Macros20NormalizedSyntaxContext { + debug_assert_eq!(ctxt, ctxt.normalize_to_macros_2_0()); + Macros20NormalizedSyntaxContext(ctxt) + } + + /// The passed closure must preserve the context's normalized-ness. + #[inline] + pub(crate) fn update_unchecked(&mut self, f: impl FnOnce(&mut SyntaxContext) -> R) -> R { + let ret = f(&mut self.0); + debug_assert_eq!(self.0, self.0.normalize_to_macros_2_0()); + ret + } + } + + impl std::ops::Deref for Macros20NormalizedSyntaxContext { + type Target = SyntaxContext; + fn deref(&self) -> &Self::Target { + &self.0 + } + } +} diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 8f05ad7924e33..b7d83d9e130c8 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -29,16 +29,17 @@ use rustc_session::parse::feature_err; use rustc_span::edit_distance::find_best_match_for_name; use rustc_span::edition::Edition; use rustc_span::hygiene::{self, AstPass, ExpnData, ExpnKind, LocalExpnId, MacroKind}; -use rustc_span::{DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym}; +use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym}; use crate::Namespace::*; use crate::errors::{ self, AddAsNonDerive, CannotDetermineMacroResolution, CannotFindIdentInThisScope, MacroExpectedFound, RemoveSurroundingDerive, }; +use crate::hygiene::Macros20NormalizedSyntaxContext; use crate::imports::Import; use crate::{ - BindingKey, CacheCell, CmResolver, Decl, DeclKind, DeriveData, Determinacy, Finalize, + BindingKey, CacheCell, CmResolver, Decl, DeclKind, DeriveData, Determinacy, Finalize, IdentKey, InvocationParent, MacroData, ModuleKind, ModuleOrUniformRoot, ParentScope, PathResult, ResolutionError, Resolver, ScopeSet, Segment, Used, }; @@ -52,7 +53,8 @@ pub(crate) struct MacroRulesDecl<'ra> { pub(crate) decl: Decl<'ra>, /// `macro_rules` scope into which the `macro_rules` item was planted. pub(crate) parent_macro_rules_scope: MacroRulesScopeRef<'ra>, - pub(crate) ident: Macros20NormalizedIdent, + pub(crate) ident: IdentKey, + pub(crate) orig_ident_span: Span, } /// The scope introduced by a `macro_rules!` macro. @@ -412,9 +414,12 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> { Ok((Some(ext), _)) => { if !ext.helper_attrs.is_empty() { let span = resolution.path.segments.last().unwrap().ident.span; - entry.helper_attrs.extend(ext.helper_attrs.iter().map(|name| { - (i, Macros20NormalizedIdent::new(Ident::new(*name, span))) - })); + let ctxt = Macros20NormalizedSyntaxContext::new(span.ctxt()); + entry.helper_attrs.extend( + ext.helper_attrs + .iter() + .map(|&name| (i, IdentKey { name, ctxt }, span)), + ); } entry.has_derive_copy |= ext.builtin_name == Some(sym::Copy); ext @@ -430,13 +435,14 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> { } } // Sort helpers in a stable way independent from the derive resolution order. - entry.helper_attrs.sort_by_key(|(i, _)| *i); + entry.helper_attrs.sort_by_key(|(i, ..)| *i); let helper_attrs = entry .helper_attrs .iter() - .map(|(_, ident)| { + .map(|&(_, ident, orig_ident_span)| { let res = Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper); - (*ident, self.arenas.new_pub_def_decl(res, ident.span, expn_id)) + let decl = self.arenas.new_pub_def_decl(res, orig_ident_span, expn_id); + (ident, orig_ident_span, decl) }) .collect(); self.helper_attrs.insert(expn_id, helper_attrs); @@ -532,14 +538,14 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> { } let mut idents = Vec::new(); - target_trait.for_each_child(self, |this, ident, ns, _binding| { + target_trait.for_each_child(self, |this, ident, orig_ident_span, ns, _binding| { // FIXME: Adjust hygiene for idents from globs, like for glob imports. if let Some(overriding_keys) = this.impl_binding_keys.get(&impl_def_id) && overriding_keys.contains(&BindingKey::new(ident, ns)) { // The name is overridden, do not produce it from the glob delegation. } else { - idents.push((ident.0, None)); + idents.push((ident.orig(orig_ident_span), None)); } }); Ok(idents) @@ -1145,14 +1151,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { } } - pub(crate) fn check_reserved_macro_name(&self, ident: Ident, res: Res) { + pub(crate) fn check_reserved_macro_name(&self, name: Symbol, span: Span, res: Res) { // Reserve some names that are not quite covered by the general check // performed on `Resolver::builtin_attrs`. - if ident.name == sym::cfg || ident.name == sym::cfg_attr { + if name == sym::cfg || name == sym::cfg_attr { let macro_kinds = self.get_macro(res).map(|macro_data| macro_data.ext.macro_kinds()); if macro_kinds.is_some() && sub_namespace_match(macro_kinds, Some(MacroKind::Attr)) { - self.dcx() - .emit_err(errors::NameReservedInAttributeNamespace { span: ident.span, ident }); + self.dcx().emit_err(errors::NameReservedInAttributeNamespace { span, ident: name }); } } } diff --git a/compiler/rustc_span/src/hygiene.rs b/compiler/rustc_span/src/hygiene.rs index d94d82835d650..2e8037b3f9e47 100644 --- a/compiler/rustc_span/src/hygiene.rs +++ b/compiler/rustc_span/src/hygiene.rs @@ -837,11 +837,7 @@ impl SyntaxContext { /// ``` /// This returns `None` if the context cannot be glob-adjusted. /// Otherwise, it returns the scope to use when privacy checking (see `adjust` for details). - pub(crate) fn glob_adjust( - &mut self, - expn_id: ExpnId, - glob_span: Span, - ) -> Option> { + pub fn glob_adjust(&mut self, expn_id: ExpnId, glob_span: Span) -> Option> { HygieneData::with(|data| { let mut scope = None; let mut glob_ctxt = data.normalize_to_macros_2_0(glob_span.ctxt()); @@ -865,7 +861,7 @@ impl SyntaxContext { /// assert!(self.glob_adjust(expansion, glob_ctxt) == Some(privacy_checking_scope)); /// } /// ``` - pub(crate) fn reverse_glob_adjust( + pub fn reverse_glob_adjust( &mut self, expn_id: ExpnId, glob_span: Span, diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index 747cb2c17eb91..27561c674068a 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -63,8 +63,7 @@ pub use span_encoding::{DUMMY_SP, Span}; pub mod symbol; pub use symbol::{ - ByteSymbol, Ident, MacroRulesNormalizedIdent, Macros20NormalizedIdent, STDLIB_STABLE_CRATES, - Symbol, kw, sym, + ByteSymbol, Ident, MacroRulesNormalizedIdent, STDLIB_STABLE_CRATES, Symbol, kw, sym, }; mod analyze_source_file; @@ -1310,30 +1309,6 @@ impl Span { mark } - #[inline] - pub fn glob_adjust(&mut self, expn_id: ExpnId, glob_span: Span) -> Option> { - let mut mark = None; - *self = self.map_ctxt(|mut ctxt| { - mark = ctxt.glob_adjust(expn_id, glob_span); - ctxt - }); - mark - } - - #[inline] - pub fn reverse_glob_adjust( - &mut self, - expn_id: ExpnId, - glob_span: Span, - ) -> Option> { - let mut mark = None; - *self = self.map_ctxt(|mut ctxt| { - mark = ctxt.reverse_glob_adjust(expn_id, glob_span); - ctxt - }); - mark - } - #[inline] pub fn normalize_to_macros_2_0(self) -> Span { self.map_ctxt(|ctxt| ctxt.normalize_to_macros_2_0()) diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 5767444025ec2..6e12a8eb152f5 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -3,7 +3,6 @@ //! type, and vice versa. use std::hash::{Hash, Hasher}; -use std::ops::Deref; use std::{fmt, str}; use rustc_arena::DroplessArena; @@ -2771,48 +2770,6 @@ impl fmt::Display for MacroRulesNormalizedIdent { } } -/// An newtype around `Ident` that calls [Ident::normalize_to_macros_2_0] on -/// construction for "item hygiene" comparisons. -/// -/// Identifiers with same string value become same if they came from the same macro 2.0 macro -/// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from -/// different macro 2.0 macros. -#[derive(Copy, Clone, Eq, PartialEq, Hash)] -pub struct Macros20NormalizedIdent(pub Ident); - -impl Macros20NormalizedIdent { - #[inline] - pub fn new(ident: Ident) -> Self { - Macros20NormalizedIdent(ident.normalize_to_macros_2_0()) - } - - // dummy_span does not need to be normalized, so we can use `Ident` directly - pub fn with_dummy_span(name: Symbol) -> Self { - Macros20NormalizedIdent(Ident::with_dummy_span(name)) - } -} - -impl fmt::Debug for Macros20NormalizedIdent { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Debug::fmt(&self.0, f) - } -} - -impl fmt::Display for Macros20NormalizedIdent { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Display::fmt(&self.0, f) - } -} - -/// By impl Deref, we can access the wrapped Ident as if it were a normal Ident -/// such as `norm_ident.name` instead of `norm_ident.0.name`. -impl Deref for Macros20NormalizedIdent { - type Target = Ident; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - /// An interned UTF-8 string. /// /// Internally, a `Symbol` is implemented as an index, and all operations diff --git a/tests/ui/hygiene/cross-crate-name-hiding-2.stderr b/tests/ui/hygiene/cross-crate-name-hiding-2.stderr index 336d35099c806..90dd40534ed14 100644 --- a/tests/ui/hygiene/cross-crate-name-hiding-2.stderr +++ b/tests/ui/hygiene/cross-crate-name-hiding-2.stderr @@ -1,13 +1,11 @@ error[E0422]: cannot find struct, variant or union type `MyStruct` in this scope --> $DIR/cross-crate-name-hiding-2.rs:13:13 | +LL | my_struct!(define); + | ------------------ you might have meant to refer to this struct +... LL | let x = MyStruct {}; | ^^^^^^^^ not found in this scope - | - ::: $DIR/auxiliary/use_by_macro.rs:7:24 - | -LL | pub struct MyStruct; - | -------- you might have meant to refer to this struct error: aborting due to 1 previous error diff --git a/tests/ui/lint/unused/unused-macros.stderr b/tests/ui/lint/unused/unused-macros.stderr index d0baf5becec4c..50c80b61eb5be 100644 --- a/tests/ui/lint/unused/unused-macros.stderr +++ b/tests/ui/lint/unused/unused-macros.stderr @@ -15,6 +15,11 @@ error: unused macro definition: `m` | LL | macro_rules! m { | ^ +... +LL | create_macro!(); + | --------------- in this macro invocation + | + = note: this error originates in the macro `create_macro` (in Nightly builds, run with -Z macro-backtrace for more info) error: unused macro definition: `unused` --> $DIR/unused-macros.rs:26:18 diff --git a/tests/ui/proc-macro/dollar-crate-issue-62325.stdout b/tests/ui/proc-macro/dollar-crate-issue-62325.stdout index bfd013476f3a9..d1b7227c138de 100644 --- a/tests/ui/proc-macro/dollar-crate-issue-62325.stdout +++ b/tests/ui/proc-macro/dollar-crate-issue-62325.stdout @@ -57,54 +57,54 @@ PRINT-ATTR INPUT (DISPLAY): struct B(identity! ($crate :: S)); PRINT-ATTR INPUT (DEBUG): TokenStream [ Ident { ident: "struct", - span: $DIR/auxiliary/dollar-crate-external.rs:21:5: 21:11 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:5: 21:11 (#12), }, Ident { ident: "B", - span: $DIR/auxiliary/dollar-crate-external.rs:21:12: 21:13 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:12: 21:13 (#12), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "identity", - span: $DIR/auxiliary/dollar-crate-external.rs:21:14: 21:22 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:14: 21:22 (#12), }, Punct { ch: '!', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:21:22: 21:23 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:22: 21:23 (#12), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "$crate", - span: $DIR/auxiliary/dollar-crate-external.rs:21:24: 21:30 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:24: 21:30 (#12), }, Punct { ch: ':', spacing: Joint, - span: $DIR/auxiliary/dollar-crate-external.rs:21:30: 21:31 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:30: 21:31 (#12), }, Punct { ch: ':', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:21:31: 21:32 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:31: 21:32 (#12), }, Ident { ident: "S", - span: $DIR/auxiliary/dollar-crate-external.rs:21:32: 21:33 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:32: 21:33 (#12), }, ], - span: $DIR/auxiliary/dollar-crate-external.rs:21:23: 21:34 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:23: 21:34 (#12), }, ], - span: $DIR/auxiliary/dollar-crate-external.rs:21:13: 21:35 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:13: 21:35 (#12), }, Punct { ch: ';', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:21:35: 21:36 (#11), + span: $DIR/auxiliary/dollar-crate-external.rs:21:35: 21:36 (#12), }, ] diff --git a/tests/ui/proc-macro/dollar-crate.stdout b/tests/ui/proc-macro/dollar-crate.stdout index 0278ef1ad0fcd..f39d03540916a 100644 --- a/tests/ui/proc-macro/dollar-crate.stdout +++ b/tests/ui/proc-macro/dollar-crate.stdout @@ -122,119 +122,119 @@ PRINT-BANG INPUT (DISPLAY): struct M($crate :: S); PRINT-BANG INPUT (DEBUG): TokenStream [ Ident { ident: "struct", - span: $DIR/auxiliary/dollar-crate-external.rs:7:13: 7:19 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:13: 7:19 (#15), }, Ident { ident: "M", - span: $DIR/auxiliary/dollar-crate-external.rs:7:20: 7:21 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:20: 7:21 (#15), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "$crate", - span: $DIR/auxiliary/dollar-crate-external.rs:7:22: 7:28 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:22: 7:28 (#15), }, Punct { ch: ':', spacing: Joint, - span: $DIR/auxiliary/dollar-crate-external.rs:7:28: 7:29 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:28: 7:29 (#15), }, Punct { ch: ':', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:7:29: 7:30 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:29: 7:30 (#15), }, Ident { ident: "S", - span: $DIR/auxiliary/dollar-crate-external.rs:7:30: 7:31 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:30: 7:31 (#15), }, ], - span: $DIR/auxiliary/dollar-crate-external.rs:7:21: 7:32 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:21: 7:32 (#15), }, Punct { ch: ';', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:7:32: 7:33 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:7:32: 7:33 (#15), }, ] PRINT-ATTR INPUT (DISPLAY): struct A($crate :: S); PRINT-ATTR INPUT (DEBUG): TokenStream [ Ident { ident: "struct", - span: $DIR/auxiliary/dollar-crate-external.rs:11:9: 11:15 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:9: 11:15 (#15), }, Ident { ident: "A", - span: $DIR/auxiliary/dollar-crate-external.rs:11:16: 11:17 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:16: 11:17 (#15), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "$crate", - span: $DIR/auxiliary/dollar-crate-external.rs:11:18: 11:24 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:18: 11:24 (#15), }, Punct { ch: ':', spacing: Joint, - span: $DIR/auxiliary/dollar-crate-external.rs:11:24: 11:25 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:24: 11:25 (#15), }, Punct { ch: ':', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:11:25: 11:26 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:25: 11:26 (#15), }, Ident { ident: "S", - span: $DIR/auxiliary/dollar-crate-external.rs:11:26: 11:27 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:26: 11:27 (#15), }, ], - span: $DIR/auxiliary/dollar-crate-external.rs:11:17: 11:28 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:17: 11:28 (#15), }, Punct { ch: ';', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:11:28: 11:29 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:11:28: 11:29 (#15), }, ] PRINT-DERIVE INPUT (DISPLAY): struct D($crate :: S); PRINT-DERIVE INPUT (DEBUG): TokenStream [ Ident { ident: "struct", - span: $DIR/auxiliary/dollar-crate-external.rs:14:9: 14:15 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:9: 14:15 (#15), }, Ident { ident: "D", - span: $DIR/auxiliary/dollar-crate-external.rs:14:16: 14:17 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:16: 14:17 (#15), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "$crate", - span: $DIR/auxiliary/dollar-crate-external.rs:14:18: 14:24 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:18: 14:24 (#15), }, Punct { ch: ':', spacing: Joint, - span: $DIR/auxiliary/dollar-crate-external.rs:14:24: 14:25 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:24: 14:25 (#15), }, Punct { ch: ':', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:14:25: 14:26 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:25: 14:26 (#15), }, Ident { ident: "S", - span: $DIR/auxiliary/dollar-crate-external.rs:14:26: 14:27 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:26: 14:27 (#15), }, ], - span: $DIR/auxiliary/dollar-crate-external.rs:14:17: 14:28 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:17: 14:28 (#15), }, Punct { ch: ';', spacing: Alone, - span: $DIR/auxiliary/dollar-crate-external.rs:14:28: 14:29 (#14), + span: $DIR/auxiliary/dollar-crate-external.rs:14:28: 14:29 (#15), }, ] diff --git a/tests/ui/proc-macro/generate-mod.stderr b/tests/ui/proc-macro/generate-mod.stderr index 371fd73e507bb..af90df2c3dc3b 100644 --- a/tests/ui/proc-macro/generate-mod.stderr +++ b/tests/ui/proc-macro/generate-mod.stderr @@ -47,6 +47,7 @@ LL | #[derive(generate_mod::CheckDerive)] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 = note: `#[deny(proc_macro_derive_resolution_fallback)]` (part of `#[deny(future_incompatible)]`) on by default + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) error: cannot find type `OuterDerive` in this scope --> $DIR/generate-mod.rs:18:10 @@ -56,6 +57,7 @@ LL | #[derive(generate_mod::CheckDerive)] | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) error: cannot find type `FromOutside` in this scope --> $DIR/generate-mod.rs:25:14 @@ -65,6 +67,7 @@ LL | #[derive(generate_mod::CheckDerive)] | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) error: cannot find type `OuterDerive` in this scope --> $DIR/generate-mod.rs:25:14 @@ -74,6 +77,7 @@ LL | #[derive(generate_mod::CheckDerive)] | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 8 previous errors @@ -88,6 +92,7 @@ LL | #[derive(generate_mod::CheckDerive)] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 = note: `#[deny(proc_macro_derive_resolution_fallback)]` (part of `#[deny(future_incompatible)]`) on by default + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) Future breakage diagnostic: error: cannot find type `OuterDerive` in this scope @@ -99,6 +104,7 @@ LL | #[derive(generate_mod::CheckDerive)] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 = note: `#[deny(proc_macro_derive_resolution_fallback)]` (part of `#[deny(future_incompatible)]`) on by default + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) Future breakage diagnostic: error: cannot find type `FromOutside` in this scope @@ -110,6 +116,7 @@ LL | #[derive(generate_mod::CheckDerive)] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 = note: `#[deny(proc_macro_derive_resolution_fallback)]` (part of `#[deny(future_incompatible)]`) on by default + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) Future breakage diagnostic: error: cannot find type `OuterDerive` in this scope @@ -121,6 +128,7 @@ LL | #[derive(generate_mod::CheckDerive)] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 = note: `#[deny(proc_macro_derive_resolution_fallback)]` (part of `#[deny(future_incompatible)]`) on by default + = note: this error originates in the derive macro `generate_mod::CheckDerive` (in Nightly builds, run with -Z macro-backtrace for more info) Future breakage diagnostic: warning: cannot find type `FromOutside` in this scope @@ -131,6 +139,7 @@ LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 + = note: this warning originates in the derive macro `generate_mod::CheckDeriveLint` (in Nightly builds, run with -Z macro-backtrace for more info) Future breakage diagnostic: warning: cannot find type `OuterDeriveLint` in this scope @@ -141,4 +150,5 @@ LL | #[derive(generate_mod::CheckDeriveLint)] // OK, lint is suppressed | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #83583 + = note: this warning originates in the derive macro `generate_mod::CheckDeriveLint` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/proc-macro/nested-macro-rules.stdout b/tests/ui/proc-macro/nested-macro-rules.stdout index 5b678554b9e0f..89fb7b0422187 100644 --- a/tests/ui/proc-macro/nested-macro-rules.stdout +++ b/tests/ui/proc-macro/nested-macro-rules.stdout @@ -2,45 +2,45 @@ PRINT-BANG INPUT (DISPLAY): FirstStruct PRINT-BANG INPUT (DEBUG): TokenStream [ Ident { ident: "FirstStruct", - span: $DIR/auxiliary/nested-macro-rules.rs:16:14: 16:25 (#6), + span: $DIR/auxiliary/nested-macro-rules.rs:16:14: 16:25 (#7), }, ] PRINT-ATTR INPUT (DISPLAY): struct FirstAttrStruct {} PRINT-ATTR INPUT (DEBUG): TokenStream [ Ident { ident: "struct", - span: $DIR/auxiliary/nested-macro-rules.rs:10:32: 10:38 (#5), + span: $DIR/auxiliary/nested-macro-rules.rs:10:32: 10:38 (#6), }, Ident { ident: "FirstAttrStruct", - span: $DIR/auxiliary/nested-macro-rules.rs:16:27: 16:42 (#6), + span: $DIR/auxiliary/nested-macro-rules.rs:16:27: 16:42 (#7), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/auxiliary/nested-macro-rules.rs:10:57: 10:59 (#5), + span: $DIR/auxiliary/nested-macro-rules.rs:10:57: 10:59 (#6), }, ] PRINT-BANG INPUT (DISPLAY): SecondStruct PRINT-BANG INPUT (DEBUG): TokenStream [ Ident { ident: "SecondStruct", - span: $DIR/nested-macro-rules.rs:23:38: 23:50 (#15), + span: $DIR/nested-macro-rules.rs:23:38: 23:50 (#16), }, ] PRINT-ATTR INPUT (DISPLAY): struct SecondAttrStruct {} PRINT-ATTR INPUT (DEBUG): TokenStream [ Ident { ident: "struct", - span: $DIR/auxiliary/nested-macro-rules.rs:10:32: 10:38 (#14), + span: $DIR/auxiliary/nested-macro-rules.rs:10:32: 10:38 (#15), }, Ident { ident: "SecondAttrStruct", - span: $DIR/nested-macro-rules.rs:23:52: 23:68 (#15), + span: $DIR/nested-macro-rules.rs:23:52: 23:68 (#16), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/auxiliary/nested-macro-rules.rs:10:57: 10:59 (#14), + span: $DIR/auxiliary/nested-macro-rules.rs:10:57: 10:59 (#15), }, ]