diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-05-23 19:53:42 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-23 19:53:42 +0200 |
| commit | 37c9478b1a45e6dbcac9ba2c27bca4af32ed6d89 (patch) | |
| tree | 11eb8d943f8a0828cf308c43381bbf93f4b94ea7 /tests/rustdoc-ui/coverage/enum-tuple.rs | |
| parent | ee08dd86582a15cf2755951f40c9e50adf72d39d (diff) | |
| parent | c41b2089c7a059a7ce86107b8f3528c05ca11254 (diff) | |
| download | rust-37c9478b1a45e6dbcac9ba2c27bca4af32ed6d89.tar.gz rust-37c9478b1a45e6dbcac9ba2c27bca4af32ed6d89.zip | |
Rollup merge of #111761 - bvanjoi:fix-109148, r=petrochenkov
fix(resolve): not defined `extern crate shadow_name` Fixes https://github.com/rust-lang/rust/issues/109148 ## Why does #109148 panic? When resolving `use std::xx` it enters `visit_scopes` from `early_resolve_ident_in_lexical_scope`, and iters twice during the loop: |iter| `scope` | `break_result` | result | |-|-|-|-| | 0 | `Module` pointed to root | binding pointed to `Undetermined`, so result is `None` | scope changed to `ExternPrelude` | | 1 | `ExternPrelude` | binding pointed to `std` | - | Then, the result of `maybe_resolve_path` is `Module(std)`, so `import.imported_module.set` is executed. Finally, during the `finalize_import` of `use std::xx`, `resolve_path` returns `NonModule` because `Binding(Ident(std), Module(root)`'s binding points to `extern crate blah as std`, which causes the assertion to fail at `assert!(import.imported_module.get().is_none());`. ## Investigation The question is why `#[a] extern crate blah as std` is not defined as a binding of `std::xxx`, which causes the iteration twice during `visit_scopes` when resolving `std::xxx`. Ideally, the value of `break_result.is_some()` should have been valid in the first iteration. After debugging, I found that because `#[a] extern crate blah as std` had been dummied by `placeholder` during `collect_invocations`, so it had lost its attrs, span, etc..., so it will not be defined. However, `expand_invoc` added them back, then the next `build_reduced_graph`, `#[a] extern crate blah as std` would have been defined, so it makes the result of `resolved_path` unexpected, and the program panics. ## Try to solve I think there has two-way to solve this issue: - Expand invocations before the first `resolve_imports` during `fully_expand_fragment`. However, I do not think this is a good idea because it would mess up the current design. - As my PR described: do not define to `extern crate blah as std` during the second `build_reduced_graph`, which is very easy and more reasonable. r? `@petrochenkov`
Diffstat (limited to 'tests/rustdoc-ui/coverage/enum-tuple.rs')
0 files changed, 0 insertions, 0 deletions
