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

Associate an allocator to boxes #58457

Closed
wants to merge 2 commits into from
Closed

Conversation

glandium
Copy link
Contributor

@glandium glandium commented Feb 14, 2019

This turns Box<T> into Box<T, A = Global>, with a A: Alloc bound
for impls.

Ideally, inherent methods like Box::new would be applied to
Box<T, A: Alloc + Default>, but as of now, that would be backwards
incompatible because it would require type annotations in places where
they currently aren't required.

impl FromIterator is not covered because it relies on Vec, which
would need allocator awareness.

DispatchFromDyn is left out or being generic over A because there
is no bound that would make it work currently. FnBox is left out
because it's related to DispatchFromDyn.

@rust-highfive
Copy link
Collaborator

r? @Mark-Simulacrum

(rust_highfive has picked a reviewer for you, use r? to override)

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Feb 14, 2019
@glandium
Copy link
Contributor Author

Cc: @SimonSapin

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:end:053dfaa0:start=1550131794107733276,finish=1550131795060649094,duration=952915818
$ git checkout -qf FETCH_HEAD
travis_fold:end:git.checkout

Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#pull-requests-and-security-restrictions
$ export SCCACHE_BUCKET=rust-lang-ci-sccache2
$ export SCCACHE_REGION=us-west-1
Setting environment variables from .travis.yml
$ export IMAGE=x86_64-gnu-llvm-6.0
---

[00:03:41] travis_fold:start:tidy
travis_time:start:tidy
tidy check
[00:03:41] tidy error: /checkout/src/liballoc/boxed.rs:819: line longer than 100 chars
[00:03:41] tidy error: /checkout/src/liballoc/boxed.rs:831: line longer than 100 chars
[00:03:43] some tidy checks failed
[00:03:43] 
[00:03:43] 
[00:03:43] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/tidy" "/checkout/src" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0/bin/cargo" "--no-vendor" "--quiet"
[00:03:43] 
[00:03:43] 
[00:03:43] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test src/tools/tidy
[00:03:43] Build completed unsuccessfully in 0:00:43
[00:03:43] Build completed unsuccessfully in 0:00:43
[00:03:43] make: *** [tidy] Error 1
[00:03:43] Makefile:68: recipe for target 'tidy' failed
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:07811662
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Thu Feb 14 08:13:48 UTC 2019
---
travis_time:end:02c0f0e8:start=1550132029647321317,finish=1550132029651571203,duration=4249886
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:0267e6a0
$ ln -s . checkout && for CORE in obj/cores/core.*; do EXE=$(echo $CORE | sed 's|obj/cores/core\.[0-9]*\.!checkout!\(.*\)|\1|;y|!|/|'); if [ -f "$EXE" ]; then printf travis_fold":start:crashlog\n\033[31;1m%s\033[0m\n" "$CORE"; gdb --batch -q -c "$CORE" "$EXE" -iex 'set auto-load off' -iex 'dir src/' -iex 'set sysroot .' -ex bt -ex q; echo travis_fold":"end:crashlog; fi; done || true
travis_fold:end:after_failure.4
travis_fold:start:after_failure.5
travis_time:start:038921a0
travis_time:start:038921a0
$ cat ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers || true
cat: ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers: No such file or directory
travis_fold:end:after_failure.5
travis_fold:start:after_failure.6
travis_time:start:20dd8622
$ dmesg | grep -i kill

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:end:0f619200:start=1550133308740812575,finish=1550133309708794144,duration=967981569
$ git checkout -qf FETCH_HEAD
travis_fold:end:git.checkout

Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#pull-requests-and-security-restrictions
$ export SCCACHE_BUCKET=rust-lang-ci-sccache2
$ export SCCACHE_REGION=us-west-1
Setting environment variables from .travis.yml
$ export IMAGE=x86_64-gnu-llvm-6.0
---
[01:09:51] .................................................................................................... 1500/2949
[01:10:01] .......................................................................i............................ 1600/2949
[01:10:15] .................................................................................................... 1700/2949
[01:10:28] .................................................................................................... 1800/2949
[01:10:39] ...............................................................................F.................... 1900/2949
[01:11:19] .................................................................................................... 2100/2949
[01:11:40] ................................................................................test [run-pass] run-pass/mpsc_stress.rs has been running for over 60 seconds
[01:11:42] .................... 2200/2949
[01:11:53] .....................................................................ii............................. 2300/2949
---
[01:13:37] 
[01:13:37] thread 'main' panicked at 'Some tests failed', src/tools/compiletest/src/main.rs:496:22
[01:13:37] 
[01:13:37] 
[01:13:37] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/compiletest" "--compile-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib" "--run-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-unknown-linux-gnu/lib" "--rustc-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "--src-base" "/checkout/src/test/run-pass" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/run-pass" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "run-pass" "--target" "x86_64-unknown-linux-gnu" "--host" "x86_64-unknown-linux-gnu" "--llvm-filecheck" "/usr/lib/llvm-6.0/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--target-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--docck-python" "/usr/bin/python2.7" "--lldb-python" "/usr/bin/python2.7" "--gdb" "/usr/bin/gdb" "--quiet" "--llvm-version" "6.0.0\n" "--system-llvm" "--cc" "" "--cxx" "" "--cflags" "" "--llvm-components" "" "--llvm-cxxflags" "" "--adb-path" "adb" "--adb-test-dir" "/data/tmp/work" "--android-cross-path" "" "--color" "always"
[01:13:37] 
[01:13:37] 
[01:13:37] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:13:37] Build completed unsuccessfully in 0:11:01
[01:13:37] Build completed unsuccessfully in 0:11:01
[01:13:37] make: *** [check] Error 1
[01:13:37] Makefile:48: recipe for target 'check' failed
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:1dcf5473
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Thu Feb 14 09:48:59 UTC 2019

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@glandium
Copy link
Contributor Author

Aha, this is something I had already hit in the allocator_api crate but didn't transpose to my rustc branch.

@kennytm
Copy link
Member

kennytm commented Feb 14, 2019

Previous attempts for reference: #55139, #50882 (all blocked by #52694 which has been closed).

@SimonSapin
Copy link
Contributor

How is Default related to the allocator handle being zero-size or DyspatchFromDyn? https://doc.rust-lang.org/std/default/trait.Default.html#implementors contains many non-zero-size types.

@glandium
Copy link
Contributor Author

How is Default related to the allocator handle being zero-size or DyspatchFromDyn? https://doc.rust-lang.org/std/default/trait.Default.html#implementors contains many non-zero-size types.

It's not related, what is is PhantomData. Default is used to get an allocator from nothing.

@glandium
Copy link
Contributor Author

It's not related, what is is PhantomData. Default is used to get an allocator from nothing.

And you won't be able to do anything useful with a non-ZST allocator since we're always using default().

@kennytm
Copy link
Member

kennytm commented Feb 14, 2019

This implementation means A::default() must be able to deallocate memory allocated from any instance of A. 😕

I think it's better just to implement the "quick and dirty" solution from #50882 (comment).

@glandium
Copy link
Contributor Author

This implementation means A::default() must be able to deallocate memory allocated from any instance of A. confused

I think it's better just to implement the "quick and dirty" solution from #50882 (comment).

2 things:

  • that doesn't address the compiler end of the "box can't be larger than a pointer" problem.
  • I have no clue how to even do it.

I'd rather have /something/ than wait even more for the above to be addressed.

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:end:0001dd24:start=1550141804655293538,finish=1550141806916553600,duration=2261260062
$ git checkout -qf FETCH_HEAD
travis_fold:end:git.checkout

Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#pull-requests-and-security-restrictions
$ export SCCACHE_BUCKET=rust-lang-ci-sccache2
$ export SCCACHE_REGION=us-west-1
Setting environment variables from .travis.yml
$ export IMAGE=x86_64-gnu-llvm-6.0
---
travis_time:start:test_codegen
Check compiletest suite=codegen mode=codegen (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
[01:12:02] 
[01:12:02] running 130 tests
[01:12:05] i..iii...iii..iiiiF....i.................i..i................i.....i.........ii...i..i.ii........... 100/130
[01:12:06] failures:
[01:12:06] 
[01:12:06] ---- [codegen] codegen/box-maybe-uninit.rs stdout ----
[01:12:06] 
[01:12:06] 
[01:12:06] error: verification with 'FileCheck' failed
[01:12:06] status: exit code: 1
[01:12:06] command: "/usr/lib/llvm-6.0/bin/FileCheck" "--input-file" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/box-maybe-uninit/box-maybe-uninit.ll" "/checkout/src/test/codegen/box-maybe-uninit.rs"
[01:12:06] ------------------------------------------
[01:12:06] 
[01:12:06] ------------------------------------------
[01:12:06] stderr:
[01:12:06] stderr:
[01:12:06] ------------------------------------------
[01:12:06] /checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/box-maybe-uninit/box-maybe-uninit.ll:28:2: error: CHECK-NOT: string occurred!
[01:12:06]  store i64 8, i64* %.fca.0.gep.i.i, align 8
[01:12:06]  ^
[01:12:06] /checkout/src/test/codegen/box-maybe-uninit.rs:11:16: note: CHECK-NOT: pattern specified here
[01:12:06]  // CHECK-NOT: store
[01:12:06] 
[01:12:06] ------------------------------------------
[01:12:06] 
[01:12:06] thread '[codegen] codegen/box-maybe-uninit.rs' panicked at 'explicit panic', src/tools/compiletest/src/runtest.rs:3295:9
---
[01:12:06] 
[01:12:06] thread 'main' panicked at 'Some tests failed', src/tools/compiletest/src/main.rs:496:22
[01:12:06] 
[01:12:06] 
[01:12:06] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/compiletest" "--compile-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib" "--run-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-unknown-linux-gnu/lib" "--rustc-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "--src-base" "/checkout/src/test/codegen" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "codegen" "--target" "x86_64-unknown-linux-gnu" "--host" "x86_64-unknown-linux-gnu" "--llvm-filecheck" "/usr/lib/llvm-6.0/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--target-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--docck-python" "/usr/bin/python2.7" "--lldb-python" "/usr/bin/python2.7" "--gdb" "/usr/bin/gdb" "--quiet" "--llvm-version" "6.0.0\n" "--system-llvm" "--cc" "" "--cxx" "" "--cflags" "" "--llvm-components" "" "--llvm-cxxflags" "" "--adb-path" "adb" "--adb-test-dir" "/data/tmp/work" "--android-cross-path" "" "--color" "always"
[01:12:06] 
[01:12:06] 
[01:12:06] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:12:06] Build completed unsuccessfully in 0:11:28
[01:12:06] Build completed unsuccessfully in 0:11:28
[01:12:06] make: *** [check] Error 1
[01:12:06] Makefile:48: recipe for target 'check' failed
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:012ebd40
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Thu Feb 14 12:09:05 UTC 2019

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@glandium
Copy link
Contributor Author

glandium commented Feb 14, 2019

Haha, moving off the box keyword broke codegen/box-maybe-uninit.rs. This means that even if Box::new is restored to use the box keyword, Box::new_in(MaybeUninit::uninitialized(), alloc) would still copy garbage from the stack.

@Mark-Simulacrum
Copy link
Member

r? @sfackler

@glandium
Copy link
Contributor Author

Also, the codegen/box-maybe-uninit.rs test is kind of biased... If it was using Box<MaybeUninit<[usize;40]>>, it wouldn't pass already.

What do we do about this? Keeping the box keyword where it's currently used means:

  • restoring Box::new and Box::pin to be unmodified, not much of a problem
  • using specialization for Default and Clone to use the box keyword for Global

That's all artificial to keep things nicer for Global, at the cost of silently making things "bad" for other allocators.

@glandium
Copy link
Contributor Author

In fact, it doesn't even pass with Box<MaybeUninit<[usize;2]>>. Funnily enough, it does pass for Box<MaybeUninit<(usize, usize)>>.

@glandium
Copy link
Contributor Author

And it fails for Box<MaybeUninit<(usize, usize, usize)>>. I'm ready to say this test is not very useful...

@SimonSapin
Copy link
Contributor

I see, in this PR the Box struct contains a field with type PhantomData<A> rather than A, and uses Default every time it needs a value of type A.

I think this hack can be useful to experiment with e.g. adding a type parameter and see the effects on type inference, find bugs in the compiler, etc. However I think we maybe shouldn’t land it: it’s reasonable for an allocator that has per-instance state to implement Default for its constructor, and this PR would end up using different instance to manage the same box.

@glandium
Copy link
Contributor Author

