Auto merge of #115269 - bvanjoi:fix-113834, r=petrochenkov
resolve: mark binding is determined after all macros had been expanded Fixes #113834 Fixes #115377 r? `@petrochenkov`
This commit is contained in:
commit
735bb7e5df
14 changed files with 154 additions and 80 deletions
|
@ -1239,7 +1239,7 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> {
|
|||
use_span_with_attributes: span,
|
||||
use_span: span,
|
||||
root_span: span,
|
||||
span: span,
|
||||
span,
|
||||
module_path: Vec::new(),
|
||||
vis: Cell::new(Some(vis)),
|
||||
used: Cell::new(true),
|
||||
|
|
|
@ -972,9 +972,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
// progress, we have to ignore those potential unresolved invocations from other modules
|
||||
// and prohibit access to macro-expanded `macro_export` macros instead (unless restricted
|
||||
// shadowing is enabled, see `macro_expanded_macro_export_errors`).
|
||||
let unexpanded_macros = !module.unexpanded_invocations.borrow().is_empty();
|
||||
if let Some(binding) = binding {
|
||||
if !unexpanded_macros || ns == MacroNS || restricted_shadowing {
|
||||
if binding.determined() || ns == MacroNS || restricted_shadowing {
|
||||
return check_usable(self, binding);
|
||||
} else {
|
||||
return Err((Undetermined, Weak::No));
|
||||
|
@ -991,7 +990,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
|
||||
// Check if one of unexpanded macros can still define the name,
|
||||
// if it can then our "no resolution" result is not determined and can be invalidated.
|
||||
if unexpanded_macros {
|
||||
if !module.unexpanded_invocations.borrow().is_empty() {
|
||||
return Err((Undetermined, Weak::Yes));
|
||||
}
|
||||
|
||||
|
|
|
@ -319,10 +319,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
// We should replace the `old_binding` with `binding` regardless
|
||||
// of whether they has same resolution or not when they are
|
||||
// imported from the same glob-import statement.
|
||||
// However we currently using `Some(old_binding)` for back compact
|
||||
// purposes.
|
||||
// This case can be removed after once `Undetermined` is prepared
|
||||
// for glob-imports.
|
||||
resolution.binding = Some(binding);
|
||||
} else if res != old_binding.res() {
|
||||
let binding = if warn_ambiguity {
|
||||
this.warn_ambiguity(
|
||||
|
@ -805,13 +802,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
// For better failure detection, pretend that the import will
|
||||
// not define any names while resolving its module path.
|
||||
let orig_vis = import.vis.take();
|
||||
let binding = this.resolve_ident_in_module(
|
||||
let binding = this.maybe_resolve_ident_in_module(
|
||||
module,
|
||||
source,
|
||||
ns,
|
||||
&import.parent_scope,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
import.vis.set(orig_vis);
|
||||
source_bindings[ns].set(binding);
|
||||
|
|
|
@ -881,6 +881,19 @@ impl<'a> NameBindingData<'a> {
|
|||
invoc_parent_expansion.is_descendant_of(self_parent_expansion);
|
||||
!(certainly_before_other_or_simultaneously || certainly_before_invoc_or_simultaneously)
|
||||
}
|
||||
|
||||
// Its purpose is to postpone the determination of a single binding because
|
||||
// we can't predict whether it will be overwritten by recently expanded macros.
|
||||
// FIXME: How can we integrate it with the `update_resolution`?
|
||||
fn determined(&self) -> bool {
|
||||
match &self.kind {
|
||||
NameBindingKind::Import { binding, import, .. } if import.is_glob() => {
|
||||
import.parent_scope.module.unexpanded_invocations.borrow().is_empty()
|
||||
&& binding.determined()
|
||||
}
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, Clone)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue