Skip to content

Commit

Permalink
Auto merge of rust-lang#99292 - Aaron1011:stability-use-tree, r=cjgillot
Browse files Browse the repository at this point in the history
Correctly handle path stability for 'use tree' items

PR rust-lang#95956 started checking the stability of path segments.
However, this was not applied to 'use tree' items
(e.g. 'use some::path::{ItemOne, ItemTwo}') due to the way
that we desugar these items in HIR lowering.

This PR modifies 'use tree' lowering to preserve resolution
information, which is needed by stability checking.
  • Loading branch information
bors committed Oct 15, 2022
2 parents 8154955 + c7b31d0 commit 46244f3
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 5 deletions.
12 changes: 10 additions & 2 deletions compiler/rustc_ast_lowering/src/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
let ident = *ident;
let mut path = path.clone();
for seg in &mut path.segments {
seg.id = self.next_node_id();
// Give the cloned segment the same resolution information
// as the old one (this is needed for stability checking).
let new_id = self.next_node_id();
self.resolver.clone_res(seg.id, new_id);
seg.id = new_id;
}
let span = path.span;

Expand Down Expand Up @@ -614,7 +618,11 @@ impl<'hir> LoweringContext<'_, 'hir> {

// Give the segments new node-ids since they are being cloned.
for seg in &mut prefix.segments {
seg.id = self.next_node_id();
// Give the cloned segment the same resolution information
// as the old one (this is needed for stability checking).
let new_id = self.next_node_id();
self.resolver.clone_res(seg.id, new_id);
seg.id = new_id;
}

// Each `use` import is an item and thus are owners of the
Expand Down
10 changes: 10 additions & 0 deletions compiler/rustc_ast_lowering/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ trait ResolverAstLoweringExt {
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
fn get_import_res(&self, id: NodeId) -> PerNS<Option<Res<NodeId>>>;
// Clones the resolution (if any) on 'source' and applies it
// to 'target'. Used when desugaring a `UseTreeKind::Nested` to
// multiple `UseTreeKind::Simple`s
fn clone_res(&mut self, source: NodeId, target: NodeId);
fn get_label_res(&self, id: NodeId) -> Option<NodeId>;
fn get_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes>;
fn take_extra_lifetime_params(&mut self, id: NodeId) -> Vec<(Ident, NodeId, LifetimeRes)>;
Expand Down Expand Up @@ -192,6 +196,12 @@ impl ResolverAstLoweringExt for ResolverAstLowering {
None
}

fn clone_res(&mut self, source: NodeId, target: NodeId) {
if let Some(res) = self.partial_res_map.get(&source) {
self.partial_res_map.insert(target, *res);
}
}

/// Obtains resolution for a `NodeId` with a single resolution.
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
self.partial_res_map.get(&id).copied()
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/lint/lint-output-format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

extern crate lint_output_format; //~ ERROR use of unstable library feature
use lint_output_format::{foo, bar}; //~ ERROR use of unstable library feature
//~| ERROR use of unstable library feature

fn main() {
let _x = foo();
Expand Down
12 changes: 10 additions & 2 deletions src/test/ui/lint/lint-output-format.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ LL | extern crate lint_output_format;
|
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error[E0658]: use of unstable library feature 'unstable_test_feature'
--> $DIR/lint-output-format.rs:7:26
|
LL | use lint_output_format::{foo, bar};
| ^^^
|
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error[E0658]: use of unstable library feature 'unstable_test_feature'
--> $DIR/lint-output-format.rs:7:31
|
Expand All @@ -15,13 +23,13 @@ LL | use lint_output_format::{foo, bar};
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error[E0658]: use of unstable library feature 'unstable_test_feature'
--> $DIR/lint-output-format.rs:11:14
--> $DIR/lint-output-format.rs:12:14
|
LL | let _y = bar();
| ^^^
|
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error: aborting due to 3 previous errors
error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0658`.
8 changes: 8 additions & 0 deletions src/test/ui/stability-attribute/stable-in-unstable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,11 @@ mod isolated5 {

impl stable_in_unstable_std::old_stable_module::OldTrait for LocalType {}
}

mod isolated6 {
use stable_in_unstable_core::new_unstable_module::{OldTrait}; //~ ERROR use of unstable library feature 'unstable_test_feature'
}

mod isolated7 {
use stable_in_unstable_core::new_unstable_module::*; //~ ERROR use of unstable library feature 'unstable_test_feature'
}
20 changes: 19 additions & 1 deletion src/test/ui/stability-attribute/stable-in-unstable.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,24 @@ LL | impl stable_in_unstable_core::new_unstable_module::OldTrait for LocalTy
= note: see issue #1 <https://github.com/rust-lang/rust/issues/1> for more information
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error: aborting due to 4 previous errors
error[E0658]: use of unstable library feature 'unstable_test_feature'
--> $DIR/stable-in-unstable.rs:49:56
|
LL | use stable_in_unstable_core::new_unstable_module::{OldTrait};
| ^^^^^^^^
|
= note: see issue #1 <https://github.com/rust-lang/rust/issues/1> for more information
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error[E0658]: use of unstable library feature 'unstable_test_feature'
--> $DIR/stable-in-unstable.rs:53:9
|
LL | use stable_in_unstable_core::new_unstable_module::*;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #1 <https://github.com/rust-lang/rust/issues/1> for more information
= help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable

error: aborting due to 6 previous errors

For more information about this error, try `rustc --explain E0658`.

0 comments on commit 46244f3

Please sign in to comment.