Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add error description for E0436 #32899

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion src/librustc_typeck/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3405,6 +3405,52 @@ parameters. You can read more about it in the API documentation:
https://doc.rust-lang.org/std/marker/struct.PhantomData.html
"##,

E0436: r##"
A struct can include `..` to indicate that you want to use a copy of some other
struct for some of the values. This functional update syntax can only be used
on struct types. It is an error to use it on other types, such as enums.

Example of erroneous code:

```compile_fail
enum Foo {
A { x: u32, y: u32 }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still not correctly formatted.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@GuillaumeGomez I'm sorry, I'm not quite seeing it. It looks to me like it's formatted the same way as in the Enum docs. Could you explain what's wrong?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah yes indeed. Sorry, I didn't re-checked it.

}

fn bar() {
baz(Foo::A { x: 5, y: 10 });
}

fn baz(Foo f) -> Foo {
Foo::A { x: 6, ..f } // error: functional record update syntax requires
// a struct
}
```

To fix this, you need to manually initialize the value. For enums, you should
match on the variants and copy the values to the new enum value:

```
enum Foo {
A { x: u32, y: u32 }
}

fn bar() {
baz(Foo::A { x: 5, y: 10 });
}

fn baz(Foo f) -> Foo {
match f {
// Match each variant of the enum and bind each field to a name.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still not good.

Foo::A { y: y, .. } =>
// Create a new value of the same enum type, set the field you
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still difficult to read.

// want to update and the other fields that were bound.
Foo::A { x: 6, y: y },
}
}
```
"##,

E0439: r##"
The length of the platform-intrinsic function `simd_shuffle`
wasn't specified. Erroneous code example:
Expand Down Expand Up @@ -3759,7 +3805,6 @@ register_diagnostics! {
// type because its default value `{}` references the type `Self`"
E0399, // trait items need to be implemented because the associated
// type `{}` was overridden
E0436, // functional record update requires a struct
E0513, // no type for local variable ..
E0521 // redundant default implementations of trait
}