fix #102806, suggest use .. to fill in the rest of the fields of Struct
This commit is contained in:
parent
6718ea1cff
commit
1e25882944
@ -112,6 +112,9 @@ parser_missing_semicolon_before_array = expected `;`, found `[`
|
|||||||
parser_invalid_block_macro_segment = cannot use a `block` macro fragment here
|
parser_invalid_block_macro_segment = cannot use a `block` macro fragment here
|
||||||
.label = the `block` fragment is within this context
|
.label = the `block` fragment is within this context
|
||||||
|
|
||||||
|
parser_expect_dotdot_not_dotdotdot = expected `..`, found `...`
|
||||||
|
.suggestion = use `..` to fill in the rest of the fields
|
||||||
|
|
||||||
parser_if_expression_missing_then_block = this `if` expression is missing a block after the condition
|
parser_if_expression_missing_then_block = this `if` expression is missing a block after the condition
|
||||||
.add_then_block = add a block here
|
.add_then_block = add a block here
|
||||||
.condition_possibly_unfinished = this binary operation is possibly unfinished
|
.condition_possibly_unfinished = this binary operation is possibly unfinished
|
||||||
|
@ -368,6 +368,15 @@ pub(crate) struct MissingSemicolonBeforeArray {
|
|||||||
pub semicolon: Span,
|
pub semicolon: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parser_expect_dotdot_not_dotdotdot)]
|
||||||
|
pub(crate) struct MissingDotDot {
|
||||||
|
#[primary_span]
|
||||||
|
pub token_span: Span,
|
||||||
|
#[suggestion_verbose(applicability = "maybe-incorrect", code = "..")]
|
||||||
|
pub sugg_span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(parser_invalid_block_macro_segment)]
|
#[diag(parser_invalid_block_macro_segment)]
|
||||||
pub(crate) struct InvalidBlockMacroSegment {
|
pub(crate) struct InvalidBlockMacroSegment {
|
||||||
|
@ -20,9 +20,9 @@ use crate::errors::{
|
|||||||
InvalidNumLiteralSuffix, LabeledLoopInBreak, LeadingPlusNotSupported, LeftArrowOperator,
|
InvalidNumLiteralSuffix, LabeledLoopInBreak, LeadingPlusNotSupported, LeftArrowOperator,
|
||||||
LifetimeInBorrowExpression, MacroInvocationWithQualifiedPath, MalformedLoopLabel,
|
LifetimeInBorrowExpression, MacroInvocationWithQualifiedPath, MalformedLoopLabel,
|
||||||
MatchArmBodyWithoutBraces, MatchArmBodyWithoutBracesSugg, MissingCommaAfterMatchArm,
|
MatchArmBodyWithoutBraces, MatchArmBodyWithoutBracesSugg, MissingCommaAfterMatchArm,
|
||||||
MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray, NoFieldsForFnCall,
|
MissingDotDot, MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray,
|
||||||
NotAsNegationOperator, NotAsNegationOperatorSub, OctalFloatLiteralNotSupported,
|
NoFieldsForFnCall, NotAsNegationOperator, NotAsNegationOperatorSub,
|
||||||
OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
|
OctalFloatLiteralNotSupported, OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
|
||||||
RequireColonAfterLabeledExpression, ShiftInterpretedAsGeneric, StructLiteralNotAllowedHere,
|
RequireColonAfterLabeledExpression, ShiftInterpretedAsGeneric, StructLiteralNotAllowedHere,
|
||||||
StructLiteralNotAllowedHereSugg, TildeAsUnaryOperator, UnexpectedTokenAfterLabel,
|
StructLiteralNotAllowedHereSugg, TildeAsUnaryOperator, UnexpectedTokenAfterLabel,
|
||||||
UnexpectedTokenAfterLabelSugg, WrapExpressionInParentheses,
|
UnexpectedTokenAfterLabelSugg, WrapExpressionInParentheses,
|
||||||
@ -2897,6 +2897,21 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
self.recover_struct_comma_after_dotdot(exp_span);
|
self.recover_struct_comma_after_dotdot(exp_span);
|
||||||
break;
|
break;
|
||||||
|
} else if self.token == token::DotDotDot {
|
||||||
|
// suggest `..v` instead of `...v`
|
||||||
|
let snapshot = self.create_snapshot_for_diagnostic();
|
||||||
|
let span = self.token.span;
|
||||||
|
self.bump();
|
||||||
|
match self.parse_expr() {
|
||||||
|
Ok(_p) => {
|
||||||
|
self.sess.emit_err(MissingDotDot { token_span: span, sugg_span: span });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Err(inner_err) => {
|
||||||
|
inner_err.cancel();
|
||||||
|
self.restore_snapshot(snapshot);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let recovery_field = self.find_struct_error_after_field_looking_code();
|
let recovery_field = self.find_struct_error_after_field_looking_code();
|
||||||
|
22
src/test/ui/parser/issue-102806.rs
Normal file
22
src/test/ui/parser/issue-102806.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
struct V3 {
|
||||||
|
x: f32,
|
||||||
|
y: f32,
|
||||||
|
z: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pz(v: V3) {
|
||||||
|
let _ = V3 { z: 0.0, ...v};
|
||||||
|
//~^ ERROR expected `..`
|
||||||
|
//~| ERROR missing fields `x` and `y` in initializer of `V3`
|
||||||
|
let _ = V3 { z: 0.0, ... };
|
||||||
|
//~^ expected identifier
|
||||||
|
//~| ERROR missing fields `x` and `y` in initializer of `V3`
|
||||||
|
|
||||||
|
let _ = V3 { z: 0.0, ...Default::default() };
|
||||||
|
//~^ ERROR expected `..`
|
||||||
|
//~| ERROR missing fields `x` and `y` in initializer of `V3`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
51
src/test/ui/parser/issue-102806.stderr
Normal file
51
src/test/ui/parser/issue-102806.stderr
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
error: expected `..`, found `...`
|
||||||
|
--> $DIR/issue-102806.rs:10:26
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ...v};
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
help: use `..` to fill in the rest of the fields
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ..v};
|
||||||
|
| ~~
|
||||||
|
|
||||||
|
error: expected identifier, found `...`
|
||||||
|
--> $DIR/issue-102806.rs:13:26
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ... };
|
||||||
|
| -- ^^^ expected identifier
|
||||||
|
| |
|
||||||
|
| while parsing this struct
|
||||||
|
|
||||||
|
error: expected `..`, found `...`
|
||||||
|
--> $DIR/issue-102806.rs:17:26
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ...Default::default() };
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
help: use `..` to fill in the rest of the fields
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ..Default::default() };
|
||||||
|
| ~~
|
||||||
|
|
||||||
|
error[E0063]: missing fields `x` and `y` in initializer of `V3`
|
||||||
|
--> $DIR/issue-102806.rs:10:13
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ...v};
|
||||||
|
| ^^ missing `x` and `y`
|
||||||
|
|
||||||
|
error[E0063]: missing fields `x` and `y` in initializer of `V3`
|
||||||
|
--> $DIR/issue-102806.rs:13:13
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ... };
|
||||||
|
| ^^ missing `x` and `y`
|
||||||
|
|
||||||
|
error[E0063]: missing fields `x` and `y` in initializer of `V3`
|
||||||
|
--> $DIR/issue-102806.rs:17:13
|
||||||
|
|
|
||||||
|
LL | let _ = V3 { z: 0.0, ...Default::default() };
|
||||||
|
| ^^ missing `x` and `y`
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0063`.
|
Loading…
x
Reference in New Issue
Block a user