Skip to content
New issue

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

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

Already on GitHub? # to your account

Fix unsized coercion of a struct element #1880

Merged
merged 3 commits into from
Nov 14, 2022

Conversation

celinval
Copy link
Contributor

@celinval celinval commented Nov 9, 2022

Description of changes:

Fix issues with how we are generating code for casting (#566, and #1528).

Restructure the unsize casting to be done in one pass instead with deep recursion (#1531). This also reuses the code from the reachability analysis, so we don't have to keep two ways of traversing the same structure.

Resolved issues:

Fixes #566
Fixes #1528
Fixes #1531

Related RFC:

Call-outs:

Testing:

  • How is this change tested? New tests

  • Is this a refactor change? Yes

Checklist

  • Each commit message has a non-empty body, explaining why the change was made
  • Methods or procedures are documented
  • Regression or unit tests are included, or existing tests cover the modified code
  • My PR is restricted to a single feature or bugfix

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 and MIT licenses.

Fix issues with how we are generating code for casting (model-checking#566, and model-checking#1528).

Restructure the unsize casting to be done in one pass instead with
deep recursion (model-checking#1531).

This also reuses the code from the reachability analysis, so we don't
have to keep two ways of traversing the same structure.
@celinval celinval requested a review from a team as a code owner November 9, 2022 23:38
Copy link
Contributor

@tedinski tedinski left a comment

Choose a reason for hiding this comment

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

minor comments

let mut field_type = src_goto_expr;
CoerceUnsizedIterator::new(self.tcx, src_mir_type, dst_mir_type)
.map(|info| {
let expr = if let Some(field_symbol) = info.field {
Copy link
Contributor

Choose a reason for hiding this comment

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

What does it mean if info doesn't have a field?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It means we are no longer traversing a structure. I.e.: we found the underlying pointer.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added some comments to see if it helps.

let dst_field_exprs = src_field_exprs
.into_iter()
.map(|(key, val)| {
let new_val = if info.field.unwrap().as_str().intern() == key {
Copy link
Contributor

Choose a reason for hiding this comment

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

Does this potentially intern strings we didn't need to?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't think so. Don't we intern the name of every field for every type already?

@celinval celinval merged commit ed24f69 into model-checking:main Nov 14, 2022
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
3 participants