Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tracking issue for RFC 2229, "Closures Capture Disjoint Fields" #53488

Closed
4 tasks
Centril opened this issue Aug 19, 2018 · 19 comments
Closed
4 tasks

Tracking issue for RFC 2229, "Closures Capture Disjoint Fields" #53488

Centril opened this issue Aug 19, 2018 · 19 comments
Assignees
Labels
A-closures B-RFC-approved C-tracking-issue T-lang

Comments

@Centril
Copy link
Contributor

@Centril Centril commented Aug 19, 2018

This is a tracking issue for the RFC "Closures Capture Disjoint Fields" (rust-lang/rfcs#2229).

Status

This is under active development by the wg-rfc-2229 compiler-team working group. You can track their progress on the project-rfc-2229 repository.

Implementation plan and status

See the RFC 2229 project board and milestones.

Links, see also

Unresolved questions:

  • How to optimize pointers. Can borrows that all reference parts of the same object be stored as a single pointer? How should this optimization be implemented (e.g. a special repr, refinement typing)?
  • How to signal that a function is pure. Is this even needed/wanted? Any other places where the language could benefit?
  • Should Box be special?
  • Drop order can change as a result of this RFC, is this a real stability problem? How should this be resolved?

This issue has been assigned to @arora-aman via this comment.

@Centril Centril added B-RFC-approved T-lang C-tracking-issue labels Aug 19, 2018
@eddyb
Copy link
Member

@eddyb eddyb commented Aug 19, 2018

IIRC, this needs to wait for the new MIR (NLL) borrow-checker to replace the old one.
cc @rust-lang/wg-compiler-nll

@samsartor
Copy link

@samsartor samsartor commented Aug 21, 2018

I would love to follow this through and give the code a shot, but it's probably too big of a first contribution to the compiler. Maybe I'll take a swing at some starter issues and then come back if no one else has gotten it done.

@eddyb Yes, this definitely should be built on NLL.

@blitzerr blitzerr self-assigned this Oct 29, 2018
pietroalbini added a commit to pietroalbini/rust that referenced this issue Nov 15, 2018
pietroalbini added a commit to pietroalbini/rust that referenced this issue Nov 15, 2018
bors added a commit that referenced this issue Nov 15, 2018
Rollup of 16 pull requests

Successful merges:

 - #55527 (Implement checked_add_duration for SystemTime)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55672 (miri: accept extern types in structs if they are the only field)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55867 (do not panic just because cargo failed)
 - #55871 (codegen_llvm_back: improve allocations)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor usfeful for mutation)
 - #55921 (Add placeholder types)
 - #55936 (save-analysis: be even more aggressive about ignorning macro-generated defs)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)

Failed merges:

r? @ghost
bors added a commit that referenced this issue Nov 16, 2018
Rollup of 16 pull requests

Successful merges:

 - #55527 (Implement checked_add_duration for SystemTime)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55672 (miri: accept extern types in structs if they are the only field)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55867 (do not panic just because cargo failed)
 - #55871 (codegen_llvm_back: improve allocations)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor usfeful for mutation)
 - #55921 (Add placeholder types)
 - #55936 (save-analysis: be even more aggressive about ignorning macro-generated defs)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)

Failed merges:

r? @ghost
pietroalbini added a commit to pietroalbini/rust that referenced this issue Nov 16, 2018
bors added a commit that referenced this issue Nov 16, 2018
Rollup of 15 pull requests

Successful merges:

 - #55527 (Implement checked_add_duration for SystemTime)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55672 (miri: accept extern types in structs if they are the only field)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55867 (do not panic just because cargo failed)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor usfeful for mutation)
 - #55921 (Add placeholder types)
 - #55936 (save-analysis: be even more aggressive about ignorning macro-generated defs)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)

Failed merges:

r? @ghost
kennytm added a commit to kennytm/rust that referenced this issue Nov 17, 2018
bors added a commit that referenced this issue Nov 17, 2018
Rollup of 17 pull requests

Successful merges:

 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55672 (miri: accept extern types in structs if they are the only field)
 - #55767 (Disable some pretty-printers when gdb is rust-enabled)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55857 (remove unused dependency)
 - #55867 (do not panic just because cargo failed)
 - #55916 (Make miri value visitor usfeful for mutation)
 - #55919 (core/tests/num: Simplify `test_int_from_str_overflow()` test code)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)
 - #55999 (Update Cargo submodule)
 - #56011 (Replace data.clone() by Arc::clone(&data) in mutex doc.)
 - #56012 (avoid shared ref in UnsafeCell::get)
 - #56017 (std: Add debugging for a failing test on appveyor)

Failed merges:

 - #56010 (fix intra-link resolution spans in block comments)

r? @ghost
pietroalbini added a commit to pietroalbini/rust that referenced this issue Nov 18, 2018
bors added a commit that referenced this issue Nov 19, 2018
Rollup of 25 pull requests

Successful merges:

 - #55562 (Add powerpc- and powerpc64-unknown-linux-musl targets)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55857 (remove unused dependency)
 - #55862 (in which the E0618 "expected function" diagnostic gets a makeover)
 - #55867 (do not panic just because cargo failed)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor usfeful for mutation)
 - #55919 (core/tests/num: Simplify `test_int_from_str_overflow()` test code)
 - #55923 (reword #[test] attribute error on fn items)
 - #55935 (appveyor: Use VS2017 for all our images)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)
 - #55968 (Clean up some non-mod-rs stuff.)
 - #55970 (Miri backtrace improvements)
 - #56007 (CTFE: dynamically make sure we do not call non-const-fn)
 - #56011 (Replace data.clone() by Arc::clone(&data) in mutex doc.)
 - #56012 (avoid shared ref in UnsafeCell::get)
 - #56016 (Add VecDeque::resize_with)
 - #56027 (docs: Add missing backtick in object_safety.rs docs)
 - #56043 (remove "approx env bounds" if we already know from trait)

Failed merges:

r? @ghost
bors added a commit that referenced this issue Nov 19, 2018
Rollup of 25 pull requests

Successful merges:

 - #55562 (Add powerpc- and powerpc64-unknown-linux-musl targets)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55857 (remove unused dependency)
 - #55862 (in which the E0618 "expected function" diagnostic gets a makeover)
 - #55867 (do not panic just because cargo failed)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor usfeful for mutation)
 - #55919 (core/tests/num: Simplify `test_int_from_str_overflow()` test code)
 - #55923 (reword #[test] attribute error on fn items)
 - #55935 (appveyor: Use VS2017 for all our images)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)
 - #55968 (Clean up some non-mod-rs stuff.)
 - #55970 (Miri backtrace improvements)
 - #56007 (CTFE: dynamically make sure we do not call non-const-fn)
 - #56011 (Replace data.clone() by Arc::clone(&data) in mutex doc.)
 - #56012 (avoid shared ref in UnsafeCell::get)
 - #56016 (Add VecDeque::resize_with)
 - #56027 (docs: Add missing backtick in object_safety.rs docs)
 - #56043 (remove "approx env bounds" if we already know from trait)

Failed merges:

r? @ghost
bors added a commit that referenced this issue Nov 19, 2018
Rollup of 26 pull requests

Successful merges:

 - #55562 (Add powerpc- and powerpc64-unknown-linux-musl targets)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55857 (remove unused dependency)
 - #55862 (in which the E0618 "expected function" diagnostic gets a makeover)
 - #55867 (do not panic just because cargo failed)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor useful for mutation)
 - #55919 (core/tests/num: Simplify `test_int_from_str_overflow()` test code)
 - #55923 (reword #[test] attribute error on fn items)
 - #55935 (appveyor: Use VS2017 for all our images)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)
 - #55968 (Clean up some non-mod-rs stuff.)
 - #55970 (Miri backtrace improvements)
 - #56007 (CTFE: dynamically make sure we do not call non-const-fn)
 - #56011 (Replace data.clone() by Arc::clone(&data) in mutex doc.)
 - #56012 (avoid shared ref in UnsafeCell::get)
 - #56016 (Add VecDeque::resize_with)
 - #56027 (docs: Add missing backtick in object_safety.rs docs)
 - #56043 (remove "approx env bounds" if we already know from trait)
 - #56059 (Increase `Duration` approximate equal threshold to 1us)
bors added a commit that referenced this issue Nov 19, 2018
Rollup of 26 pull requests

Successful merges:

 - #55562 (Add powerpc- and powerpc64-unknown-linux-musl targets)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55857 (remove unused dependency)
 - #55862 (in which the E0618 "expected function" diagnostic gets a makeover)
 - #55867 (do not panic just because cargo failed)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor useful for mutation)
 - #55919 (core/tests/num: Simplify `test_int_from_str_overflow()` test code)
 - #55923 (reword #[test] attribute error on fn items)
 - #55935 (appveyor: Use VS2017 for all our images)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)
 - #55968 (Clean up some non-mod-rs stuff.)
 - #55970 (Miri backtrace improvements)
 - #56007 (CTFE: dynamically make sure we do not call non-const-fn)
 - #56011 (Replace data.clone() by Arc::clone(&data) in mutex doc.)
 - #56012 (avoid shared ref in UnsafeCell::get)
 - #56016 (Add VecDeque::resize_with)
 - #56027 (docs: Add missing backtick in object_safety.rs docs)
 - #56043 (remove "approx env bounds" if we already know from trait)
 - #56059 (Increase `Duration` approximate equal threshold to 1us)
kennytm pushed a commit to pietroalbini/rust that referenced this issue Nov 19, 2018
bors added a commit that referenced this issue Nov 19, 2018
Rollup of 25 pull requests

Successful merges:

 - #55562 (Add powerpc- and powerpc64-unknown-linux-musl targets)
 - #55564 (test/linkage-visibility: Ignore on musl targets)
 - #55827 (A few tweaks to iterations/collecting)
 - #55834 (Forward the ABI of the non-zero sized fields of an union if they have the same ABI)
 - #55857 (remove unused dependency)
 - #55862 (in which the E0618 "expected function" diagnostic gets a makeover)
 - #55867 (do not panic just because cargo failed)
 - #55894 (miri enum discriminant handling: Fix treatment of pointers, better error when it is undef)
 - #55916 (Make miri value visitor useful for mutation)
 - #55919 (core/tests/num: Simplify `test_int_from_str_overflow()` test code)
 - #55923 (reword #[test] attribute error on fn items)
 - #55949 (ty: return impl Iterator from Predicate::walk_tys)
 - #55952 (Update to Clang 7 on CI.)
 - #55953 (#53488 Refactoring UpvarId)
 - #55962 (rustdoc: properly calculate spans for intra-doc link resolution errors)
 - #55963 (Stress test for MPSC)
 - #55968 (Clean up some non-mod-rs stuff.)
 - #55970 (Miri backtrace improvements)
 - #56007 (CTFE: dynamically make sure we do not call non-const-fn)
 - #56011 (Replace data.clone() by Arc::clone(&data) in mutex doc.)
 - #56012 (avoid shared ref in UnsafeCell::get)
 - #56016 (Add VecDeque::resize_with)
 - #56027 (docs: Add missing backtick in object_safety.rs docs)
 - #56043 (remove "approx env bounds" if we already know from trait)
 - #56059 (Increase `Duration` approximate equal threshold to 1us)
@ghedo
Copy link
Contributor

@ghedo ghedo commented Sep 5, 2019

@blitzerr could you please provide a status update on this? it looks like the related issues (#57482 and #60205) had some work done, but they look stuck now. Anything that needs help with? Not sure if I can do anything, but I can try :)

@tesuji
Copy link
Contributor

@tesuji tesuji commented May 15, 2020

I know. But with polonius, there might be support for self-referential types in the future. So for future design space we need to care about how to interact this feature with self-referential types.

@Ixrec
Copy link
Contributor

@Ixrec Ixrec commented May 16, 2020

This is the first I've heard of Polonius having anything to do with self-referential types, despite having read all the blog posts and docs behind your link. Is this interaction spelled out somewhere?

@KiChjang
Copy link
Member

@KiChjang KiChjang commented May 16, 2020

@Ixrec I do recall that there was a presentation from Niko that says it could maybe help with self-referential structs somehow, but he did preface it by saying that it's purely speculative: https://youtu.be/_agDeiWek8w?t=1900.

@nikomatsakis
Copy link
Contributor

@nikomatsakis nikomatsakis commented May 21, 2020

I'm not really aware of any particular interaction between this feature and self-referential types. Am I missing something?

@nikomatsakis
Copy link
Contributor

@nikomatsakis nikomatsakis commented Jun 8, 2020

@rustbot assign arora-aman

@rustbot
Copy link
Collaborator

@rustbot rustbot commented Jun 8, 2020

Error: Parsing assign command in comment failed: ...'arora-aman' | error: user should start with @ at >| ''...

Please let @rust-lang/release know if you're having trouble with this bot.

@varkor
Copy link
Member

@varkor varkor commented Jun 9, 2020

@rustbot assign @arora-aman

@rustbot rustbot self-assigned this Jun 9, 2020
@arora-aman
Copy link
Member

@arora-aman arora-aman commented Jun 22, 2020

@rustbot claim

@rustbot rustbot assigned rustbot and unassigned rustbot Jun 22, 2020
bors added a commit to rust-lang-ci/rust that referenced this issue Jul 14, 2020
rustc_typeck: construct {Closure,Generator}Substs more directly.

We've previously not had a way to create `{Closure,Generator}Substs` other than instantiating all generics as inference variables and unifying the inference types (extracted using the regular `{Closure,Generator}Substs` accessors), with the actual types.

With this PR, those hacks, and assumptions about the order of closure/generator-specific components, are replaced with a simple API where the base `Substs` are combined with the additional information into a `{Closure,Generator}Substs`.
This might also be faster than relying inference, although probably not by much.

r? @nikomatsakis cc rust-lang#53488 @blitzerr
@nikomatsakis nikomatsakis added this to Proposed in 2021 Edition Blockers Jul 30, 2020
Dylan-DPC-zz pushed a commit to Dylan-DPC-zz/rust that referenced this issue Aug 16, 2020
…matsakis

rustc_typeck: construct {Closure,Generator}Substs more directly.

We've previously not had a way to create `{Closure,Generator}Substs` other than instantiating all generics as inference variables and unifying the inference types (extracted using the regular `{Closure,Generator}Substs` accessors), with the actual types.

With this PR, those hacks, and assumptions about the order of closure/generator-specific components, are replaced with a simple API where the base `Substs` are combined with the additional information into a `{Closure,Generator}Substs`.
This might also be faster than relying inference, although probably not by much.

r? @nikomatsakis cc rust-lang#53488 @blitzerr
tmandry added a commit to tmandry/rust that referenced this issue Aug 16, 2020
…matsakis

rustc_typeck: construct {Closure,Generator}Substs more directly.

We've previously not had a way to create `{Closure,Generator}Substs` other than instantiating all generics as inference variables and unifying the inference types (extracted using the regular `{Closure,Generator}Substs` accessors), with the actual types.

With this PR, those hacks, and assumptions about the order of closure/generator-specific components, are replaced with a simple API where the base `Substs` are combined with the additional information into a `{Closure,Generator}Substs`.
This might also be faster than relying inference, although probably not by much.

r? @nikomatsakis cc rust-lang#53488 @blitzerr
@iamwwc
Copy link

@iamwwc iamwwc commented Jun 21, 2021

any update on this? Does the RFC has been implemented in rust?

@arora-aman
Copy link
Member

@arora-aman arora-aman commented Jun 21, 2021

any update on this? Does the RFC has been implemented in rust?

Yes it's available on the Rust nightly builds under #![feature(capture_disjoint_fields)].

On a somewhat side note we should probably update the tracking issue with the project board.

@iamwwc
Copy link

@iamwwc iamwwc commented Jun 21, 2021

any update on this? Does the RFC has been implemented in rust?

Yes it's available on the Rust nightly builds under #![feature(capture_disjoint_fields)].

On a somewhat side note we should probably update the tracking issue with the project board.

Yes, please, RFC tracking issue should reveal whether it has been implemented, and how to use it 😃. I believe that someone have same concerns with me

@nikomatsakis
Copy link
Contributor

@nikomatsakis nikomatsakis commented Aug 17, 2021

Stabilization proposed in #88126

@ehuss
Copy link
Contributor

@ehuss ehuss commented Oct 2, 2021

Since this is now stabilized, should this issue be closed?

@nikomatsakis
Copy link
Contributor

@nikomatsakis nikomatsakis commented Oct 5, 2021

Yes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-closures B-RFC-approved C-tracking-issue T-lang
Projects
None yet
Development

No branches or pull requests