Skip to content

Commit ff15d97

Browse files
committed
resolve: re-export ambiguity in extern crate as warning
1 parent 33688d2 commit ff15d97

32 files changed

+380
-82
lines changed

compiler/rustc_errors/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1898,6 +1898,9 @@ pub fn report_ambiguity_error<'a, G: EmissionGuarantee>(
18981898
for help_msg in ambiguity.b1_help_msgs {
18991899
db.help(help_msg);
19001900
}
1901+
if ambiguity.extern_crate {
1902+
return;
1903+
}
19011904
db.span_note(ambiguity.b2_span, ambiguity.b2_note_msg);
19021905
for help_msg in ambiguity.b2_help_msgs {
19031906
db.help(help_msg);

compiler/rustc_lint_defs/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ impl<HCX> ToStableHashKey<HCX> for LintId {
476476

477477
#[derive(Debug)]
478478
pub struct AmbiguityErrorDiag {
479+
/// Does this ambiguity binding come from a different crate?
480+
pub extern_crate: bool,
479481
pub msg: String,
480482
pub span: Span,
481483
pub label_span: Span,

compiler/rustc_metadata/src/rmeta/decoder.rs

+33
Original file line numberDiff line numberDiff line change
@@ -1265,6 +1265,39 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
12651265
})
12661266
}
12671267

1268+
fn get_ambiguity_mod_child(self, id: DefIndex, sess: &Session) -> AmbiguityModChild {
1269+
let ident = self.item_ident(id, sess);
1270+
let res = Res::Def(self.def_kind(id), self.local_def_id(id));
1271+
let vis = self.get_visibility(id);
1272+
1273+
AmbiguityModChild { ident, res, vis, reexport_chain: Default::default() }
1274+
}
1275+
1276+
fn get_ambiguity_module_children(
1277+
self,
1278+
id: DefIndex,
1279+
sess: &'a Session,
1280+
) -> impl Iterator<Item = AmbiguityModChild> + 'a {
1281+
iter::from_coroutine(move || {
1282+
if self.root.proc_macro_data.is_none() {
1283+
if let Some(non_reexports) =
1284+
self.root.tables.ambiguity_module_children_non_reexports.get(self, id)
1285+
{
1286+
for child_index in non_reexports.decode(self) {
1287+
yield self.get_ambiguity_mod_child(child_index, sess);
1288+
}
1289+
}
1290+
1291+
let reexports = self.root.tables.ambiguity_module_children_reexports.get(self, id);
1292+
if !reexports.is_default() {
1293+
for reexport in reexports.decode((self, sess)) {
1294+
yield reexport;
1295+
}
1296+
}
1297+
}
1298+
})
1299+
}
1300+
12681301
fn is_ctfe_mir_available(self, id: DefIndex) -> bool {
12691302
self.root.tables.mir_for_ctfe.get(self, id).is_some()
12701303
}

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

+3
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ provide! { tcx, def_id, other, cdata,
346346
module_children => {
347347
tcx.arena.alloc_from_iter(cdata.get_module_children(def_id.index, tcx.sess))
348348
}
349+
ambiguity_module_children => {
350+
tcx.arena.alloc_from_iter(cdata.get_ambiguity_module_children(def_id.index, tcx.sess))
351+
}
349352
defined_lib_features => { cdata.get_lib_features(tcx) }
350353
stability_implications => {
351354
cdata.get_stability_implications(tcx).iter().copied().collect()

compiler/rustc_metadata/src/rmeta/encoder.rs

+9
Original file line numberDiff line numberDiff line change
@@ -1565,6 +1565,15 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
15651565

15661566
record_defaulted_array!(self.tables.module_children_reexports[def_id] <-
15671567
module_children.iter().filter(|child| !child.reexport_chain.is_empty()));
1568+
1569+
let ambiguity_module_children = tcx.ambiguity_module_children_local(local_def_id);
1570+
1571+
record_array!(self.tables.ambiguity_module_children_non_reexports[def_id] <-
1572+
ambiguity_module_children.iter().filter(|child| child.reexport_chain.is_empty())
1573+
.map(|child| child.res.def_id().index));
1574+
1575+
record_defaulted_array!(self.tables.ambiguity_module_children_reexports[def_id] <-
1576+
ambiguity_module_children.iter().filter(|child| !child.reexport_chain.is_empty()));
15681577
}
15691578
}
15701579

