Skip to content

Move promotion rule application to C front-end [blocks: #3725, #3800] #3770

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

Merged
merged 2 commits into from
Feb 27, 2019

Conversation

tautschnig
Copy link
Collaborator

The front-ends handle type conversion when doing arithmetic over enum types. The
case of an enum tag is not expected in goto-program conversion. That, however,
was only the case for some operators. Made the C front-end properly handle all
assignment operators.

  • Each commit message has a non-empty body, explaining why the change was made.
  • n/a Methods or procedures I have added are documented, following the guidelines provided in CODING_STANDARD.md.
  • n/a The feature or user visible behaviour I have added or modified has been documented in the User Guide in doc/cprover-manual/
  • Regression or unit tests are included, or existing tests cover the modified code (in this case I have detailed which ones those are in the commit message).
  • n/a My commit message includes data points confirming performance improvements (if claimed).
  • My PR is restricted to a single feature or bugfix.
  • n/a White-space or formatting changes outside the feature-related changed lines are in commits of their own.

Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: 965d458).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/97133012

@tautschnig
Copy link
Collaborator Author

Marked work-in-progress: we should review all special-casing of ID_c_enum_tag (and indeed also ID_c_bool) in goto-programs.

@tautschnig tautschnig self-assigned this Jan 14, 2019
@tautschnig tautschnig assigned kroening and unassigned tautschnig Jan 31, 2019
@tautschnig tautschnig force-pushed the cleanup-promotion branch 2 times, most recently from bb4a135 to aa1b446 Compare February 1, 2019 13:18
Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: aa1b446).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/99429688

@tautschnig tautschnig changed the title Move promotion rule application to C front-end Move promotion rule application to C front-end [blocks: #3800] Feb 2, 2019
Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: 9f92ab9).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/101215749

Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: 3d01c87).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/101250611

Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: e254a6f).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/101349909

@tautschnig tautschnig changed the title Move promotion rule application to C front-end [blocks: #3800] Move promotion rule application to C front-end [blocks: #3725, #3800] Feb 21, 2019
Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: 1042845).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/102431450


// increment/decrement on underlying type
expr.op0() = typecast_exprt(expr.op0(), enum_type.subtype());
expr.type() = enum_type.subtype();
Copy link
Member

Choose a reason for hiding this comment

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

I would make that an implicit typecast.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I have added implicit_typecast_arithmetic(expr); - is that what you expected?

Copy link
Member

Choose a reason for hiding this comment

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

No, that's arithmetic promotion; I am not actually sure whether these are meant to happen to the underlying type of an enum.
What I meant is the ID_C_implicit_typecast annotation, which is used to distinguish an explicit cast from one added by the frontend.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I can't seem to find ID_C_implicit_typecast or indeed any other annotation that the implicit_typecast code would be adding?!


exprt new_lhs = skip_typecast(expr.op0());
rhs = typecast_exprt::conditional_cast(rhs, new_lhs.type());
rhs.add_source_location() = expr.source_location();
Copy link
Member

Choose a reason for hiding this comment

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

Same here.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This is outside the C front-end, I don't think I can use implicit_typecast(_arithmetic) here?!

Copy link
Member

Choose a reason for hiding this comment

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

Yes, you may have to add ID_C_implicit_typecast directly.

The front-ends handle type conversion when doing arithmetic over enum types. The
case of an enum tag is not expected in goto-program conversion. That, however,
was only the case for some operators. Made the C front-end properly handle all
assignment operators.

While at it, also support decrement operators over complex numbers. We already
did so for increment, decrement just requires the same special case.
Doing so during goto-program conversion will ensure we can generate appropriate
conversion checks.

Fixes: diffblue#4208
Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: 25e854f).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/102514059

@tautschnig tautschnig merged commit ba421e0 into diffblue:develop Feb 27, 2019
@tautschnig tautschnig deleted the cleanup-promotion branch February 27, 2019 16:16
Copy link
Contributor

@allredj allredj left a comment

Choose a reason for hiding this comment

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

✔️
Passed Diffblue compatibility checks (cbmc commit: 2043025).
Build URL: https://travis-ci.com/diffblue/test-gen/builds/102521796

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

Successfully merging this pull request may close these issues.

5 participants