Check alias args for WF even if they have escaping bound vars by compiler-errors · Pull Request #123737 · rust-lang/rust (original) (raw)

Conversation

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters

[ Show hidden characters]({{ revealButtonHref }})

compiler-errors

What

This PR stops skipping arguments of aliases if they have escaping bound vars, instead recursing into them and only discarding the resulting obligations referencing bounds vars.

An example:

From the test:

trait Trait {
    type Gat<U: ?Sized>;
}

fn test<T>(f: for<'a> fn(<&'a T as Trait>::Gat<&'a [str]>)) where for<'a> &'a T: Trait {}
//~^ ERROR the size for values of type `[()]` cannot be known at compilation time

fn main() {}

We now prove that str: Sized in order for &'a [str] to be well-formed. We were previously unconditionally skipping over &'a [str] as it referenced a buond variable. We now recurse into it and instead only discard the [str]: 'a obligation because of the escaping bound vars.

Why?

This is a change that improves consistency about proving well-formedness earlier in the pipeline, which is necessary for future work on where-bounds in binders and correctly handling higher-ranked implied bounds. I don't expect this to fix any unsoundness.

What doesn't it fix?

Specifically, this doesn't check projection predicates' components are well-formed, because there are too many regressions: #123737 (comment)

@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

Apr 10, 2024

@rustbot

@compiler-errors

@compiler-errors

bors added a commit to rust-lang-ci/rust that referenced this pull request

Apr 10, 2024

@bors

Check alias args for WF even if they have escaping bound vars

r? @ghost

@bors

@bors

☀️ Try build successful - checks-actions
Build commit: 5946bac (5946bac294aa8e579f74aa4a4d1f443d3b5d89f8)

@lcnr

This comment was marked as outdated.

@craterbot

This comment was marked as outdated.

@lcnr

@craterbot

@craterbot

🚧 Experiment pr-123737 is now running

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot

@compiler-errors

Well, this still isn't just enforcing alias types wf, since we also call compute_alias on projection predicates. Let me see what the fallout is just for alias types.

@compiler-errors

@bors

bors added a commit to rust-lang-ci/rust that referenced this pull request

Apr 15, 2024

@bors

Check alias args for WF even if they have escaping bound vars

r? @ghost

@bors

☀️ Try build successful - checks-actions
Build commit: 8d9ad77 (8d9ad7790f77ffaa434059a58807949d4583c045)

@compiler-errors

@craterbot

@craterbot

🚧 Experiment pr-123737-1 is now running

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot

@rfcbot

🔔 This is now entering its final comment period, as per the review above. 🔔

@nikomatsakis

That said, I don't think my concern needs to block this change...

@rfcbot reviewed

@rfcbot

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

This will be merged soon.

@lcnr

@bors

📌 Commit 994b58f has been approved by lcnr

It is now in the queue for this repository.

@bors

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

@bors bors 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

Jul 2, 2024

@bors

@bors

@rust-timer

Finished benchmarking commit (d163e5e): comparison URL.

Overall result: ❌✅ regressions and improvements - ACTION NEEDED

Next Steps: If you can justify the regressions found in this perf run, please indicate this with @rustbot label: +perf-regression-triaged along with sufficient written justification. If you cannot justify the regressions please open an issue or create a new PR that fixes the regressions, add a comment linking to the newly created issue or PR, and then add the perf-regression-triaged label to this PR.

@rustbot label: +perf-regression
cc @rust-lang/wg-compiler-performance

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

mean range count
Regressions ❌ (primary) 0.5% [0.5%, 0.5%] 1
Regressions ❌ (secondary) 0.7% [0.4%, 1.1%] 4
Improvements ✅ (primary) -0.2% [-0.2%, -0.2%] 2
Improvements ✅ (secondary) - - 0
All ❌✅ (primary) 0.0% [-0.2%, 0.5%] 3

Max RSS (memory usage)

This benchmark run did not return any relevant results for this metric.

Cycles

Results (secondary 4.0%)

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌ (primary) - - 0
Regressions ❌ (secondary) 4.0% [3.0%, 6.3%] 5
Improvements ✅ (primary) - - 0
Improvements ✅ (secondary) - - 0
All ❌✅ (primary) - - 0

Binary size

This benchmark run did not return any relevant results for this metric.

Bootstrap: 695.519s -> 697.439s (0.28%)
Artifact size: 327.72 MiB -> 327.71 MiB (-0.00%)

@lcnr

I guess we're just doing slightly more work here? Not sure how we could fix this regression

github-actions bot pushed a commit to rust-lang/miri that referenced this pull request

Jul 4, 2024

@bors

Check alias args for WF even if they have escaping bound vars

What

This PR stops skipping arguments of aliases if they have escaping bound vars, instead recursing into them and only discarding the resulting obligations referencing bounds vars.

An example:

From the test:

trait Trait {
    type Gat<U: ?Sized>;
}

fn test<T>(f: for<'a> fn(<&'a T as Trait>::Gat<&'a [str]>)) where for<'a> &'a T: Trait {}
//~^ ERROR the size for values of type `[()]` cannot be known at compilation time

fn main() {}

We now prove that str: Sized in order for &'a [str] to be well-formed. We were previously unconditionally skipping over &'a [str] as it referenced a buond variable. We now recurse into it and instead only discard the [str]: 'a obligation because of the escaping bound vars.

Why?

This is a change that improves consistency about proving well-formedness earlier in the pipeline, which is necessary for future work on where-bounds in binders and correctly handling higher-ranked implied bounds. I don't expect this to fix any unsoundness.

What doesn't it fix?

Specifically, this doesn't check projection predicates' components are well-formed, because there are too many regressions: rust-lang/rust#123737 (comment)

@Kobzol

This change is required for further improvements of the type system, the compiler does a bit more work. The regression is limited to one stress test and one cargo benchmark.

@rustbot label: +perf-regression-triaged

lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request

Jul 11, 2024

@bors

Check alias args for WF even if they have escaping bound vars

What

This PR stops skipping arguments of aliases if they have escaping bound vars, instead recursing into them and only discarding the resulting obligations referencing bounds vars.

An example:

From the test:

trait Trait {
    type Gat<U: ?Sized>;
}

fn test<T>(f: for<'a> fn(<&'a T as Trait>::Gat<&'a [str]>)) where for<'a> &'a T: Trait {}
//~^ ERROR the size for values of type `[()]` cannot be known at compilation time

fn main() {}

We now prove that str: Sized in order for &'a [str] to be well-formed. We were previously unconditionally skipping over &'a [str] as it referenced a buond variable. We now recurse into it and instead only discard the [str]: 'a obligation because of the escaping bound vars.

Why?

This is a change that improves consistency about proving well-formedness earlier in the pipeline, which is necessary for future work on where-bounds in binders and correctly handling higher-ranked implied bounds. I don't expect this to fix any unsoundness.

What doesn't it fix?

Specifically, this doesn't check projection predicates' components are well-formed, because there are too many regressions: rust-lang/rust#123737 (comment)

tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request

Sep 11, 2024

@tmeijn

This MR contains the following updates:

Package Update Change
rust minor 1.80.1 -> 1.81.0

MR created with the help of el-capitano/tools/renovate-bot.

Proposed changes to behavior should be submitted there as MRs.


Release Notes

rust-lang/rust (rust)

v1.81.0

Compare Source

==========================

Language

Compiler

Libraries

Stabilized APIs

These APIs are now stable in const contexts:

Cargo

Compatibility Notes

Internal Changes

These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this MR and you won't be reminded about this update again.



This MR has been generated by Renovate Bot.

wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request

Sep 22, 2024

@he32

Pkgsrc changes:

Upstream changes:

Version 1.81.0 (2024-09-05)

Language

Compiler

Libraries

Stabilized APIs

These APIs are now stable in const contexts:

Cargo

Compatibility Notes

Internal Changes

These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request

Nov 24, 2024

@he32

Pkgsrc changes:

Upstream changes:

Version 1.81.0 (2024-09-05)

Language

Compiler

Libraries

Stabilized APIs

These APIs are now stable in const contexts:

Cargo

Compatibility Notes

Internal Changes

These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools.