fix(non_zero_suggestions): don't lint signed integer div/rem as NonZero#17385
Open
Lfan-ke wants to merge 1 commit into
Open
fix(non_zero_suggestions): don't lint signed integer div/rem as NonZero#17385Lfan-ke wants to merge 1 commit into
Lfan-ke wants to merge 1 commit into
Conversation
Collaborator
|
Thanks for the pull request, and welcome! The Rust Project is excited to review your changes, and you should hear from @llogiq (or someone else) some time within the next two weeks. Please see the contribution instructions for more information. Namely, in order to ensure the minimum review times lag, PR authors and assigned reviewers should ensure that the review label (
Why was this reviewer chosen?The reviewer was selected based on:
|
This comment has been minimized.
This comment has been minimized.
Div<NonZero<T>> and Rem<NonZero<T>> are only implemented for unsigned integer types in std. Suggesting NonZeroI* as the RHS of / or % produces code that fails to compile because those trait impls do not exist for signed types. Guard the div/rem path to only fire when the RHS type is ty::Uint. Signed-off-by: 林晨 (Leo Cheng) <leo-cheng@vip.qq.com>
a814a0d to
c1fdaa2
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #17382.
Div<NonZero<T>>andRem<NonZero<T>>are only implemented for unsigned integer types in std. The lint was suggestingNonZeroI*::from(x)as the RHS of/or%when the divisor was derived from a signedNonZerotype, which produces code that fails to compile:Root Cause
In
check_expr, theDiv | Rembranch calledcheck_non_zero_conversionunconditionally. Theget_target_non_zero_typefunction returnedNonZeroI*for signed types too, but the corresponding arithmetic impls do not exist in std.Fix
Guard the div/rem path: only call
check_non_zero_conversionwhen the RHS type isty::Uint(_). Signed types still benefit from the lint in non-div/rem contexts (e.g., plainlet x: i64 = i64::from(nz.get())→NonZeroI64::from(nz)).Test Plan
i64 / i64::from(nz.get())andi64 % i64::from(nz.get())totests/ui/non_zero_suggestions.rs- these must NOT trigger the lint.changelog: [
non_zero_suggestions] Fix false positive when suggesting NonZero for signed integer div/rem