@SimonSapin Your message makes me realize there's something fundamentally dangerous with Alloc. What kind of state could be kept in an Alloc that would be kept inside each and every box associated with it? None that could be created with Default, if you ask me.

In case the above is not entirely clear, take this example:

struct StatefulAlloc {
    next_free: *mut u8,
}

impl Alloc for StatefulAlloc { ... }

// Do stuff with Box<T, StatefulAlloc>

I don't see actual examples where the above uses would make sense.

However

impl<'a> Alloc for &'a StatefulAlloc { ... }

// Do stuff with Box<T, &StatefulAlloc>

does make sense. An alternative would be

struct MyGlobalStatefulAlloc;

static mut MyGlobalAllocState: StatefulAlloc = StatefulAlloc::default();

impl Alloc for MyGlobalStatefulAlloc { /* impl using MyGlobalAllocState */ }

IOW, the usecases are either ZSTs or refs, and other kinds of types make little sense. And a generic Alloc doesn't put such restrictions. Without such restrictions, you can be sure a lot of people are actually going to shoot themselves in the foot like in the first example above.

@SimonSapin
Copy link
Contributor

That’s a good point. In my previous message I somewhat confused an allocator "instance" (which could be shared between many Boxes and Vecs etc) and the "handle" to it kept inside each Box struct.

So it’s true that the "bad" cases are probably not useful, but Default is still not the correct bound for this IMO.

the compiler itself only really supports ZSTs for the extra fields in the Box type, and DyspatchFromDyn only allows PhantomData extra fields

Those might be dependent bugs that should be fixed before we can land this.

@phil-opp
Copy link
Contributor

struct StatefulAlloc {
    next_free: *mut u8,
}

impl Alloc for StatefulAlloc { ... }

// Do stuff with Box<T, StatefulAlloc>

I don't see actual examples where the above uses would make sense.

Maybe not for Box, but it could make sense for Vec and other growable collection types. For example, a critical Vec could use it's own heap area to guarantee that it won't be affected when the rest of the program runs out of memory. By taking ownership of the Alloc instance, there is no synchronization overhead.

@Ericson2314
Copy link
Contributor

I really would like to land something, no matter how piecemeal, just to make forward progress. For example, once @glandium lands something, I can use the same hacks that end up being used to get #52420 to work, in parallel to people trying to obviate those hacks. As long as the stable APIs of things aren't broken, it should be OK, right?

@@ -83,7 +84,7 @@ use crate::str::from_boxed_utf8_unchecked;
#[lang = "owned_box"]
#[fundamental]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct Box<T: ?Sized>(Unique<T>);
pub struct Box<T: ?Sized, A: Alloc + Default = Global>(Unique<T>, PhantomData<A>);
Copy link
Member

Choose a reason for hiding this comment

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

Curiosity: Why include the trait bounds here? I don't recall anywhere else the libraries do that when the definition of the type doesn't need something from one of the traits.

Also, this new type parameter is insta-stable, right? Is that a concern? (Would it work to make the lang item an unstable CustomBox<T, A>, and have type Box<T> = CustomBox<T, Global>; for now?)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Curiosity: Why include the trait bounds here?

I don't know, that kind of ensures the bounds on all the various impls are right?

Also, this new type parameter is insta-stable, right? Is that a concern?

Insta-stable, yes. A concern? I don't know.

(Would it work to make the lang item an unstable CustomBox<T, A>, and have type Box<T> = CustomBox<T, Global>; for now?)

Unfortunately, the compiler desugars such aliases when printing errors. See #50882 (comment) (the part about the extra parameter doesn't apply anymore)

@Ericson2314
Copy link
Contributor

When is the next rust release? It would be cool if we waited long enough for the #[cfg(stage0)] to go away again.

@mati865
Copy link
Contributor

mati865 commented Jun 10, 2019

@Ericson2314 https://forge.rust-lang.org/
It will be 04-07-2019.

@Ericson2314
Copy link
Contributor

Ericson2314 commented Jun 11, 2019

Oh right, beta.

