Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Report higher-ranked trait error when higher-ranked projection goal fails in new solver by compiler-errors · Pull Request #139513 · rust-lang/rust · GitHub
Skip to content

Report higher-ranked trait error when higher-ranked projection goal fails in new solver - #139513

Merged
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj
Apr 10, 2025
Merged

Report higher-ranked trait error when higher-ranked projection goal fails in new solver#139513
bors merged 1 commit into
rust-lang:masterfrom
compiler-errors:higher-ranked-proj

Conversation

@compiler-errors

@compiler-errorscompiler-errors commented Apr 8, 2025

Copy link
Copy Markdown
Contributor

See HACK comment inline. Not actually sure if it should be marked as a HACK, b/c it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor smarter about the leak check than the actual trait solver itself.

Encountered this while battling with NiceRegionErrors in the old solver b/c I wondered what this code ended up giving us in the new solver as a comparison:

traitFoo{}impl<T:FnOnce(&())>FooforT{}fnbaz<T:Foo>(){}fnmain(){baz::<fn(&'static())>();}

On master it's pretty bad:

error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here

After this PR it's much better:

error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`

r? lcnr

@rustbotrustbot 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. WG-trait-system-refactor The Rustc Trait System Refactor Initiative (-Znext-solver) labels Apr 8, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

Comment threadtests/ui/mismatched_types/closure-mismatch.next.stderr Outdated
Comment threadcompiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs Outdated
@compiler-errors

Copy link
Copy Markdown
ContributorAuthor

Pulled this into another detect_* helper method, so it's consistent with the others.

@bors r=lcnr rollup

@bors

bors commented Apr 9, 2025

Copy link
Copy Markdown
Collaborator

📌 Commit f6faaee has been approved by lcnr

It is now in the queue for this repository.

@borsbors 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 Apr 9, 2025
/// `NormalizesTo` goal, so we don't fall back to the rigid projection check
/// that should catch when a projection goal fails due to an unsatisfied trait
/// goal.
fn detect_error_in_higher_ranked_projection(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
fndetect_error_in_higher_ranked_projection(
fndetect_trait_error_in_higher_ranked_projection(

r=me with this change

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Already got rolled up, and I don't think this is a significant enough change to kick it out of the rollup. I'll fold this into #139513 which is based off this one.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Unless this fails to merge in which case I'll amend this. I'll keep an eye on the rollup lol

bors added a commit to rust-lang-ci/rust that referenced this pull request Apr 9, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
@bors
bors merged commit 584cd13 into rust-lang:masterApr 10, 2025
@rustbotrustbot added this to the 1.88.0 milestone Apr 10, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 10, 2025
Rollup merge of rust-lang#139513 - compiler-errors:higher-ranked-proj, r=lcnr
Report higher-ranked trait error when higher-ranked projection goal fails in new solver
~~See HACK comment inline. Not actually sure if it should be marked as a *HACK*, b/c~~ it's kinda a legitimate case we want to care about unless we're going to make the proof tree visitor *smarter* about the leak check than the actual trait solver itself.
Encountered this while battling with `NiceRegionError`s in the old solver b/c I wondered what this code ended up giving us in the *new* solver as a comparison:
```rust
trait Foo {}
impl<T: FnOnce(&())> Foo for T {}
fn baz<T: Foo>() {}
fn main() {
baz::<fn(&'static ())>();
}
```
On master it's pretty bad:
```
error[E0271]: type mismatch resolving `<fn(&()) as FnOnce<(&(),)>>::Output == ()`
--> <source>:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ types differ
|
note: required for `fn(&'static ())` to implement `Foo`
--> <source>:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
```
After this PR it's much better:
```
error[E0277]: the trait bound `fn(&'static ()): Foo` is not satisfied
--> /home/mgx/test.rs:8:11
|
8 | baz::<fn(&'static ())>();
| ^^^^^^^^^^^^^^^ the trait `for<'a> FnOnce(&'a ())` is not implemented for `fn(&'static ())`
|
= note: expected a closure with arguments `(&'static (),)`
found a closure with arguments `(&(),)`
note: required for `fn(&'static ())` to implement `Foo`
--> /home/mgx/test.rs:3:22
|
3 | impl<T: FnOnce(&())> Foo for T {}
| ----------- ^^^ ^
| |
| unsatisfied trait bound introduced here
note: required by a bound in `baz`
--> /home/mgx/test.rs:5:11
|
5 | fn baz<T: Foo>() {}
| ^^^ required by this bound in `baz`
```
r? lcnr
Zalathar added a commit to Zalathar/rust that referenced this pull request Apr 11, 2025
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Apr 11, 2025
Rollup merge of rust-lang#139564 - compiler-errors:deeply-norm, r=lcnr
Deeply normalize obligations in `BestObligation` folder
Built on rust-lang#139513.
This establishes a somewhat rough invariant that the `Obligation`'s predicate is always deeply normalized in the folder; when we construct a new obligation we normalize it.
Putting this up for discussion since it does affect some goals.
r? lcnr
github-actionsBot pushed a commit to model-checking/verify-rust-std that referenced this pull request Apr 19, 2025
…iaskrgr
Rollup of 10 pull requests
Successful merges:
- rust-lang#138470 (Test interaction between RFC 2229 migration and use closures)
- rust-lang#138628 (Add more ergonomic clone tests)
- rust-lang#139164 (std: improve documentation for get_mut() methods regarding forgotten guards)
- rust-lang#139488 (Add missing regression GUI test)
- rust-lang#139489 (compiletest: Add directive `dont-require-annotations`)
- rust-lang#139513 (Report higher-ranked trait error when higher-ranked projection goal fails in new solver)
- rust-lang#139521 (triagebot: roll compiler reviewers for rustc/unstable book)
- rust-lang#139532 (Update `u8`-to-and-from-`i8` suggestions.)
- rust-lang#139551 (report call site of inlined scopes for large assignment lints)
- rust-lang#139575 (Remove redundant words)
r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-trait-system-refactorThe Rustc Trait System Refactor Initiative (-Znext-solver)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@compiler-errors@rustbot@bors@lcnr