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

Remove leaf bias from BTreeMap's BoxedNode and NodeRef #67980

Closed
wants to merge 3 commits into from

Conversation

ssomers
Copy link
Contributor

@ssomers ssomers commented Jan 7, 2020

Improve readability - there is no genuine problem here, after #56648.

BoxedNode and NodeRef contain a pointer to a node that is typed as LeafNode. In case of EMPTY_ROOT_NODE, that pointer may not be properly aligned and does not point to anything matching LeafNode<K, V>. Only NodeRef's documentation mentions this.

It seemed more logical to me to give these pointers as type the least common denominator, NodeHeader<K, V> (which only exists since #56648). That simplifies the simplest access as_header and levels the playing field for leaf and internal nodes.

One could argue that most nodes are in fact leaves, and most access to nodes is to their leaf-portion, keys and values. Then I'd still like to fix the documentation of BoxedNode.

@rust-highfive
Copy link
Collaborator

r? @cramertj

(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 Jan 7, 2020
@ssomers
Copy link
Contributor Author

ssomers commented Jan 7, 2020

One could assign this to @rkruppe since it was touched upon at the end of #67812

@cramertj
Copy link
Member

cramertj commented Jan 7, 2020

r? @rkruppe

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-7 of your PR failed (pretty log, 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.
2020-01-07T18:09:08.4077749Z ##[command]git remote add origin https://github.com/rust-lang/rust
2020-01-07T18:09:08.4322285Z ##[command]git config gc.auto 0
2020-01-07T18:09:08.4398901Z ##[command]git config --get-all http.https://github.com/rust-lang/rust.extraheader
2020-01-07T18:09:08.4457934Z ##[command]git config --get-all http.proxy
2020-01-07T18:09:08.4602704Z ##[command]git -c http.extraheader="AUTHORIZATION: basic ***" fetch --force --tags --prune --progress --no-recurse-submodules --depth=2 origin +refs/heads/*:refs/remotes/origin/* +refs/pull/67980/merge:refs/remotes/pull/67980/merge
---
2020-01-07T19:02:13.2070023Z .................................................................................................... 1500/9478
2020-01-07T19:02:19.2976762Z .................................................................................................... 1600/9478
2020-01-07T19:02:24.3017611Z .................................................................................................... 1700/9478
2020-01-07T19:02:34.0171126Z .................................................................................................... 1800/9478
2020-01-07T19:02:42.2940936Z .i.................................................................................................. 1900/9478
2020-01-07T19:02:49.1092640Z .........................................................................................iiiii...... 2000/9478
2020-01-07T19:03:11.2526631Z .................................................................................................... 2200/9478
2020-01-07T19:03:13.7295449Z .................................................................................................... 2300/9478
2020-01-07T19:03:16.4367268Z .................................................................................................... 2400/9478
2020-01-07T19:03:22.7299245Z .................................................................................................... 2500/9478
---
2020-01-07T19:06:28.9042925Z .....................i...............i.............................................................. 4900/9478
2020-01-07T19:06:38.8950903Z .................................................................................................... 5000/9478
2020-01-07T19:06:44.8461598Z ..................................................................i................................. 5100/9478
2020-01-07T19:06:52.7734537Z .................................................................................................... 5200/9478
2020-01-07T19:07:00.5953574Z .................................ii.ii...........i.................................................. 5300/9478
2020-01-07T19:07:10.0628286Z .................................................................................................... 5500/9478
2020-01-07T19:07:19.7795682Z .................................................................................................... 5600/9478
2020-01-07T19:07:27.1382397Z .................i.................................................................................. 5700/9478
2020-01-07T19:07:33.4082806Z .................................................................................................... 5800/9478
2020-01-07T19:07:33.4082806Z .................................................................................................... 5800/9478
2020-01-07T19:07:44.6145408Z .................................................................................................... 5900/9478
2020-01-07T19:07:56.2117298Z .......ii...i..ii...........i....................................................................... 6000/9478
2020-01-07T19:08:13.6406248Z .................................................................................................... 6200/9478
2020-01-07T19:08:21.2424424Z .................................................................................................... 6300/9478
2020-01-07T19:08:21.2424424Z .................................................................................................... 6300/9478
2020-01-07T19:08:39.9244332Z ..................................i..ii............................................................. 6400/9478
2020-01-07T19:09:01.3918281Z .................................................................................................... 6600/9478
2020-01-07T19:09:03.6139583Z .........i.......................................................................................... 6700/9478
2020-01-07T19:09:06.0271409Z .................................................................................................... 6800/9478
2020-01-07T19:09:09.2497889Z .........i.......................................................................................... 6900/9478
---
2020-01-07T19:10:49.2438007Z .................................................................................................... 7500/9478
2020-01-07T19:10:53.3313214Z .................................................................................................... 7600/9478
2020-01-07T19:10:58.4892077Z .................................................................................................... 7700/9478
2020-01-07T19:11:09.3827066Z .................................................................................................... 7800/9478
2020-01-07T19:11:17.6005359Z ..............................................iiii.................................................. 7900/9478
2020-01-07T19:11:32.5757092Z .................................................................................................... 8100/9478
2020-01-07T19:11:39.0808284Z .................................................................................................... 8200/9478
2020-01-07T19:11:54.3278034Z .................................................................................................... 8300/9478
2020-01-07T19:12:01.8660438Z .................................................................................................... 8400/9478
---
2020-01-07T19:14:24.5967211Z  finished in 7.026
2020-01-07T19:14:24.6147980Z Check compiletest suite=codegen mode=codegen (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2020-01-07T19:14:24.8150723Z 
2020-01-07T19:14:24.8151032Z running 166 tests
2020-01-07T19:14:27.8515489Z iiii......i........ii..iiii...i....i...........i............i..i..................i....i............ 100/166
2020-01-07T19:14:30.1301891Z i.i.i...iii..iiiiiii.......................iii............ii......
2020-01-07T19:14:30.1305981Z 
2020-01-07T19:14:30.1312490Z  finished in 5.516
2020-01-07T19:14:30.1517103Z Check compiletest suite=codegen-units mode=codegen-units (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2020-01-07T19:14:30.3220925Z 
---
2020-01-07T19:14:32.3613141Z  finished in 2.209
2020-01-07T19:14:32.3800920Z Check compiletest suite=assembly mode=assembly (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2020-01-07T19:14:32.5461816Z 
2020-01-07T19:14:32.5462224Z running 9 tests
2020-01-07T19:14:32.5463101Z iiiiiiiii
2020-01-07T19:14:32.5464087Z 
2020-01-07T19:14:32.5464257Z  finished in 0.165
2020-01-07T19:14:32.5651696Z Check compiletest suite=incremental mode=incremental (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2020-01-07T19:14:32.7580348Z 
---
2020-01-07T19:14:52.6218943Z  finished in 20.058
2020-01-07T19:14:52.6442338Z Check compiletest suite=debuginfo mode=debuginfo-gdb+lldb (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2020-01-07T19:14:52.8367111Z 
2020-01-07T19:14:52.8367503Z running 124 tests
2020-01-07T19:15:17.2424540Z .iiiii..ii.....i..i...i..i.i.i..i..i..iii....ii.ii....ii..........iiii..........i....Fi..ii.......ii 100/124
2020-01-07T19:15:21.3690511Z .i.iii.....iiiiii.....ii
2020-01-07T19:15:21.3692928Z 
2020-01-07T19:15:21.3693532Z ---- [debuginfo-gdb+lldb] debuginfo/pretty-std-collections.rs stdout ----
2020-01-07T19:15:21.3693532Z ---- [debuginfo-gdb+lldb] debuginfo/pretty-std-collections.rs stdout ----
2020-01-07T19:15:21.3693911Z NOTE: compiletest thinks it is using GDB with native rust support
2020-01-07T19:15:21.3694152Z NOTE: compiletest thinks it is using GDB version 8001000
2020-01-07T19:15:21.3694382Z 
2020-01-07T19:15:21.3694539Z error: line not found in debugger output: $1 = BTreeSet<i32>(len: 15) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
2020-01-07T19:15:21.3694825Z status: exit code: 0
2020-01-07T19:15:21.3695486Z command: "/usr/bin/gdb" "/usr/bin/gdb" "-quiet" "-batch" "-nx" "-command=/checkout/obj/build/x86_64-unknown-linux-gnu/test/debuginfo/pretty-std-collections/pretty-std-collections.debugger.script"
2020-01-07T19:15:21.3696080Z ------------------------------------------
2020-01-07T19:15:21.3696080Z ------------------------------------------
2020-01-07T19:15:21.3696271Z GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
2020-01-07T19:15:21.3696333Z Copyright (C) 2018 Free Software Foundation, Inc.
2020-01-07T19:15:21.3696376Z License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
2020-01-07T19:15:21.3696420Z This is free software: you are free to change and redistribute it.
2020-01-07T19:15:21.3696495Z There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
2020-01-07T19:15:21.3696536Z and "show warranty" for details.
2020-01-07T19:15:21.3696732Z This GDB was configured as "x86_64-linux-gnu".
2020-01-07T19:15:21.3696947Z Type "show configuration" for configuration details.
2020-01-07T19:15:21.3696985Z For bug reporting instructions, please see:
2020-01-07T19:15:21.3697198Z <http://www.gnu.org/software/gdb/bugs/>.
2020-01-07T19:15:21.3697256Z Find the GDB manual and other documentation resources online at:
2020-01-07T19:15:21.3697297Z <http://www.gnu.org/software/gdb/documentation/>.
2020-01-07T19:15:21.3697334Z For help, type "help".
2020-01-07T19:15:21.3697390Z Type "apropos word" to search for commands related to "word".
2020-01-07T19:15:21.3697616Z Breakpoint 1 at 0x10990: file /checkout/src/test/debuginfo/pretty-std-collections.rs, line 63.
2020-01-07T19:15:21.3697659Z [Thread debugging using libthread_db enabled]
2020-01-07T19:15:21.3697883Z Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
2020-01-07T19:15:21.3697912Z 
2020-01-07T19:15:21.3698135Z Breakpoint 1, pretty_std_collections::main () at /checkout/src/test/debuginfo/pretty-std-collections.rs:63
2020-01-07T19:15:21.3698186Z 63     zzz(); // #break
2020-01-07T19:15:21.3698245Z $1 = BTreeSet<i32>(len: 15)
2020-01-07T19:15:21.3698281Z $2 = BTreeMap<i32, i32>(len: 15)
2020-01-07T19:15:21.3698320Z $3 = VecDeque<i32>(len: 3, cap: 8) = {5, 3, 7}
2020-01-07T19:15:21.3698376Z $4 = VecDeque<i32>(len: 7, cap: 8) = {2, 3, 4, 5, 6, 7, 8}
2020-01-07T19:15:21.3698412Z A debugging session is active.
2020-01-07T19:15:21.3698435Z 
2020-01-07T19:15:21.3698487Z  Inferior 1 [process 6141] will be killed.
2020-01-07T19:15:21.3698512Z 
2020-01-07T19:15:21.3698547Z Quit anyway? (y or n) [answered Y; input not from terminal]
2020-01-07T19:15:21.3698763Z ------------------------------------------
2020-01-07T19:15:21.3698801Z stderr:
2020-01-07T19:15:21.3698968Z ------------------------------------------
2020-01-07T19:15:21.3698968Z ------------------------------------------
2020-01-07T19:15:21.3699328Z Python Exception <class 'gdb.error'> There is no member named data.: 
2020-01-07T19:15:21.3699594Z Python Exception <class 'gdb.error'> There is no member named data.: 
2020-01-07T19:15:21.3699908Z ------------------------------------------
2020-01-07T19:15:21.3699933Z 
2020-01-07T19:15:21.3699972Z 
2020-01-07T19:15:21.3699992Z 
2020-01-07T19:15:21.3699992Z 
2020-01-07T19:15:21.3700025Z failures:
2020-01-07T19:15:21.3700208Z     [debuginfo-gdb+lldb] debuginfo/pretty-std-collections.rs
2020-01-07T19:15:21.3700251Z 
2020-01-07T19:15:21.3700617Z test result: FAILED. 77 passed; 1 failed; 46 ignored; 0 measured; 0 filtered out
2020-01-07T19:15:21.3700645Z 
2020-01-07T19:15:21.3700841Z 
2020-01-07T19:15:21.3700862Z 
2020-01-07T19:15:21.3702989Z command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/compiletest" "/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/debuginfo" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/debuginfo" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "debuginfo-gdb+lldb" "--target" "x86_64-unknown-linux-gnu" "--host" "x86_64-unknown-linux-gnu" "--llvm-filecheck" "/usr/lib/llvm-7/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Cdebuginfo=0 -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--target-rustcflags" "-Crpath -O -Cdebuginfo=0 -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" "7.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"
2020-01-07T19:15:21.3703284Z 
2020-01-07T19:15:21.3703313Z 
2020-01-07T19:15:21.3703588Z thread 'main' panicked at 'Some tests failed', src/tools/compiletest/src/main.rs:384:22
2020-01-07T19:15:21.3703665Z note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
2020-01-07T19:15:21.3703665Z note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
2020-01-07T19:15:21.3707707Z failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
2020-01-07T19:15:21.3707915Z Build completed unsuccessfully in 0:59:47
2020-01-07T19:15:21.3767929Z == clock drift check ==
2020-01-07T19:15:21.3788965Z   local time: Tue Jan  7 19:15:21 UTC 2020
2020-01-07T19:15:21.9321344Z   network time: Tue, 07 Jan 2020 19:15:21 GMT
2020-01-07T19:15:21.9325549Z == end clock drift check ==
2020-01-07T19:15:22.6379001Z 
2020-01-07T19:15:22.6483372Z ##[error]Bash exited with code '1'.
2020-01-07T19:15:22.6520073Z ##[section]Starting: Checkout
2020-01-07T19:15:22.6522332Z ==============================================================================
2020-01-07T19:15:22.6522409Z Task         : Get sources
2020-01-07T19:15:22.6522456Z Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.

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)

Copy link
Contributor

@hanna-kruppe hanna-kruppe left a comment

Choose a reason for hiding this comment

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

Some nits, and more importantly, one safety issue.

/// `Box<InternalNode<K, V>>`. However, it contains no information as to which of the two types
/// of nodes is actually behind the box, and, partially due to this lack of information, has no
/// destructor.
/// `Box<InternalNode<K, V>>` or `Box<NodeHeader<(), ())` (i.e. EMPTY_ROOT_NODE).
Copy link
Contributor

Choose a reason for hiding this comment

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

The shared root is neither boxed nor uniquely owned by one BoxedNode, so although it's good to note that this pointer can refer to the shared root, wording it like this is misleading IMO. I'd suggest the following outline instead:

  • This is usually an owned pointer to a LeafNode/InternalNode, but it can also be a pointer (no ownership) to EMPTY_ROOT_NODE
  • No destructor in part because we don't know which of these variants it is
  • All of these types have a NodeHeader<K, V> prefix (even EMPTY_ROOT: NodeHeader<(), ()>), so that's the pointee type we store

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm confused by and can't find a description of "prefix" in a pointer context. Does that mean the data it points at always has at least the size and layout of NodeHeader<K, V>? Not that I know any better word for it. Does "prefix" also imply that pointer alignment is at least as high as that of NodeHeader<K, V>?

Copy link
Contributor

Choose a reason for hiding this comment

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

To be precise, I mean that all of InternalNode<K, V>, LeafNode<K, V> and NodeHeader<(), ()>:

  • are at least as large as NodeHeader<K, V>
  • have alignment at least as large as NodeHeader<K, V>
  • store the same kinds of data, at the same offsets, as a NodeHeader<K, V> in the first size_of::<NodeHeader<K, V>>

This is the reason why as_header() is unconditionally safe. Alignment in particular is probably worth calling out separately, as it's not really implied by "prefix" (e.g., you might say i32 is a prefix of #[repr(C)] struct { a: i32, b: i64 } but alignment differs).

}

impl<K, V> BoxedNode<K, V> {
fn from_leaf(node: Box<LeafNode<K, V>>) -> Self {
BoxedNode { ptr: Box::into_unique(node) }
unsafe {
BoxedNode { ptr: Unique::new_unchecked(Box::into_raw(node) as *mut NodeHeader<K, V>) }
Copy link
Contributor

Choose a reason for hiding this comment

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

I see that this is consistent with from_internal but I'm tempted to suggest rewriting both into Box::into_unique(node).cast() to get rid of the gratuitous unsafe.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done, and alloc tests and Miri are happy

@@ -510,7 +513,7 @@ impl<'a, K, V, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
/// This also implies you can invoke this member on the shared root, but the resulting pointer
/// might not be properly aligned and definitely would not allow accessing keys and values.
fn as_leaf_mut(&mut self) -> *mut LeafNode<K, V> {
self.node.as_ptr()
unsafe { &mut *(self.node.as_ptr() as *mut LeafNode<K, V>) }
Copy link
Contributor

Choose a reason for hiding this comment

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

Creating a reference here risks UB and is also completely pointless. Just use self.node.as_ptr() as *mut LeafNode<K, V>.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done, and alloc tests and Miri are happy

@@ -204,7 +207,7 @@ impl<K, V> Root<K, V> {
Root {
node: unsafe {
BoxedNode::from_ptr(NonNull::new_unchecked(
&EMPTY_ROOT_NODE as *const _ as *const LeafNode<K, V> as *mut _,
&EMPTY_ROOT_NODE as *const _ as *const NodeHeader<K, V> as *mut _,
Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: can now be simplified to NonNull::from(&EMPTY_ROOT_NODE).

Copy link
Contributor Author

@ssomers ssomers Jan 8, 2020

Choose a reason for hiding this comment

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

The compiler and I think you're wrong there: something must be done to transmute the NodeHeader<(), ()> to NodeHeader<K, V>. Why we also have to tag it as mutable, beats me.

Earlier, I got off on a tangent to adjust the pointer in BoxedNode to this actual type of EMPTY_ROOT_NODE, which implies removing K and V altogether, or pretending to understand PhantomData, but I managed to squeeze that monster back into the box before it ate me.

Copy link
Contributor

Choose a reason for hiding this comment

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

I forgot about the type parameters, mea culpa. NonNull::from(&EMPTY_ROOT_NODE).cast() should work, though.

@ssomers
Copy link
Contributor Author

ssomers commented Jan 8, 2020

Meanwhile, I managed to reproduce and hopefully fix the failing pr build. Awaiting a long build.

@hanna-kruppe
Copy link
Contributor

I know nothing about the gdb pretty printing, so I would prefer if the changes to it were kept to the bare minimum required by the other changes in this PR, or alternatively, if someone who knows anything about the pretty printers reviewed those parts.

@ssomers
Copy link
Contributor Author

ssomers commented Jan 10, 2020

I'll first submit a PR fixing and testing pretty printing as is now, and they can judge whether the near-invalid memory access is cool or cripple.

@JohnCSimon JohnCSimon added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jan 18, 2020
@JohnCSimon
Copy link
Member

Ping from triage:
@ssomers - Can you please post your status and address the change request from rkruppe ? t

@ssomers
Copy link
Contributor Author

ssomers commented Jan 19, 2020

This PR is now blocked by #68098 and won't automatically merge after it (or will need changes). As far as I know, I've addressed all change requests.

@ssomers
Copy link
Contributor Author

ssomers commented Jan 19, 2020

Nothing to see here, folks. I just played around in the GitHub interface and rebased on the #68098 commit.

@JohnCSimon JohnCSimon added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Feb 2, 2020
@JohnCSimon
Copy link
Member

This PR is now blocked by #68098 and won't automatically merge after it (or will need changes). As far as I know, I've addressed all change requests.

@rkruppe - can you please review this pr?

@ssomers
Copy link
Contributor Author

ssomers commented Feb 2, 2020

For clarity, this PR is still blocked by #68098, and is rebased on it so might merge automatically after it. As far as I know, we have reviewed and addressed everything apart from the part dependent on #68098.

@hanna-kruppe hanna-kruppe added S-blocked Status: Marked as blocked ❌ on something else such as an RFC or other implementation work. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Feb 2, 2020
@hanna-kruppe
Copy link
Contributor

Yes, AFAIK there's nothing to be done here before #68098 is merged and once that's done this PR can be rebased and most likely merged (NB: the first commit here has a different hash than the commit in that PR, so some manual git rebase --onto will be needed).

@ssomers
Copy link
Contributor Author

ssomers commented Feb 2, 2020

Well spotted, I think that before rebasing this one on that one, I rebased that one on master and forgot to push.

@ssomers
Copy link
Contributor Author

ssomers commented Mar 3, 2020

Closing for now (and it looks to be a very long time) because being based on another PR's commit misguides GitHub.

@ssomers ssomers closed this Mar 3, 2020
Centril added a commit to Centril/rust that referenced this pull request Mar 8, 2020
…, r=Mark-Simulacrum

More documentation and simplification of BTreeMap's internals

Salvage the documentation and simplification from rust-lang#67980, without changing the type locked down by debuginfo.

r? @rkruppe
Centril added a commit to Centril/rust that referenced this pull request Mar 8, 2020
…, r=Mark-Simulacrum

More documentation and simplification of BTreeMap's internals

Salvage the documentation and simplification from rust-lang#67980, without changing the type locked down by debuginfo.

r? @rkruppe
@ssomers ssomers deleted the btreemap_without_leaf_bias branch July 16, 2020 16:38
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.

5 participants