Prefer ambiguous candidates when deduplicating traits in scope, so ambiguous_glob_imported_traits doesn't depend on import order - #161805
Conversation
|
r? @khyperia rustbot has assigned @khyperia. Use Why was this reviewer chosen?The reviewer was selected based on:
|
0759927 to
7fb57c7
Compare
This comment has been minimized.
This comment has been minimized.
|
r=me after addressing #161805 (comment) and fixing tidy.
The treatment of ambiguous glob sets needs to be reworked in general, and the answer on this question may depend on the results of the rework. For now let's merge this, this PR makes the lint more conservative and (more importantly) order-independent, we can relax it later if it becomes possible with the glob set rework. |
|
Reminder, once the PR becomes ready for a review, use |
…, where the name is ambiguous, make to always report the `ambiguous_glob_imported_traits` lint independent of the ordering of exports. Added a test to make sure both ordering trigger the lint.
7fb57c7 to
d7d2dcd
Compare
|
Fixed tidy and and simplified the test (generic names, clutter, ...).
Sounds good to me! @rustbot ready (can't r=you) |
|
@bors r+ |
…ort-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes rust-lang#160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
…ort-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes rust-lang#160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
…ort-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes rust-lang#160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
…ort-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes rust-lang#160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
Rollup of 14 pull requests Successful merges: - #150075 (Implement clamp_to) - #159103 (fix(reborrow): recursive implementation) - #160848 (std: avoid aliasing violations when wrapping opaque C types) - #161421 (Include startup crt objects on WASI for more outputs) - #161805 (Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order) - #161862 (Put data segment in specified section with link_section on wasm) - #161866 (delegation: add tests fixating behavior of delegating to default trait implementations) - #161456 (reduce perf impact of scalar size checks) - #161666 (Print vendor instructions in `x vendor`) - #161730 (Improve type mismatch annotation for lets with block-wrapped initializers) - #161828 (Never type after-stabilization cleanup) - #161860 (atomicptr.rs test: remove unused import) - #161870 (bind to [::1] instead of 127.0.0.1 in documentation examples for v6 UDP methods) - #161876 (rustdoc: Correctly handle when a macro generates multiple items in `--generate-macro-expansion`)
…ort-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes rust-lang#160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
…ort-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes rust-lang#160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
…uwer Rollup of 21 pull requests Successful merges: - #158609 (Update sccache to 0.16.0) - #150075 (Implement clamp_to) - #159103 (fix(reborrow): recursive implementation) - #160562 (add target feature ABI checks for SPARC) - #160848 (std: avoid aliasing violations when wrapping opaque C types) - #161421 (Include startup crt objects on WASI for more outputs) - #161805 (Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order) - #161862 (Put data segment in specified section with link_section on wasm) - #161866 (delegation: add tests fixating behavior of delegating to default trait implementations) - #161456 (reduce perf impact of scalar size checks) - #161528 (Add regression test to ensure optimal compilation) - #161666 (Print vendor instructions in `x vendor`) - #161730 (Improve type mismatch annotation for lets with block-wrapped initializers) - #161828 (Never type after-stabilization cleanup) - #161859 (Do not optimize MIR for comptime ConstFns) - #161860 (atomicptr.rs test: remove unused import) - #161870 (bind to [::1] instead of 127.0.0.1 in documentation examples for v6 UDP methods) - #161876 (rustdoc: Correctly handle when a macro generates multiple items in `--generate-macro-expansion`) - #161889 (Add link to ownership section in ptr::read docs) - #161890 (rustdoc: some clarifying comments) - #161891 (Mark `extern_item_impls` feature as incomplete) Failed merges: - #161702 (Use `drop_guard` in some places in {core,alloc,std})
…uwer Rollup of 21 pull requests Successful merges: - #150075 (Implement clamp_to) - #159103 (fix(reborrow): recursive implementation) - #160562 (add target feature ABI checks for SPARC) - #160848 (std: avoid aliasing violations when wrapping opaque C types) - #161421 (Include startup crt objects on WASI for more outputs) - #161805 (Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order) - #161862 (Put data segment in specified section with link_section on wasm) - #161866 (delegation: add tests fixating behavior of delegating to default trait implementations) - #157218 (Track items behind `cfg_select` in the same way we do for `cfg`) - #161456 (reduce perf impact of scalar size checks) - #161528 (Add regression test to ensure optimal compilation) - #161666 (Print vendor instructions in `x vendor`) - #161730 (Improve type mismatch annotation for lets with block-wrapped initializers) - #161828 (Never type after-stabilization cleanup) - #161859 (Do not optimize MIR for comptime ConstFns) - #161860 (atomicptr.rs test: remove unused import) - #161870 (bind to [::1] instead of 127.0.0.1 in documentation examples for v6 UDP methods) - #161876 (rustdoc: Correctly handle when a macro generates multiple items in `--generate-macro-expansion`) - #161889 (Add link to ownership section in ptr::read docs) - #161890 (rustdoc: some clarifying comments) - #161891 (Mark `extern_item_impls` feature as incomplete) Failed merges: - #161702 (Use `drop_guard` in some places in {core,alloc,std})
Rollup merge of #161805 - LorrensP-2158466:res-fix-ambig-import-trait-lint, r=petrochenkov Prefer ambiguous candidates when deduplicating traits in scope, so `ambiguous_glob_imported_traits` doesn't depend on import order Fixes #160742 When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous: ```rust // depending on the order, the second one is removed mod prelude { pub use crate::expression::IntoSql; pub use crate::expression::IntoSql as _; } use module::*; // imports some item names IntoSql use prelude::*; // imports trait `IntoSql` and `IntoSql as _` ``` This caused the lint `ambiguous_glob_imported_traits` to not be triggered if the `as _` came first, even though both are actually in scope. We now deduplicate based on `(def_id, lint_ambiguous)` and later check that if an ambiguous candidate is present in `collapse_candidates_to_trait_pick`, we mark the pick as `lint_ambiguous`. (its also easy to reverse the behaviour of this change). Also added a test with 2 revisions placing the `as _` export first or last. It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :). cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case. LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.
Fixes #160742
When inserting candidates for a method pick we deduplicate candidates based on the trait id, this "deleted" traits that where (not) ambiguous:
This caused the lint
ambiguous_glob_imported_traitsto not be triggered if theas _came first, even though both are actually in scope.We now deduplicate based on
(def_id, lint_ambiguous)and later check that if an ambiguous candidate is present incollapse_candidates_to_trait_pick, we mark the pick aslint_ambiguous. (its also easy to reverse the behaviour of this change).Also added a test with 2 revisions placing the
as _export first or last.It's the most "clean" way I could come up, hopefully someone more versed in this part of the compiler could tell me how it is done in a better way :).
cc @petrochenkov, since I feel like you know if the lint should be triggered or not in this case.
LLM disclosure: I used a LLM to create a shorter PR title, because i couldn't come up with a short one.