[@mati865 I couldn't help myself but https://xkcd.com/1179/, my broken American brain can pull itself together for the ISO standard, but flails around confronted with anything else consistent as it may be.]

This turns `Box<T>` into `Box<T, A = Global>`, with a `A: Alloc` bound
for impls.

Ideally, inherent methods like `Box::new` would be applied to
`Box<T, A: Alloc + Default>`, but as of now, that would be backwards
incompatible because it would require type annotations in places where
they currently aren't required.

`impl FromIterator` is not covered because it relies on `Vec`, which
would need allocator awareness.

`DispatchFromDyn` is left out or being generic over `A` because there
is no bound that would make it work currently. `FnBox` is left out
because it's related to `DispatchFromDyn`.
@glandium
Copy link
Contributor Author

beta already has what it takes to build without #[cfg(stage0)].

@Ericson2314
Copy link
Contributor

@glandium I'd thought for bootstrapping purposes we'd need to wait another cycle for it to hit stable. But, glad to be wrong in any event!

@JohnCSimon
Copy link
Member

Pinging @glandium from triage - this PR has sat idle for more than a month.

@JohnCSimon
Copy link
Member

Pinging @glandium from triage - giving this one more week before closing for inactivity

@JohnTitor
Copy link
Member

Landing this should be blocked on resolving rust-lang/wg-allocators#2 one way or another, in my opinion.

Ping from triage: @glandium @SimonSapin, is this still blocked by the above comment? If so, this may be labeled as S-blocked.

@SimonSapin SimonSapin added the S-blocked Status: Marked as blocked ❌ on something else such as an RFC or other implementation work. label Aug 4, 2019
@SimonSapin
Copy link
Contributor

Yes it is. Added the label.

@hdhoang hdhoang removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Aug 16, 2019
@ObsidianMinor
Copy link
Contributor

Should another into_raw function be added that returns the allocator used? For example an into_raw_from that looks something like

pub fn into_raw_from(b: Box<T, A>) -> (*mut T, A) {
    let (u, a) = Box::into_raw_non_null(b);
    (u.as_ptr(), a)
}
pub fn into_raw_non_null_from(b: Box<T, A>) -> (NonNull<T>, A) {
    let (u, a) = Box::into_unique_from(b);
    (u.into(), a)
}
pub fn into_raw_unique_from(b: Box<T, A>) -> (Unique<T>, A) {
    let mut unique = b.0;
    let allocator = b.1;
    mem::forget(b);
    unsafe { (Unique::new_unchecked(unique.as_mut() as *mut T), allocator) }
}

This way it's possible to round-trip from box <-> pointer with an allocator.

@TimDiekmann
Copy link
Member

TimDiekmann commented Oct 1, 2019

@ObsidianMinor Sadly it's not possible that easy as A does not necessarily implements Copy. You cannot move out of a struct twice, or destructuring a struct, which implement Drop.

However a while ago I had a solution for this problem, but I can't remember right now.

Edit: If I remember corretly, it was some magic with ManuallyDrop and ptr::read.

@hdhoang
Copy link
Contributor

hdhoang commented Nov 28, 2019

from triaging, I would like to close this PR until the blocking discussion is resolved:

Landing this should be blocked on resolving rust-lang/wg-allocators#2 one way or another, in my opinion.

Thank you for your work, let's reopen and continue when we can make progress.

@hdhoang hdhoang closed this Nov 28, 2019
@hdhoang hdhoang added S-blocked-closed and removed S-blocked Status: Marked as blocked ❌ on something else such as an RFC or other implementation work. labels Nov 28, 2019
bors added a commit to rust-lang-ci/rust that referenced this pull request Oct 26, 2020
Support custom allocators in `Box`

r? `@Amanieu`

This pull request requires a crater run.

### Prior work:
- rust-lang#71873
- rust-lang#58457
- [`alloc-wg`](https://github.com/TimDiekmann/alloc-wg)-crate

Currently blocked on:
- ~rust-lang#77118~
- ~rust-lang/chalk#615 (rust-lang#77515)~
@TimDiekmann
Copy link
Member

In case anyone subscribed here and want an update: #77187 just got merged 🚀

@jyn514 jyn514 added S-blocked Status: Marked as blocked ❌ on something else such as an RFC or other implementation work. and removed S-blocked-closed labels Mar 10, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-blocked Status: Marked as blocked ❌ on something else such as an RFC or other implementation work.
Projects
None yet
Development

Successfully merging this pull request may close these issues.