Skip to content

fix borrowck ICE for consts with fn pointer type - #160314

Open
im-lunex wants to merge 1 commit into
rust-lang:mainfrom
im-lunex:fix_#160255
Open

fix borrowck ICE for consts with fn pointer type#160314
im-lunex wants to merge 1 commit into
rust-lang:mainfrom
im-lunex:fix_#160255

Conversation

@im-lunex

@im-lunex im-lunex commented Aug 1, 2026

Copy link
Copy Markdown

borrowck's annotate_argument_and_return_for_borrow called tcx.fn_sig on the item being checked whenever its type was a fn def or fn ptr. For a const like const A: fn(), that asks for the signature of the const itself, which is not a function item, so we ICE'd with "unexpected sort of node in fn_sig".

Now we take the signature from the fn ptr type instead and skip the annotation when there's no fn decl to annotate.

also added a regression test under tests/ui/borrowck.

fixes: #160255

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Aug 1, 2026
@rustbot

rustbot commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the pull request, and welcome! The Rust Project is excited to review your changes, and you should hear from @davidtwco (or someone else) some time within the next two weeks.

Please see the contribution instructions for more information. Namely, in order to ensure the minimum review times lag, PR authors and assigned reviewers should ensure that the review label (S-waiting-on-review and S-waiting-on-author) stays updated, invoking these commands when appropriate:

  • @rustbot author: the review is finished, PR author should check the comments and take action accordingly
  • @rustbot review: the author is ready for a review, this PR will be queued again in the reviewer's queue
Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: compiler
  • compiler expanded to 75 candidates
  • Random selection from 17 candidates

@rust-log-analyzer

This comment has been minimized.

@TaKO8Ki

TaKO8Ki commented Aug 1, 2026

Copy link
Copy Markdown
Member

r? TaKO8Ki

@rustbot rustbot assigned TaKO8Ki and unassigned davidtwco Aug 1, 2026

@TaKO8Ki TaKO8Ki left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for working on this. For future contributions, please check whether an issue is already assigned or someone has started working on it before opening a PR. I had assigned 160255 to myself and had already begun preparing a fix, so this duplicated ongoing work. If an issue is already assigned, please ask the assignee before starting work on it.

View changes since this review

Comment thread tests/ui/borrowck/const-fn-ptr-borrow-annotation.rs Outdated
@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 1, 2026
@rustbot

rustbot commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

Comment thread compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs Outdated
@TaKO8Ki

TaKO8Ki commented Aug 1, 2026

Copy link
Copy Markdown
Member

@bors squash

@rust-bors

This comment has been minimized.

* fix borrowck ICE for consts with fn pointer type

annotate_argument_and_return_for_borrow called tcx.fn_sig on the item being
checked whenever its type was FnDef or FnPtr. for a const whose type is a fn
pointer that's not a function item, so we ICE'd with "unexpected sort of node
in fn_sig". take the signature from the fn ptr type instead and skip the
annotation when there's no fn decl.
* run rustfmt and refmt
* fix borrowck ICE for consts with fn pointer type

annotate_argument_and_return_for_borrow called tcx.fn_sig on the item being
checked whenever its type was FnDef or FnPtr. for a const whose type is a fn
pointer that's not a function item, so we ICE'd with "unexpected sort of node
in fn_sig". take the signature from the fn ptr type instead and skip the
annotation when there's no fn decl.
* edit comment
* use ty.fn_sig per review
@rust-bors

rust-bors Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🔨 5 commits were squashed into d443d45.

@im-lunex

im-lunex commented Aug 2, 2026

Copy link
Copy Markdown
Author

@rustbot ready

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Aug 2, 2026
@im-lunex
im-lunex requested a review from TaKO8Ki August 2, 2026 11:31

@TaKO8Ki TaKO8Ki left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@TaKO8Ki

TaKO8Ki commented Aug 3, 2026

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-bors Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📌 Commit d443d45 has been approved by TaKO8Ki

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 5. This pull request will be tested once the tree is reopened.

Reason for tree closure: spurious failures

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 3, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Aug 3, 2026
fix borrowck ICE for consts with fn pointer type

`borrowck`'s `annotate_argument_and_return_for_borrow` called `tcx.fn_sig` on the item being checked whenever its type was a `fn def` or `fn ptr`. For a const like `const A: fn()`, that asks for the signature of the const itself, which is not a function item, so we ICE'd with `"unexpected sort of node in fn_sig"`.

Now we take the signature from the `fn ptr` type instead and skip the annotation when there's no `fn decl` to annotate.

also added a regression test under `tests/ui/borrowck`.

fixes: rust-lang#160255
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Aug 3, 2026
fix borrowck ICE for consts with fn pointer type

`borrowck`'s `annotate_argument_and_return_for_borrow` called `tcx.fn_sig` on the item being checked whenever its type was a `fn def` or `fn ptr`. For a const like `const A: fn()`, that asks for the signature of the const itself, which is not a function item, so we ICE'd with `"unexpected sort of node in fn_sig"`.

Now we take the signature from the `fn ptr` type instead and skip the annotation when there's no `fn decl` to annotate.

also added a regression test under `tests/ui/borrowck`.

fixes: rust-lang#160255
rust-bors Bot pushed a commit that referenced this pull request Aug 3, 2026
…uwer

Rollup of 6 pull requests

