parser_invalid_block_macro_segment = cannot use a `block` macro fragment here
.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
.add_then_block = add a block here
.condition_possibly_unfinished = this binary operation is possibly unfinished
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)]
#[diag(parser_invalid_block_macro_segment)]
pub(crate) struct InvalidBlockMacroSegment {
InvalidNumLiteralSuffix, LabeledLoopInBreak, LeadingPlusNotSupported, LeftArrowOperator,
LifetimeInBorrowExpression, MacroInvocationWithQualifiedPath, MalformedLoopLabel,
MatchArmBodyWithoutBraces, MatchArmBodyWithoutBracesSugg, MissingCommaAfterMatchArm,
- MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray, NoFieldsForFnCall,
- NotAsNegationOperator, NotAsNegationOperatorSub, OctalFloatLiteralNotSupported,
- OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
+ MissingDotDot, MissingInInForLoop, MissingInInForLoopSub, MissingSemicolonBeforeArray,
+ NoFieldsForFnCall, NotAsNegationOperator, NotAsNegationOperatorSub,
+ OctalFloatLiteralNotSupported, OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
RequireColonAfterLabeledExpression, ShiftInterpretedAsGeneric, StructLiteralNotAllowedHere,
StructLiteralNotAllowedHereSugg, TildeAsUnaryOperator, UnexpectedTokenAfterLabel,
UnexpectedTokenAfterLabelSugg, WrapExpressionInParentheses,
}
self.recover_struct_comma_after_dotdot(exp_span);
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();
--- /dev/null
+#![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() {}
--- /dev/null
+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`.