Auto merge of #101846 - chenyukang:fix-101793, r=davidtwco
Fix the wording of help msg for bitwise not Fixes #101793
This commit is contained in:
commit
b79b7d8b4e
@ -47,7 +47,7 @@ parser_invalid_comparison_operator = invalid comparison operator `{$invalid}`
|
||||
.spaceship_operator_invalid = `<=>` is not a valid comparison operator, use `std::cmp::Ordering`
|
||||
|
||||
parser_invalid_logical_operator = `{$incorrect}` is not a logical operator
|
||||
.note = unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
.note = unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
.use_amp_amp_for_conjunction = use `&&` to perform logical conjunction
|
||||
.use_pipe_pipe_for_disjunction = use `||` to perform logical disjunction
|
||||
|
||||
@ -55,7 +55,9 @@ parser_tilde_is_not_unary_operator = `~` cannot be used as a unary operator
|
||||
.suggestion = use `!` to perform bitwise not
|
||||
|
||||
parser_unexpected_token_after_not = unexpected {$negated_desc} after identifier
|
||||
.suggestion = use `!` to perform logical negation
|
||||
parser_unexpected_token_after_not_bitwise = use `!` to perform bitwise not
|
||||
parser_unexpected_token_after_not_logical = use `!` to perform logical negation
|
||||
parser_unexpected_token_after_not_default = use `!` to perform logical negation or bitwise not
|
||||
|
||||
parser_malformed_loop_label = malformed loop label
|
||||
.suggestion = use the correct loop label format
|
||||
|
@ -430,8 +430,32 @@ pub(crate) struct NotAsNegationOperator {
|
||||
#[primary_span]
|
||||
pub negated: Span,
|
||||
pub negated_desc: String,
|
||||
#[suggestion_short(applicability = "machine-applicable", code = "!")]
|
||||
pub not: Span,
|
||||
#[subdiagnostic]
|
||||
pub sub: NotAsNegationOperatorSub,
|
||||
}
|
||||
|
||||
#[derive(SessionSubdiagnostic)]
|
||||
pub enum NotAsNegationOperatorSub {
|
||||
#[suggestion_short(
|
||||
parser::unexpected_token_after_not_default,
|
||||
applicability = "machine-applicable",
|
||||
code = "!"
|
||||
)]
|
||||
SuggestNotDefault(#[primary_span] Span),
|
||||
|
||||
#[suggestion_short(
|
||||
parser::unexpected_token_after_not_bitwise,
|
||||
applicability = "machine-applicable",
|
||||
code = "!"
|
||||
)]
|
||||
SuggestNotBitwise(#[primary_span] Span),
|
||||
|
||||
#[suggestion_short(
|
||||
parser::unexpected_token_after_not_logical,
|
||||
applicability = "machine-applicable",
|
||||
code = "!"
|
||||
)]
|
||||
SuggestNotLogical(#[primary_span] Span),
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
|
@ -6,8 +6,9 @@
|
||||
InvalidComparisonOperatorSub, InvalidLogicalOperator, InvalidLogicalOperatorSub,
|
||||
LeftArrowOperator, LifetimeInBorrowExpression, MacroInvocationWithQualifiedPath,
|
||||
MalformedLoopLabel, MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray,
|
||||
NotAsNegationOperator, OuterAttributeNotAllowedOnIfElse, RequireColonAfterLabeledExpression,
|
||||
SnapshotParser, TildeAsUnaryOperator, UnexpectedTokenAfterLabel,
|
||||
NotAsNegationOperator, NotAsNegationOperatorSub, OuterAttributeNotAllowedOnIfElse,
|
||||
RequireColonAfterLabeledExpression, SnapshotParser, TildeAsUnaryOperator,
|
||||
UnexpectedTokenAfterLabel,
|
||||
};
|
||||
use super::pat::{CommaRecoveryMode, RecoverColon, RecoverComma, PARAM_EXPECTED};
|
||||
use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign};
|
||||
@ -660,12 +661,23 @@ fn is_mistaken_not_ident_negation(&self) -> bool {
|
||||
fn recover_not_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
|
||||
// Emit the error...
|
||||
let negated_token = self.look_ahead(1, |t| t.clone());
|
||||
|
||||
let sub_diag = if negated_token.is_numeric_lit() {
|
||||
NotAsNegationOperatorSub::SuggestNotBitwise
|
||||
} else if negated_token.is_bool_lit() {
|
||||
NotAsNegationOperatorSub::SuggestNotLogical
|
||||
} else {
|
||||
NotAsNegationOperatorSub::SuggestNotDefault
|
||||
};
|
||||
|
||||
self.sess.emit_err(NotAsNegationOperator {
|
||||
negated: negated_token.span,
|
||||
negated_desc: super::token_descr(&negated_token),
|
||||
// Span the `not` plus trailing whitespace to avoid
|
||||
// trailing whitespace after the `!` in our suggestion
|
||||
not: self.sess.source_map().span_until_non_whitespace(lo.to(negated_token.span)),
|
||||
sub: sub_diag(
|
||||
self.sess.source_map().span_until_non_whitespace(lo.to(negated_token.span)),
|
||||
),
|
||||
});
|
||||
|
||||
// ...and recover!
|
||||
|
@ -2,4 +2,9 @@
|
||||
|
||||
fn main() {
|
||||
let _x = !1; //~ ERROR cannot be used as a unary operator
|
||||
let _y = !1; //~ ERROR unexpected `1` after identifier
|
||||
let _z = !false; //~ ERROR unexpected keyword `false` after identifier
|
||||
let _a = !true; //~ ERROR unexpected keyword `true` after identifier
|
||||
let v = 1 + 2;
|
||||
let _v = !v; //~ ERROR unexpected `v` after identifier
|
||||
}
|
||||
|
@ -2,4 +2,9 @@
|
||||
|
||||
fn main() {
|
||||
let _x = ~1; //~ ERROR cannot be used as a unary operator
|
||||
let _y = not 1; //~ ERROR unexpected `1` after identifier
|
||||
let _z = not false; //~ ERROR unexpected keyword `false` after identifier
|
||||
let _a = not true; //~ ERROR unexpected keyword `true` after identifier
|
||||
let v = 1 + 2;
|
||||
let _v = not v; //~ ERROR unexpected `v` after identifier
|
||||
}
|
||||
|
@ -4,5 +4,37 @@ error: `~` cannot be used as a unary operator
|
||||
LL | let _x = ~1;
|
||||
| ^ help: use `!` to perform bitwise not
|
||||
|
||||
error: aborting due to previous error
|
||||
error: unexpected `1` after identifier
|
||||
--> $DIR/issue-41679-tilde-bitwise-negation-attempt.rs:5:18
|
||||
|
|
||||
LL | let _y = not 1;
|
||||
| ----^
|
||||
| |
|
||||
| help: use `!` to perform bitwise not
|
||||
|
||||
error: unexpected keyword `false` after identifier
|
||||
--> $DIR/issue-41679-tilde-bitwise-negation-attempt.rs:6:18
|
||||
|
|
||||
LL | let _z = not false;
|
||||
| ----^^^^^
|
||||
| |
|
||||
| help: use `!` to perform logical negation
|
||||
|
||||
error: unexpected keyword `true` after identifier
|
||||
--> $DIR/issue-41679-tilde-bitwise-negation-attempt.rs:7:18
|
||||
|
|
||||
LL | let _a = not true;
|
||||
| ----^^^^
|
||||
| |
|
||||
| help: use `!` to perform logical negation
|
||||
|
||||
error: unexpected `v` after identifier
|
||||
--> $DIR/issue-41679-tilde-bitwise-negation-attempt.rs:9:18
|
||||
|
|
||||
LL | let _v = not v;
|
||||
| ----^
|
||||
| |
|
||||
| help: use `!` to perform logical negation or bitwise not
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
|
@ -4,7 +4,7 @@ error: unexpected `for_you` after identifier
|
||||
LL | if not for_you {
|
||||
| ----^^^^^^^
|
||||
| |
|
||||
| help: use `!` to perform logical negation
|
||||
| help: use `!` to perform logical negation or bitwise not
|
||||
|
||||
error: unexpected `the_worst` after identifier
|
||||
--> $DIR/issue-46836-identifier-not-instead-of-negation.rs:11:15
|
||||
@ -12,13 +12,13 @@ error: unexpected `the_worst` after identifier
|
||||
LL | while not the_worst {
|
||||
| ----^^^^^^^^^
|
||||
| |
|
||||
| help: use `!` to perform logical negation
|
||||
| help: use `!` to perform logical negation or bitwise not
|
||||
|
||||
error: unexpected `println` after identifier
|
||||
--> $DIR/issue-46836-identifier-not-instead-of-negation.rs:20:9
|
||||
|
|
||||
LL | if not // lack of braces is [sic]
|
||||
| ----- help: use `!` to perform logical negation
|
||||
| ----- help: use `!` to perform logical negation or bitwise not
|
||||
LL | println!("Then when?");
|
||||
| ^^^^^^^
|
||||
|
||||
@ -42,7 +42,7 @@ error: unexpected `2` after identifier
|
||||
LL | let resource = not 2;
|
||||
| ----^
|
||||
| |
|
||||
| help: use `!` to perform logical negation
|
||||
| help: use `!` to perform bitwise not
|
||||
|
||||
error: unexpected `be_smothered_out_before` after identifier
|
||||
--> $DIR/issue-46836-identifier-not-instead-of-negation.rs:32:27
|
||||
@ -50,7 +50,7 @@ error: unexpected `be_smothered_out_before` after identifier
|
||||
LL | let young_souls = not be_smothered_out_before;
|
||||
| ----^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: use `!` to perform logical negation
|
||||
| help: use `!` to perform logical negation or bitwise not
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
|
@ -4,7 +4,7 @@ error: `and` is not a logical operator
|
||||
LL | let _ = a and b;
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:9:10
|
||||
@ -12,7 +12,7 @@ error: `and` is not a logical operator
|
||||
LL | if a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:20:15
|
||||
@ -20,7 +20,7 @@ error: `or` is not a logical operator
|
||||
LL | let _ = a or b;
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:22:10
|
||||
@ -28,7 +28,7 @@ error: `or` is not a logical operator
|
||||
LL | if a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:30:11
|
||||
@ -36,7 +36,7 @@ error: `and` is not a logical operator
|
||||
LL | if (a and b) {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:38:11
|
||||
@ -44,7 +44,7 @@ error: `or` is not a logical operator
|
||||
LL | if (a or b) {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:46:13
|
||||
@ -52,7 +52,7 @@ error: `and` is not a logical operator
|
||||
LL | while a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:54:13
|
||||
@ -60,7 +60,7 @@ error: `or` is not a logical operator
|
||||
LL | while a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-54109-and_instead_of_ampersands.rs:13:33
|
||||
|
@ -4,7 +4,7 @@ error: `and` is not a logical operator
|
||||
LL | let _ = a and b;
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:15:10
|
||||
@ -12,7 +12,7 @@ error: `and` is not a logical operator
|
||||
LL | if a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:24:15
|
||||
@ -20,7 +20,7 @@ error: `or` is not a logical operator
|
||||
LL | let _ = a or b;
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:26:10
|
||||
@ -28,7 +28,7 @@ error: `or` is not a logical operator
|
||||
LL | if a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:34:11
|
||||
@ -36,7 +36,7 @@ error: `and` is not a logical operator
|
||||
LL | if (a and b) {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:42:11
|
||||
@ -44,7 +44,7 @@ error: `or` is not a logical operator
|
||||
LL | if (a or b) {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `and` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:50:13
|
||||
@ -52,7 +52,7 @@ error: `and` is not a logical operator
|
||||
LL | while a and b {
|
||||
| ^^^ help: use `&&` to perform logical conjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: `or` is not a logical operator
|
||||
--> $DIR/issue-54109-without-witness.rs:58:13
|
||||
@ -60,7 +60,7 @@ error: `or` is not a logical operator
|
||||
LL | while a or b {
|
||||
| ^^ help: use `||` to perform logical disjunction
|
||||
|
|
||||
= note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators
|
||||
= note: unlike in e.g., Python and PHP, `&&` and `||` are used for logical operators
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user