Successful merges:

 - #159844 (Subtree cg_gcc sync (2026-07-24))
 - #160406 (`DepKind` cleanups)
 - #159303 (Fix ICE for direct inline const generic defaults)
 - #160314 (fix borrowck ICE for consts with fn pointer type)
 - #160322 (ElaborateBoxDeref: remove unnecessary projection)
 - #160384 (Add PR body notes for Cargo lock file maintenance)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Aug 3, 2026
fix borrowck ICE for consts with fn pointer type

`borrowck`'s `annotate_argument_and_return_for_borrow` called `tcx.fn_sig` on the item being checked whenever its type was a `fn def` or `fn ptr`. For a const like `const A: fn()`, that asks for the signature of the const itself, which is not a function item, so we ICE'd with `"unexpected sort of node in fn_sig"`.

Now we take the signature from the `fn ptr` type instead and skip the annotation when there's no `fn decl` to annotate.

also added a regression test under `tests/ui/borrowck`.

fixes: rust-lang#160255
rust-bors Bot pushed a commit that referenced this pull request Aug 3, 2026
…uwer

Rollup of 21 pull requests

Successful merges:

 - #159844 (Subtree cg_gcc sync (2026-07-24))
 - #159326 (Deny multiple EII impls on a single item)
 - #159535 (Optimize slice::contains for bytewise types)
 - #159595 (Promote loongarch32-unknown-none* to Tier 2)
 - #160007 (allow `-Ldependency` search paths for panic runtimes)
 - #160320 (point at trait definition when it is used as a derive macro)
 - #160369 (When suggesting method names, prefer *exact* doc aliases over similar names)
 - #160406 (`DepKind` cleanups)
 - #160424 (Use `thread::available_parallelism` as the default limit for backend parallelism)
 - #159014 ([rustdoc] Do not take `doc(cfg())` into account when filtering doctests)
 - #159303 (Fix ICE for direct inline const generic defaults)
 - #159977 (Add regression test for bool indexing codegen)
 - #160165 (reject `...` without pattern post-expansion)
 - #160295 (Fix rustdoc ICE when checking if a generic arg can be elided)
 - #160305 (Linkify C-SKY targets in `platform-support.md`)
 - #160314 (fix borrowck ICE for consts with fn pointer type)
 - #160322 (ElaborateBoxDeref: remove unnecessary projection)
 - #160338 (Add regression test for supertrait associated type normalization through dyn)
 - #160340 (Add regression test for unused_parens on contract clauses)
 - #160371 (Add doc aliases for transpositions `read_exact_buf` and `read_exact_buf_at`)
 - #160384 (Add PR body notes for Cargo lock file maintenance)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Aug 3, 2026
fix borrowck ICE for consts with fn pointer type

`borrowck`'s `annotate_argument_and_return_for_borrow` called `tcx.fn_sig` on the item being checked whenever its type was a `fn def` or `fn ptr`. For a const like `const A: fn()`, that asks for the signature of the const itself, which is not a function item, so we ICE'd with `"unexpected sort of node in fn_sig"`.

Now we take the signature from the `fn ptr` type instead and skip the annotation when there's no `fn decl` to annotate.

also added a regression test under `tests/ui/borrowck`.

fixes: rust-lang#160255
rust-bors Bot pushed a commit that referenced this pull request Aug 3, 2026
…uwer

Rollup of 23 pull requests

Successful merges:

 - #153749 (Account for ownership mismatch on argument that doesn't meet bound)
 - #159326 (Deny multiple EII impls on a single item)
 - #159535 (Optimize slice::contains for bytewise types)
 - #159595 (Promote loongarch32-unknown-none* to Tier 2)
 - #160007 (allow `-Ldependency` search paths for panic runtimes)
 - #160184 (Add -Zinstrument-mcount={fentry-nop-record,fentry-record})
 - #160320 (point at trait definition when it is used as a derive macro)
 - #160369 (When suggesting method names, prefer *exact* doc aliases over similar names)
 - #160406 (`DepKind` cleanups)
 - #160424 (Use `thread::available_parallelism` as the default limit for backend parallelism)
 - #159303 (Fix ICE for direct inline const generic defaults)
 - #159977 (Add regression test for bool indexing codegen)
 - #160011 (remove InterpError::map_err_info)
 - #160165 (reject `...` without pattern post-expansion)
 - #160295 (Fix rustdoc ICE when checking if a generic arg can be elided)
 - #160305 (Linkify C-SKY targets in `platform-support.md`)
 - #160314 (fix borrowck ICE for consts with fn pointer type)
 - #160322 (ElaborateBoxDeref: remove unnecessary projection)
 - #160338 (Add regression test for supertrait associated type normalization through dyn)
 - #160340 (Add regression test for unused_parens on contract clauses)
 - #160371 (Add doc aliases for transpositions `read_exact_buf` and `read_exact_buf_at`)
 - #160384 (Add PR body notes for Cargo lock file maintenance)
 - #160435 (bump tracing-tree)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Aug 3, 2026
fix borrowck ICE for consts with fn pointer type

`borrowck`'s `annotate_argument_and_return_for_borrow` called `tcx.fn_sig` on the item being checked whenever its type was a `fn def` or `fn ptr`. For a const like `const A: fn()`, that asks for the signature of the const itself, which is not a function item, so we ICE'd with `"unexpected sort of node in fn_sig"`.

Now we take the signature from the `fn ptr` type instead and skip the annotation when there's no `fn decl` to annotate.

also added a regression test under `tests/ui/borrowck`.

fixes: rust-lang#160255
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[ICE]: unexpected sort of node in fn_sig()

5 participants