compiler/rustc_metadata/src/rmeta/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_hir::definitions::DefKey;
1616
use rustc_hir::lang_items::LangItem;
1717
use rustc_index::bit_set::BitSet;
1818
use rustc_index::IndexVec;
19-
use rustc_middle::metadata::ModChild;
19+
use rustc_middle::metadata::{AmbiguityModChild, ModChild};
2020
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
2121
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
2222
use rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
@@ -397,12 +397,14 @@ define_tables! {
397397
// That's why the encoded list needs to contain `ModChild` structures describing all the names
398398
// individually instead of `DefId`s.
399399
module_children_reexports: Table<DefIndex, LazyArray<ModChild>>,
400+
ambiguity_module_children_reexports: Table<DefIndex, LazyArray<AmbiguityModChild>>,
400401

401402
- optional:
402403
attributes: Table<DefIndex, LazyArray<ast::Attribute>>,
403404
// For non-reexported names in a module every name is associated with a separate `DefId`,
404405
// so we can take their names, visibilities etc from other encoded tables.
405406
module_children_non_reexports: Table<DefIndex, LazyArray<DefIndex>>,
407+
ambiguity_module_children_non_reexports: Table<DefIndex, LazyArray<DefIndex>>,
406408
associated_item_or_field_def_ids: Table<DefIndex, LazyArray<DefIndex>>,
407409
opt_def_kind: Table<DefIndex, DefKind>,
408410
visibility: Table<DefIndex, LazyValue<ty::Visibility<DefIndex>>>,

compiler/rustc_middle/src/arena.rs

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ macro_rules! arena_types {
131131
[] closure_kind_origin: (rustc_span::Span, rustc_middle::hir::place::Place<'tcx>),
132132
[] stripped_cfg_items: rustc_ast::expand::StrippedCfgItem,
133133
[] mod_child: rustc_middle::metadata::ModChild,
134+
[] ambiguity_mod_child: rustc_middle::metadata::AmbiguityModChild,
134135
[] features: rustc_feature::Features,
135136
]);
136137
)

compiler/rustc_middle/src/metadata.rs

+9
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,12 @@ pub struct ModChild {
4444
/// Empty if the module child is a proper item.
4545
pub reexport_chain: SmallVec<[Reexport; 2]>,
4646
}
47+
48+
/// This is similar to `ModChild`, however, it includes ambiguity error.
49+
#[derive(Debug, TyEncodable, TyDecodable, HashStable)]
50+
pub struct AmbiguityModChild {
51+
pub ident: Ident,
52+
pub res: Res<!>,
53+
pub vis: ty::Visibility<DefId>,
54+
pub reexport_chain: SmallVec<[Reexport; 2]>,
55+
}

compiler/rustc_middle/src/query/mod.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use crate::dep_graph;
1010
use crate::infer::canonical::{self, Canonical};
1111
use crate::lint::LintExpectation;
12-
use crate::metadata::ModChild;
12+
use crate::metadata::{AmbiguityModChild, ModChild};
1313
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
1414
use crate::middle::debugger_visualizer::DebuggerVisualizerFile;
1515
use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
@@ -1728,6 +1728,10 @@ rustc_queries! {
17281728
desc { |tcx| "collecting child items of module `{}`", tcx.def_path_str(def_id) }
17291729
separate_provide_extern
17301730
}
1731+
query ambiguity_module_children(def_id: DefId) -> &'tcx [AmbiguityModChild] {
1732+
desc { |tcx| "collecting ambiguity child items of module `{}`", tcx.def_path_str(def_id) }
1733+
separate_provide_extern
1734+
}
17311735
query extern_mod_stmt_cnum(def_id: LocalDefId) -> Option<CrateNum> {
17321736
desc { |tcx| "computing crate imported by `{}`", tcx.def_path_str(def_id) }
17331737
}

compiler/rustc_middle/src/ty/context.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::arena::Arena;
88
use crate::dep_graph::{DepGraph, DepKindStruct};
99
use crate::infer::canonical::{CanonicalVarInfo, CanonicalVarInfos};
1010
use crate::lint::struct_lint_level;
11-
use crate::metadata::ModChild;
11+
use crate::metadata::{AmbiguityModChild, ModChild};
1212
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
1313
use crate::middle::resolve_bound_vars;
1414
use crate::middle::stability;
@@ -2172,6 +2172,10 @@ impl<'tcx> TyCtxt<'tcx> {
21722172
pub fn module_children_local(self, def_id: LocalDefId) -> &'tcx [ModChild] {
21732173
self.resolutions(()).module_children.get(&def_id).map_or(&[], |v| &v[..])
21742174
}
2175+
2176+
pub fn ambiguity_module_children_local(self, def_id: LocalDefId) -> &'tcx [AmbiguityModChild] {
2177+
self.resolutions(()).ambiguity_module_children.get(&def_id).map_or(&[], |v| &v[..])
2178+
}
21752179
}
21762180

21772181
/// Parameter attributes that can only be determined by examining the body of a function instead

compiler/rustc_middle/src/ty/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub use self::BorrowKind::*;
1818
pub use self::IntVarValue::*;
1919
pub use self::Variance::*;
2020
use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
21-
use crate::metadata::ModChild;
21+
use crate::metadata::{AmbiguityModChild, ModChild};
2222
use crate::middle::privacy::EffectiveVisibilities;
2323
use crate::mir::{Body, CoroutineLayout};
2424
use crate::query::Providers;
@@ -168,6 +168,7 @@ pub struct ResolverGlobalCtxt {
168168
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
169169
pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
170170
pub module_children: LocalDefIdMap<Vec<ModChild>>,
171+
pub ambiguity_module_children: LocalDefIdMap<Vec<AmbiguityModChild>>,
171172
pub glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
172173
pub main_def: Option<MainDefinition>,
173174
pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,

compiler/rustc_middle/src/ty/parameterized.rs

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ trivially_parameterized_over_tcx! {
5656
bool,
5757
std::string::String,
5858
crate::metadata::ModChild,
59+
crate::metadata::AmbiguityModChild,
5960
crate::middle::codegen_fn_attrs::CodegenFnAttrs,
6061
crate::middle::debugger_visualizer::DebuggerVisualizerFile,
6162
crate::middle::exported_symbols::SymbolExportInfo,

0 commit comments

Comments
 (0)