Sitelet https://github.com/argotorg/fe/pull/1790
Skip to content

Converge summaries of self-recursive calls - #1790

Open
cburgdorf wants to merge 1 commit into
masterfrom
fix/recursive-summary-convergence
Open

cburgdorf wants to merge 1 commit into
masterfrom
fix/recursive-summary-convergence

Conversation

@cburgdorf

Copy link
Copy Markdown
Collaborator

A recursive call instantiates the summary being computed, mapping its summary choices to fresh call choices, and exporting the caller's summary renames those to new summary choices. Each fixed-point iteration therefore added the previous iteration's choices (two per iteration for a mut self method that writes a ByteBuffer in a loop and recurses), and the summary query hit its 16-iteration limit with "recursive boundary requirements did not converge".

Before numbering summary choices, quantify the choices of calls to the instance being summarized existentially in boundary and availability requirements, memory accesses, unavailable regions and native requirements. These are obligations or possible effects: a caller cannot observe the callee's private choices and must handle every execution anyway, as for loan requirements and repeated loop iterations. Must facts (reinitialized regions, poststates, coverage) and authorizers keep the choices.

Only direct self-recursion is widened; mutual recursion is unchanged.

A recursive call instantiates the summary being computed, mapping its
summary choices to fresh call choices, and exporting the caller's summary
renames those to new summary choices. Each fixed-point iteration therefore
added the previous iteration's choices (two per iteration for a `mut self`
method that writes a ByteBuffer in a loop and recurses), and the summary
query hit its 16-iteration limit with "recursive boundary requirements did
not converge".

Before numbering summary choices, quantify the choices of calls to the
instance being summarized existentially in boundary and availability
requirements, memory accesses, unavailable regions and native requirements.
These are obligations or possible effects: a caller cannot observe the
callee's private choices and must handle every execution anyway, as for
loan requirements and repeated loop iterations. Must facts (reinitialized
regions, poststates, coverage) and authorizers keep the choices.

Only direct self-recursion is widened; mutual recursion is unchanged.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-06T09:28:01.789829Z 4e92a34 PR opened
🔒 Security Review ✅ Completed 2026-10-06T09:26:48.922679Z 4e92a34 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4e92a34ad1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +107 to +110
for region in self
.requirements
.iter_mut()
.map(|requirement| &mut requirement.region)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Project recursive choices from populated boundary guards

When a recursive call's conditionally populated borrowed value is later stored, the corresponding BoundaryRequirement::populated region can retain that call's CallChoice guards. This loop only projects requirement.region, although abstract_choices subsequently renames both regions; the populated guard is therefore reimported under a fresh choice on the next fixed-point iteration and can still trigger recursive boundary requirements did not converge. Include requirement.populated in the recursive-choice projection as well.

Useful? React with 👍 / 👎.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant