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

Update to a new pinning API. #53877

Merged
merged 4 commits into from Sep 19, 2018
Merged

Update to a new pinning API. #53877

merged 4 commits into from Sep 19, 2018

Conversation

@withoutboats
Copy link
Contributor

withoutboats commented Sep 1, 2018

Blocked on #53843 because of method resolution problems with new pin type.

@r? @cramertj

cc @RalfJung @pythonesque anyone interested in #49150

Without Boats
@withoutboats withoutboats force-pushed the withoutboats:compositional-pin branch from 3f1811e to 974bdc8 Sep 1, 2018
@rust-highfive

This comment has been minimized.

Copy link
Collaborator

rust-highfive commented Sep 1, 2018

The job x86_64-gnu-llvm-5.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.

[00:04:36] travis_fold:start:tidy
travis_time:start:tidy
tidy check
[00:04:36] tidy error: /checkout/src/libcore/pin.rs:69: trailing whitespace
[00:04:37] some tidy checks failed
[00:04:37] 
[00:04:37] 
[00:04:37] 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:04:37] 
[00:04:37] 
[00:04:37] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test src/tools/tidy
[00:04:37] Build completed unsuccessfully in 0:00:50
[00:04:37] Build completed unsuccessfully in 0:00:50
[00:04:37] Makefile:79: recipe for target 'tidy' failed
[00:04:37] make: *** [tidy] Error 1

The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:1b7ae70b
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
---
travis_time:end:0038a018:start=1535778313314153079,finish=1535778313322697020,duration=8543941
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:1e33e658
$ 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 -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:1383e2c2
travis_time:start:1383e2c2
$ 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:11a2c5a7
$ 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)

#[unstable(feature = "pin", issue = "49150")]
impl<T> From<Box<T>> for Pin<Box<T>> {
fn from(boxed: Box<T>) -> Self {
unsafe { Pin::new_unchecked(boxed) }

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 1, 2018

Member

This could use a brief justification why the unsafe is okay.


#[unstable(feature = "pin", issue = "49150")]
pub fn pinned(x: T) -> Pin<Box<T>> {
unsafe { Pin::new_unchecked(box x) }

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 1, 2018

Member

This could use a brief justification why the unsafe is okay.

@kennytm kennytm added the S-blocked label Sep 1, 2018
#[unstable(feature = "pin", issue = "49150")]
pub fn reborrow<'b>(&'b mut self) -> PinMut<'b, T> {
PinMut { inner: self.inner }
pub fn get(this: Pin<&'a T>) -> &'a T {

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 1, 2018

Member

Why do we have set for all Pin<P> where P: DerefMut<Target = T>, but get only for Pin<&T>?

This comment has been minimized.

Copy link
@cramertj

cramertj Sep 1, 2018

Member

You can't use 'Deref' here since you want the lifetime to be equal to that of the original reference, not of your borrow of it.

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 1, 2018

Member

Oh, I see... this is actually the method witnessing that we can safely have shared references to pinned data! It has such an innocent name, I did not realize that. :)

fn deref(&self) -> &T {
&*self.inner
&*self.pointer

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 1, 2018

Member

I'd prefer if you could use something like #49150 (comment). In fact, I'd prefer if Pin could be in its own little private local submodule which only exposes those 4 functions (as_ref, as_shr, unpin_mut, unpin_shr) and new_unchecked; and everything else lived outside that module. Just to be sure we do not accidentally unpin something anywhere here.

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 1, 2018

Member

At the least, this could use get so that we only have one place witnessing the Pin<&T> -> &T conversion.

This comment has been minimized.

Copy link
@cramertj

cramertj Sep 14, 2018

Member

Unfortunately, you can't quite implement it all just using Deref like that, since Deref only gives you the lifetime of the borrow, not the lifetime of the original object.

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 18, 2018

Member

Well there could be some core function that Deref and this uses.

///
/// This constructor is unsafe because we cannot guarantee that the target data
/// is properly pinned by this pointer. If the constructed `Pin<P>` does not guarantee
/// that the data is "pinned," constructing a `Pin<P>` is undefined behavior and could lead

This comment has been minimized.

Copy link
@Thomasdezeeuw

Thomasdezeeuw Sep 3, 2018

Contributor

The comma is inside the quotes and previously you used italics (*) rather then qoutes, but it's just a small thing.

@cramertj

This comment has been minimized.

Copy link
Member

cramertj commented Sep 15, 2018

I've made some changes, including assorted cleanup, fixing the method resolution issue, making as_ref, as_mut, and set take self rather than this (to allow method-position syntax), generalizing the CoerceUnsized impl, and reexporting Unpin. PTAL.

r? @aturon

@rust-highfive rust-highfive assigned aturon and unassigned cramertj Sep 15, 2018
@cramertj cramertj changed the title [DO NOT MERGE] Update to a new pinning API. Update to a new pinning API. Sep 15, 2018
@rust-highfive

This comment was marked as outdated.

Copy link
Collaborator

rust-highfive commented Sep 15, 2018

The job x86_64-gnu-llvm-5.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.
[00:53:44] ....................................................................................................
[00:53:47] ....................................................i...............................................
[00:53:50] ....................................................................................................
[00:53:53] ....................................................................................................
[00:53:55] iiiiiiiii...........................................................................................
[00:54:01] ....................................................................................................
[00:54:04] .................................................................................i..................
[00:54:07] ....................................................................................................
[00:54:10] ...................................i.i..ii..........................................................
---
travis_time:start:test_run-pass
Check compiletest suite=run-pass mode=run-pass (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
[00:59:19] 
[00:59:19] running 549 tests
[00:59:32] .........................F..............i...........................................................
[00:59:57] ....................................................................................................
[01:00:07] ....................................................................................................
[01:00:22] ................i...................................................................................
[01:00:22] ................i...................................................................................
type `std::pin::Pin<std::boxed::Box<Fut>>` in the current scope
[01:00:28]     |
[01:00:28]     |
[01:00:28] 157 |     assert_eq!(Poll::Pending, fut.as_pin_mut().poll(cx));
[01:00:28] 
[01:00:28] 
[01:00:28] error[E0599]: no method named `as_pin_mut` found for type `std::pin::Pin<std::boxed::Box<Fut>>` in the current scope
[01:00:28]     |
[01:00:28]     |
[01:00:28] 159 |     assert_eq!(Poll::Ready(9), fut.as_pin_mut().poll(cx));
[01:00:28] 
[01:00:28] error: aborting due to 2 previous errors
[01:00:28] 
[01:00:28] For more information about this error, try `rustc --explain E0599`.
---
[01:00:28] test result: FAILED. 546 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out
[01:00:28] 
[01:00:28] 
[01:00:28] 
[01:00:28] 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-5.0/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Zunstable-options " "--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" "5.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:00:28] 
[01:00:28] 
[01:00:28] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:00:28] Build completed unsuccessfully in 0:15:24
[01:00:28] Build completed unsuccessfully in 0:15:24
[01:00:28] make: *** [check] Error 1
[01:00:28] Makefile:58: recipe for target 'check' failed

The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:1503725c
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
---
travis_time:end:0556747b:start=1536975869454016799,finish=1536975869459127538,duration=5110739
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:0daa4b5e
$ 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" ]; 

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)

@cramertj cramertj force-pushed the withoutboats:compositional-pin branch from b2fc5e5 to 166392d Sep 17, 2018
@rust-highfive

This comment was marked as outdated.

Copy link
Collaborator

rust-highfive commented Sep 17, 2018

The job x86_64-gnu-llvm-5.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.
[00:54:34] ....................................................................................................
[00:54:37] .....................................................i..............................................
[00:54:39] ....................................................................................................
[00:54:42] ....................................................................................................
[00:54:45] .iiiiiiiii..........................................................................................
[00:54:51] ....................................................................................................
[00:54:54] ..................................................................................i.................
[00:54:57] ....................................................................................................
[00:55:00] ....................................i.i..ii.........................................................
---
[01:22:30] travis_fold:end:stage0-linkchecker

[01:22:30] travis_time:end:stage0-linkchecker:start=1537214327128195563,finish=1537214329456200953,duration=2328005390

[01:25:01] core/pin/index.html:14: broken link - core/boxed/struct.Box.html
[01:25:33] thread 'main' panicked at 'found some broken links', tools/linkchecker/main.rs:49:9
[01:25:33] 
[01:25:33] 
[01:25:33] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/linkchecker" "/checkout/obj/build/x86_64-unknown-linux-gnu/doc"
[01:25:33] expected success, got: exit code: 101
[01:25:33] expected success, got: exit code: 101
[01:25:33] 
[01:25:33] 
[01:25:33] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:25:33] Build completed unsuccessfully in 0:39:32
[01:25:33] Makefile:58: recipe for target 'check' failed
[01:25:33] make: *** [check] Error 1

The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:29a02034
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
---
travis_time:end:19278238:start=1537214515003545589,finish=1537214515010265896,duration=6720307
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:16aa29b9
$ 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

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)

@cramertj cramertj force-pushed the withoutboats:compositional-pin branch from 166392d to b3a695b Sep 17, 2018

/// Get a mutable reference to the data inside of this `Pin`.
///
/// This requires that the data inside this `Pin` is `Unpin`.

This comment was marked as resolved.

Copy link
@aturon

aturon Sep 17, 2018

Member

This comment doesn't match the constraints on the impl block.

This comment was marked as resolved.

Copy link
@cramertj

cramertj Sep 17, 2018

Member

Oh dear, good catch! Copy-pasting has done me quite wrong indeed...

@aturon

This comment has been minimized.

Copy link
Member

aturon commented Sep 17, 2018

@cramertj After you address my comment, r=me.

@cramertj cramertj force-pushed the withoutboats:compositional-pin branch from b3a695b to 3ec1810 Sep 17, 2018
@cramertj

This comment has been minimized.

Copy link
Member

cramertj commented Sep 17, 2018

@bors r=aturon

@bors

This comment has been minimized.

Copy link
Contributor

bors commented Sep 17, 2018

📌 Commit 3ec1810 has been approved by aturon

@bors bors added S-waiting-on-bors and removed S-blocked labels Sep 17, 2018
@bors

This comment has been minimized.

Copy link
Contributor

bors commented Sep 17, 2018

⌛️ Testing commit 3ec1810 with merge 8bbe4f1...

pub fn new(pointer: P) -> Pin<P> {
// Safety: the value pointed to is `Unpin`, and so has no requirements
// around pinning.
unsafe { Pin::new_unchecked(pointer) }

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 18, 2018

Member

Is this always okay? We have impl Deref for non-pointer types as well, and we have no safety contract at all for what you put into P::Target.

This comment has been minimized.

Copy link
@cramertj

cramertj Sep 18, 2018

Member

If P::Target is Unpin, I'd expect basically what my comment says: that Pin<ThingThatTargetsT> is semantically equivalent to ThingThatTargetsT (no pinning invariant exists).

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 18, 2018

Member

I find that a rather surprising interaction. I might implement Deref like e.g. TyCtxt does, to "inherit" a whole bunch of methods from one of the members, and I will then usually not expect any interaction of that with pinning.

Or I might have a PinnedBox that does propagate pinning (that's safe, as long as Unpin is only conditionally implemented). Naturally I want Deref for PinnedBox.

When this new Pin API was introduced, it was clear that the "key point" here are the constructors that create a Pin. We discussed either making this manually for all types, or having a new unsafe trait that lets you do this. I do not remember seeing any blanket implementation like this that relies on an existing safe trait, and I am pretty worried about soundness of this. I'd feel much better if we could remove this part. What is the motivation?

This comment has been minimized.

Copy link
@cramertj

cramertj Sep 18, 2018

Member

IMO this new API was always just a different way to spell PinBox, PinMut, PinRef etc. that allowed for reusing some methods. This is one of the places where we get reuse: rather than providing safe new_rc, new_arc, new_ref, and new_mut functions where T: Unpin, we can have a single new method that supplies that bound.

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 18, 2018

Member

Well, we get reuse and also expand this to every type ever that implements Deref. That's a big deal.^^ My impression was that constructors of Pin<P> would be carefully curated, because they are the only thing that's "stopping the flood" and making sure that this is all well-behaved.

That said, I cannot construct a counter-example. Pin<P> (where P is not &[mut]) won't ever do anything except for giving you a Pin<&[mut] P::Target>, and we check that that's harmless because P::Target: Unpin. So I am feeling uneasy but cannot actually think of a way in which it would break things.

@cramertj

This comment was marked as outdated.

Copy link
Member

cramertj commented Sep 18, 2018

@bors r=aturon

@bors

This comment was marked as outdated.

Copy link
Contributor

bors commented Sep 18, 2018

📌 Commit 403d12d has been approved by aturon

P::Target: Unpin
{
fn deref_mut(&mut self) -> &mut P::Target {
&mut *self.pointer

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 18, 2018

Member

Actually, couldn't you implement this as Pin::get_mut(self.as_mut())?

This comment has been minimized.

Copy link
@cramertj

cramertj Sep 18, 2018

Member

I think so, yes.

This comment has been minimized.

Copy link
@RalfJung

RalfJung Sep 18, 2018

Member

Yay. :)

However, now the comments above as_mut/as_ref don't match reality any more, do they?

@cramertj

This comment has been minimized.

Copy link
Member

cramertj commented Sep 18, 2018

@bors r=aturon

@bors

This comment was marked as outdated.

Copy link
Contributor

bors commented Sep 18, 2018

📌 Commit 85508e2 has been approved by aturon

@bors

This comment was marked as outdated.

Copy link
Contributor

bors commented Sep 18, 2018

⌛️ Testing commit 85508e2 with merge a8ed03b...

bors added a commit that referenced this pull request Sep 18, 2018
Update to a new pinning API.

~~Blocked on #53843 because of method resolution problems with new pin type.~~

@r? @cramertj

cc @RalfJung @pythonesque anyone interested in #49150
@rust-highfive

This comment was marked as outdated.

Copy link
Collaborator

rust-highfive commented Sep 18, 2018

The job x86_64-gnu-llvm-5.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.
[01:28:58] ....................................................................................................
[01:29:01] .....................................................i..............................................
[01:29:04] ....................................................................................................
[01:29:07] ....................................................................................................
[01:29:09] ..iiiiiiiii.........................................................................................
[01:29:16] ....................................................................................................
[01:29:19] ...................................................................................i................
[01:29:21] ....................................................................................................
[01:29:24] ......................................i.i..ii.......................................................
---
travis_time:start:test_run-pass
Check compiletest suite=run-pass mode=run-pass (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
[01:34:23] 
[01:34:23] running 549 tests
[01:34:36] ...................................F....i...........................................................
[01:35:00] ....................................................................................................
[01:35:10] ....................................................................................................
[01:35:24] ................i...................................................................................
[01:35:30] .................................................
---
[01:35:30] test result: FAILED. 546 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out
[01:35:30] 
[01:35:30] 
[01:35:30] 
[01:35:30] 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-5.0/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Zunstable-options " "--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" "5.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:35:30] 
[01:35:30] 
[01:35:30] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:35:30] Build completed unsuccessfully in 0:14:54
[01:35:30] Build completed unsuccessfully in 0:14:54
[01:35:30] Makefile:58: recipe for target 'check' failed
[01:35:30] make: *** [check] Error 1

The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:043ba108
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)

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)

@bors

This comment was marked as outdated.

Copy link
Contributor

bors commented Sep 18, 2018

💔 Test failed - status-appveyor

@cramertj cramertj force-pushed the withoutboats:compositional-pin branch from 85508e2 to 574bca7 Sep 18, 2018
@cramertj

This comment has been minimized.

Copy link
Member

cramertj commented Sep 19, 2018

@bors r=aturon

@bors

This comment has been minimized.

Copy link
Contributor

bors commented Sep 19, 2018

📌 Commit 574bca7 has been approved by aturon

@bors

This comment has been minimized.

Copy link
Contributor

bors commented Sep 19, 2018

⌛️ Testing commit 574bca7 with merge 1e21c9a...

bors added a commit that referenced this pull request Sep 19, 2018
Update to a new pinning API.

~~Blocked on #53843 because of method resolution problems with new pin type.~~

@r? @cramertj

cc @RalfJung @pythonesque anyone interested in #49150
@bors

This comment has been minimized.

Copy link
Contributor

bors commented Sep 19, 2018

☀️ Test successful - status-appveyor, status-travis
Approved by: aturon
Pushing 1e21c9a to master...

@bors bors merged commit 574bca7 into rust-lang:master Sep 19, 2018
2 checks passed
2 checks passed
continuous-integration/travis-ci/pr The Travis CI build passed
Details
homu Test successful
Details
@pnkfelix pnkfelix mentioned this pull request Sep 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
9 participants
You can’t perform that action at this time.