Skip to content

Comma after struct expansion is a syntax error #41834

Closed
@Xion

Description

@Xion

On rustc 1.17:

struct Foo {
    one: i32,
    two: i32,
    three: i32,
}

impl Default for Foo {
    fn default() -> Self {
        Foo { one : 1, two: 2, three: 3 }
    }
}

fn main() {
    // this works
    let foo = Foo {
        one: 11,
        ..Foo::default()
    };
    // this is a syntax error
    let foo = Foo {
        one: 111,
        ..Foo::default(),
    };
}

(playground link: https://is.gd/2wvenA)

This feels very inconsistent, as Rust has no problems with extra commas anywhere else. It is also an extremely "natural" mistake to make, so even if it's rightly signaled & easily corrected, it is still quite annoying.

Activity

F001

F001 commented on May 9, 2017

@F001
Contributor

I agree this is annoying and need to be fixed.
@petrochenkov , I guess this minor issue doesn't require RFC process, right?
This issue seems related to https://github.com/rust-lang/rust/blob/master/src/libsyntax/parse/parser.rs#L2369 . I'll submit a fix soon.

qnighy

qnighy commented on May 9, 2017

@qnighy
Contributor

Rust has no problems with extra commas anywhere else.

Just for remark: the ... in extern "C" { fn foo(x: &str, ...); } doesn't allow a trailing comma either (in current Rust stable/nightly). I like the trailing comma for struct update syntax though!

nikomatsakis

nikomatsakis commented on May 26, 2017

@nikomatsakis
Contributor

So we discussed this some in the @rust-lang/lang meeting. I would say that opinions were mixed, but in general I think that we are inclined (for now) to leave this as is.

The arguments basically were as follows. First, everyone agreed that we actively do not want to allow ..Foo anywhere but at the end of a struct expression.

Given that, the argument in favor of allowing commas is essentially that people might expect to put it there because they always end lines with a comma (habit, essentially).

The argument against is that a trailing comma's main purpose is to avoid messy diffs and simplify macro authors lives, and @petrochenkov made a convincing case that neither applies here. Moreover, a trailing comma suggests that you can move things around in the list, and that you might put something afterwards, neither of which are true here. So including the comma is somewhat misleading.

Therefore, I think we're inclined to leave the grammar as is, and prohibit trailing commas after a ..Foo syntax in a struct.

added
A-parserArea: The lexing & parsing of Rust source code to an AST
A-diagnosticsArea: Messages for errors, warnings, and lints
on Jun 23, 2017
Mark-Simulacrum

Mark-Simulacrum commented on Jun 23, 2017

@Mark-Simulacrum
Member

Leaving this open to track improving the diagnostic here.

estebank

estebank commented on Oct 2, 2017

@estebank
Contributor

In order to avoid multiple errors after finding this comma, as it happens now, the comma has to be specifically accepted and a diagnostic generated for this case in particular, along the lines of

error: can't use a comma after struct expansion
  --> src/main.rs:22:25
   |
22 |         ..Foo::default(),
   |                         ^ help: remove this comma

The method libsyntax/parse/parser.rs:Parser::parse_struct_expr needs to be modified to accept expressions that end in a comma, but generate and emit a diagnostic error. You might need to modify the call to self.parse_expr and you can look at self.parse_field to see what might be the difference in handling. Adding an err.span_suggestion_short(comma_span, "remove this comma", "".to_owned()) to the generated error is enough to add the help line as shown above.

added
E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.
on Oct 2, 2017
added a commit that references this issue on Oct 13, 2017

Rollup merge of rust-lang#45178 - Badel2:comma-after-struct, r=petroc…

Phlosioneer

Phlosioneer commented on Oct 16, 2017

@Phlosioneer
Contributor

Triage: I think this should be closed now, because #45178 has now been merged into master as of 3 days ago.

4 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-parserArea: The lexing & parsing of Rust source code to an ASTC-enhancementCategory: An issue proposing an enhancement or a PR with one.E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.WG-diagnosticsWorking group: Diagnostics

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @qnighy@nikomatsakis@Xion@estebank@F001

        Issue actions

          Comma after struct expansion is a syntax error · Issue #41834 · rust-lang/rust