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

reserve impl<T> From<!> for T #62661

Merged
merged 13 commits into from
Sep 26, 2019
Merged

reserve impl<T> From<!> for T #62661

merged 13 commits into from
Sep 26, 2019

Conversation

arielb1
Copy link
Contributor

@arielb1 arielb1 commented Jul 13, 2019

this is necessary for never-type stabilization.

cc #57012 #35121

I think we wanted a crater run for this @nikomatsakis?

r? @nikomatsakis

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Jul 13, 2019
@cramertj
Copy link
Member

If we do a crater run, it should probably also include the change to make core::convert::Infallible an alias for !.

Copy link
Contributor

@nikomatsakis nikomatsakis left a comment

Choose a reason for hiding this comment

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

Did a quick read. Will leave some more comments on the PR -- it mostly looks good. I have two sets of concerns that are orthogonal.

}
(ImplPolarity::Positive, ImplPolarity::Negative) |
(ImplPolarity::Negative, ImplPolarity::Positive) => {
// FIXME: when can this happen?
Copy link
Contributor

Choose a reason for hiding this comment

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

Isn't that this case? (playground)

#![feature(optin_builtin_traits)]

auto trait Foo { }

impl Foo for u32 { }
impl !Foo for u32 { }

fn main() { }

&hir::ImplPolarity::Positive => ImplPolarity::Positive,
&hir::ImplPolarity::Negative => ImplPolarity::Negative,
&ty::ImplPolarity::Positive |
// FIXME: do we want to do something else here?
Copy link
Contributor

Choose a reason for hiding this comment

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

Almost certainly yes -- I think this means that reservation impls will show up in rustdoc as if they were real impls, which seems bound to lead to confusion, no?

Copy link
Contributor

Choose a reason for hiding this comment

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

Is it enough to show the reservation attribute?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

cc @QuietMisdreavus (I think you know Rustdoc?)

@@ -1325,17 +1325,21 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
(result, dep_node)
}

// Treat negative impls as unimplemented
fn filter_negative_impls(
// Treat negative impls as unimplemented, and reservation impls as Ok(None)
Copy link
Contributor

Choose a reason for hiding this comment

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

instead of "as Ok(None), perhaps:

Treat negative impls as unimplemented, and reservation impls as ambiguity.

@nikomatsakis
Copy link
Contributor

So, this isn't the approach I had intended to take, though it may well be better. I thought I'd write out what I was thinking and see what you thought of it. Basically, I had intended to modify the is_knowable function in select.rs. The idea would be that T: From<!> is not "knowable" -- even if it otherwise would be (because T is local, presumably). I'm not sure just how I would modify said function though -- I guess you could scan the "reservation" impls for the trait (and ignore them otherwise), but that seems kind of hacky. I think I had in mind just hard-coding From, but that seems not especially satisfactory.

@nikomatsakis
Copy link
Contributor

In general, I think we need to document clearly what the semantics of a "reservation" impl are. They aren't quite what the name alone would suggest to me. In particular, just having a "reservation" impl doesn't guarantee that you can add the impl later, because of the fact that they never conflict for coherence reasons (though, given specialization, and a sufficiently simple reservation impl (without auxiliary where clauses), it may well mean that you could add the impl later).

I guess that the semantics are something like:

  • a reservation impl for the trait X prevents negative reasoning about X
  • it does not prevent people from adding other impls of X, including impls that overlap the reservation impl

The upshot is:

  • You cannot add the impl later unless specialization allows it, right?

@nikomatsakis
Copy link
Contributor

nikomatsakis commented Jul 25, 2019

So yes, some things I'd like to address before landing this PR:

  • Need to document pretty clearly how reservation impls are meant to be used and where they make sense. It seems like they are pretty narrowly tailored to this situation (which is fine!) but could easily be misunderstood and used by libs team in other situations where they may not apply.
  • How should reservation impls show up in rustdoc?
  • Do we want a narrowly tailored error message here to try and explain to people what's going on? Right now, I think they get an error saying that the impls overlap, but of course if they remove their impl, they will get an error. This seems like it's going to be a confusing user experience.

@nikomatsakis
Copy link
Contributor

Regarding a crater run: are we concerned that people are already relying on negative reasoning?

@Centril
Copy link
Contributor

Centril commented Jul 25, 2019

it does not prevent people from adding other impls of X, including impls that overlap the reservation impl

We might want to add a knob later on to specify "how hard" to reserve, e.g banning overlap, but this seems like future work for other scenarios when this would be useful.

Need to document pretty clearly how reservation impls are meant to be used and where they make sense. It seems like they are pretty narrowly tailored to this situation (which is fine!) but could easily be misunderstood and used by libs team in other situations where they may not apply.

Seems like a good idea. I would also suggest that UI tests should be provided in the cases of reservation as a start to actually confirm what the reservation does.

  • Do we want a narrowly tailored error message here to try and explain to people what's going on? Right now, I think they get an error saying that the impls overlap, but of course if they remove their impl, they will get an error. This seems like it's going to be a confusing user experience.

Would be nice to have better diagnostics yes, but I'm also cognizant of the delay to stabilizing ! so imo it would be acceptable to leave this as future work (e.g. maybe @estebank would pick it up when a user files an issue and complains about it...). This is assuming it's not a trivial fix that takes 1 hour to write up.

@estebank
Copy link
Contributor

but I'm also cognizant of the delay to stabilizing ! so imo it would be acceptable to leave this as future work

An interim solution would be to minimally expand the current error with a note pointing at this or the tracking issue. As long as diagnostics for other more stablished features don't regress, it should be ok to land this on nightly, but let's cut tickets for common errors we can anticipate and see if we can get to them quickly enough that they can be shipped together. I am personally reactive on these cases, but it'd be lovely if we could avoid every time we stabilize a new feature having a subpar experience, because it is likely people will go out to check the new toy out, only to cut themselves with the sharp edges.

@cramertj
Copy link
Member

@nikomatsakis

Regarding a crater run: are we concerned that people are already relying on negative reasoning?

Yes, they might already assume this impl does not exist for core::convert::Infallible.

@seanmonstar
Copy link
Contributor

seanmonstar commented Jul 26, 2019

Notably, if you try to make a function like fn try_from<T>(t: T) -> Result<Foo, Bar> where Foo: TryFrom<T>, <Foo as TryFrom<T>>::Error: Into<Bar>, you'll notice that you cannot pass in a Foo, and it will tell you that the trait bound 'Bar: std::convert::From<std::convert::Infallible>' is not satisfied. To fix it, we can write that impl ourselves.

It worries me that some may have already done so, and therefore a change to a type alias of ! will suddenly break those impls.

@arielb1
Copy link
Contributor Author

arielb1 commented Jul 27, 2019

Need to document pretty clearly how reservation impls are meant to be used and where they make sense. It seems like they are pretty narrowly tailored to this situation (which is fine!) but could easily be misunderstood and used by libs team in other situations where they may not apply.

Where do you think would be the right place to document this?

@Centril
Copy link
Contributor

Centril commented Jul 27, 2019

Where do you think would be the right place to document this?

The rustc guide probably?

@arielb1
Copy link
Contributor Author

arielb1 commented Jul 27, 2019

One problem I noticed with #[rustc_reservation_impl] is that it allows downstream implementations that overlap with From<!> for T in a non-ordered way, for example:

trait Uninhabitable { fn never(self) -> !; }
impl Uninhabitable for ! { fn never(self) -> !; }

struct MyType {}

// ok
impl<T> From<T> for MyType where T: Uninhabitable {
    fn from(t: T) -> Self { t.never() }
}

This would make it more difficult to implement the overlap using lattice specialization (as opposed to "overlapping marker traits"), and therefore we might want to forbid that sort of downstream impl, while allowing the From<T> for T impl.

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed (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.
2019-07-27T19:19:44.8176350Z ##[command]git remote add origin https://github.com/rust-lang/rust
2019-07-27T19:19:44.8347416Z ##[command]git config gc.auto 0
2019-07-27T19:19:44.8423060Z ##[command]git config --get-all http.https://github.com/rust-lang/rust.extraheader
2019-07-27T19:19:44.8485628Z ##[command]git config --get-all http.proxy
2019-07-27T19:19:44.8621721Z ##[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/62661/merge:refs/remotes/pull/62661/merge
---
2019-07-27T19:20:19.2289688Z do so (now or later) by using -b with the checkout command again. Example:
2019-07-27T19:20:19.2289737Z 
2019-07-27T19:20:19.2289955Z   git checkout -b <new-branch-name>
2019-07-27T19:20:19.2289984Z 
2019-07-27T19:20:19.2290031Z HEAD is now at 0262b3fef Merge 89e14d18df1c4e7b471f20ac3df7f4b22962b5c1 into 0e9b465d729d07101b29b4d096d83edf9be82df0
2019-07-27T19:20:19.2426106Z ##[section]Starting: Collect CPU-usage statistics in the background
2019-07-27T19:20:19.2428872Z ==============================================================================
2019-07-27T19:20:19.2428950Z Task         : Bash
2019-07-27T19:20:19.2428998Z Description  : Run a Bash script on macOS, Linux, or Windows
---
2019-07-27T20:20:40.6194659Z .................................................................................................... 700/5874
2019-07-27T20:20:44.7747801Z .................................................................................................... 800/5874
2019-07-27T20:20:50.2472234Z .................................................................................................... 900/5874
2019-07-27T20:20:55.2508851Z .................................................................................................... 1000/5874
2019-07-27T20:21:00.7215240Z i...........i....................................................................................... 1100/5874
2019-07-27T20:21:04.6339813Z ..............................iiiii................................................................. 1200/5874
2019-07-27T20:21:10.6906565Z .................................................................................................... 1400/5874
2019-07-27T20:21:13.4010840Z .................................................................................................... 1500/5874
2019-07-27T20:21:17.1057946Z .................................................................................................... 1600/5874
2019-07-27T20:21:19.8149599Z .................................................................................................... 1700/5874
---
2019-07-27T20:22:33.5486663Z .................................................................................................... 3400/5874
2019-07-27T20:22:38.6769136Z .................................................................................................... 3500/5874
2019-07-27T20:22:42.7054064Z ..........................i......................................................................... 3600/5874
2019-07-27T20:22:47.0355713Z .................................................................................................... 3700/5874
2019-07-27T20:22:50.5048467Z ....ii...i..ii...................................................................................... 3800/5874
2019-07-27T20:22:59.3086632Z .................................................................................................... 4000/5874
2019-07-27T20:23:03.1886472Z ........................ii.......................................................................... 4100/5874
2019-07-27T20:23:05.5278785Z .............................................i...................................................... 4200/5874
2019-07-27T20:23:07.6008814Z .................................................................................................... 4300/5874
---
2019-07-27T20:24:31.0288345Z 
2019-07-27T20:24:31.0288791Z ---- [ui] ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs stdout ----
2019-07-27T20:24:31.0288852Z diff of stderr:
2019-07-27T20:24:31.0288895Z 
2019-07-27T20:24:31.0289172Z 5    | ---------------------- first implementation here
2019-07-27T20:24:31.0289274Z 6 LL | impl<T: MyTrait> OtherTrait for T {}
2019-07-27T20:24:31.0289558Z -    |
2019-07-27T20:24:31.0289785Z -    = note: this impl is reserved
2019-07-27T20:24:31.0289839Z 10 
2019-07-27T20:24:31.0289905Z 11 error: aborting due to previous error
2019-07-27T20:24:31.0289905Z 11 error: aborting due to previous error
2019-07-27T20:24:31.0289947Z 12 
2019-07-27T20:24:31.0289973Z 
2019-07-27T20:24:31.0289998Z 
2019-07-27T20:24:31.0290061Z The actual stderr differed from the expected stderr.
2019-07-27T20:24:31.0290422Z Actual stderr saved to /checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict/reservation-impl-coherence-conflict.stderr
2019-07-27T20:24:31.0290675Z To update references, rerun the tests and pass the `--bless` flag
2019-07-27T20:24:31.0291000Z To only update this specific test, also pass `--test-args traits/reservation-impls/reservation-impl-coherence-conflict.rs`
2019-07-27T20:24:31.0291083Z error: 1 errors occurred comparing output.
2019-07-27T20:24:31.0291147Z status: exit code: 1
2019-07-27T20:24:31.0291147Z status: exit code: 1
2019-07-27T20:24:31.0292116Z command: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs" "-Zthreads=1" "--target=x86_64-unknown-linux-gnu" "--error-format" "json" "-Zui-testing" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict" "-Crpath" "-O" "-Cdebuginfo=0" "-Zunstable-options" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "-L" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict/auxiliary" "-A" "unused"
2019-07-27T20:24:31.0292522Z ------------------------------------------
2019-07-27T20:24:31.0292557Z 
2019-07-27T20:24:31.0292801Z ------------------------------------------
2019-07-27T20:24:31.0292847Z stderr:
2019-07-27T20:24:31.0292847Z stderr:
2019-07-27T20:24:31.0293056Z ------------------------------------------
2019-07-27T20:24:31.0293128Z error[E0119]: conflicting implementations of trait `OtherTrait` for type `()`:
2019-07-27T20:24:31.0293426Z   --> /checkout/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs:13:1
2019-07-27T20:24:31.0293480Z    |
2019-07-27T20:24:31.0293808Z LL | impl OtherTrait for () {}
2019-07-27T20:24:31.0294103Z    | ---------------------- first implementation here
2019-07-27T20:24:31.0294154Z LL | impl<T: MyTrait> OtherTrait for T {}
2019-07-27T20:24:31.0294256Z 
2019-07-27T20:24:31.0294298Z error: aborting due to previous error
2019-07-27T20:24:31.0294327Z 
2019-07-27T20:24:31.0294593Z For more information about this error, try `rustc --explain E0119`.
---
2019-07-27T20:24:31.0296016Z thread 'main' panicked at 'Some tests failed', src/tools/compiletest/src/main.rs:535:22
2019-07-27T20:24:31.0296093Z note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
2019-07-27T20:24:31.0296127Z 
2019-07-27T20:24:31.0296151Z 
2019-07-27T20:24:31.0297620Z 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/ui" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "ui" "--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 -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" "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"
2019-07-27T20:24:31.0297878Z 
2019-07-27T20:24:31.0297908Z 
2019-07-27T20:24:31.0297954Z failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
2019-07-27T20:24:31.0298110Z Build completed unsuccessfully in 0:56:30
2019-07-27T20:24:31.0298110Z Build completed unsuccessfully in 0:56:30
2019-07-27T20:24:31.4390883Z ##[error]Bash exited with code '1'.
2019-07-27T20:24:31.4425778Z ##[section]Starting: Checkout
2019-07-27T20:24:31.4427574Z ==============================================================================
2019-07-27T20:24:31.4427631Z Task         : Get sources
2019-07-27T20:24:31.4427699Z 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)

#[rustc_reservation_impl]
#[rustc_reservation_impl="a future version of Rust might implement `From<!>` for \
all types. \
However, it is OK to implement `From<!>` for types you own - \
Copy link
Member

Choose a reason for hiding this comment

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

The complexity of this error message and describing the situation to users pushes me further in the direction of thinking that we should go ahead and provide the impl<T> From<!> for T.

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed (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.
2019-07-30T18:20:23.2778078Z ##[command]git remote add origin https://github.com/rust-lang/rust
2019-07-30T18:20:23.2962429Z ##[command]git config gc.auto 0
2019-07-30T18:20:23.3033241Z ##[command]git config --get-all http.https://github.com/rust-lang/rust.extraheader
2019-07-30T18:20:23.3085791Z ##[command]git config --get-all http.proxy
2019-07-30T18:20:23.3210533Z ##[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/62661/merge:refs/remotes/pull/62661/merge
---
2019-07-30T18:20:58.6264951Z do so (now or later) by using -b with the checkout command again. Example:
2019-07-30T18:20:58.6265006Z 
2019-07-30T18:20:58.6265232Z   git checkout -b <new-branch-name>
2019-07-30T18:20:58.6265264Z 
2019-07-30T18:20:58.6265328Z HEAD is now at 2ef7a21db Merge 7cf8b2184e0e5739295df4b060540654e8d37c1f into f690098e6d65ad7b33dc7fdefccc387806782027
2019-07-30T18:20:58.6417624Z ##[section]Starting: Collect CPU-usage statistics in the background
2019-07-30T18:20:58.6420026Z ==============================================================================
2019-07-30T18:20:58.6420075Z Task         : Bash
2019-07-30T18:20:58.6420116Z Description  : Run a Bash script on macOS, Linux, or Windows
---
2019-07-30T19:17:55.2380707Z .................................................................................................... 1400/8823
2019-07-30T19:18:00.7816855Z .................................................................................................... 1500/8823
2019-07-30T19:18:12.4969610Z ................................................................i...............i................... 1600/8823
2019-07-30T19:18:19.7570601Z .................................................................................................... 1700/8823
2019-07-30T19:18:33.4145775Z ..................................................iiiii............................................. 1800/8823
2019-07-30T19:18:43.6788391Z .................................................................................................... 2000/8823
2019-07-30T19:18:45.9856715Z .................................................................................................... 2100/8823
2019-07-30T19:18:49.2696542Z .................................................................................................... 2200/8823
2019-07-30T19:18:55.4666338Z .................................................................................................... 2300/8823
---
2019-07-30T19:22:35.2349801Z .................................................................................................... 5300/8823
2019-07-30T19:22:42.1837625Z ..............i..................................................................................... 5400/8823
2019-07-30T19:22:47.4337488Z .................................................................................................... 5500/8823
2019-07-30T19:22:58.9310912Z .................................................................................................... 5600/8823
2019-07-30T19:23:11.4993198Z ........ii...i..ii...........i...................................................................... 5700/8823
2019-07-30T19:23:27.3970122Z .................................................................................................... 5900/8823
2019-07-30T19:23:32.0563276Z .................................................................................................... 6000/8823
2019-07-30T19:23:32.0563276Z .................................................................................................... 6000/8823
2019-07-30T19:23:45.1277620Z .........i..ii...................................................................................... 6100/8823
2019-07-30T19:24:02.8051787Z ....................................................i............................................... 6300/8823
2019-07-30T19:24:04.7203287Z .................................................................................................... 6400/8823
2019-07-30T19:24:06.9417609Z ......................i............................................................................. 6500/8823
2019-07-30T19:24:11.2260793Z .................................................................................................... 6600/8823
---
2019-07-30T19:28:30.6899306Z  finished in 21.201
2019-07-30T19:28:30.7061545Z Check compiletest suite=codegen mode=codegen (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:28:30.8607667Z 
2019-07-30T19:28:30.8608731Z running 146 tests
2019-07-30T19:28:33.8650108Z i....iii......iii..iiii....i............................i..i................i....i.........ii.i.i..i 100/146
2019-07-30T19:28:35.5802441Z iii..............i.........iii.i......ii......
2019-07-30T19:28:35.5805282Z 
2019-07-30T19:28:35.5808842Z  finished in 4.874
2019-07-30T19:28:35.5969370Z Check compiletest suite=codegen-units mode=codegen-units (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:28:35.7416036Z 
---
2019-07-30T19:28:37.6566796Z  finished in 2.059
2019-07-30T19:28:37.6732639Z Check compiletest suite=assembly mode=assembly (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:28:37.8162389Z 
2019-07-30T19:28:37.8162809Z running 9 tests
2019-07-30T19:28:37.8163737Z iiiiiiiii
2019-07-30T19:28:37.8164273Z 
2019-07-30T19:28:37.8169593Z  finished in 0.143
2019-07-30T19:28:37.8364594Z Check compiletest suite=incremental mode=incremental (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:28:37.9877221Z 
---
2019-07-30T19:28:55.0176257Z  finished in 17.181
2019-07-30T19:28:55.0351546Z Check compiletest suite=debuginfo mode=debuginfo-gdb+lldb (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:28:55.1828755Z 
2019-07-30T19:28:55.1828974Z running 122 tests
2019-07-30T19:29:17.3985701Z .iiiii...i.....i..i...i..i.i.i..i.ii..i.i.....i..i....i..........iiii..........i...ii...i.......ii.i 100/122
2019-07-30T19:29:21.7005967Z .i.i......iii.i.....ii
2019-07-30T19:29:21.7006459Z 
2019-07-30T19:29:21.7006502Z  finished in 26.665
2019-07-30T19:29:21.7010289Z Uplifting stage1 rustc (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:29:21.7010838Z Copying stage2 rustc from stage1 (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu / x86_64-unknown-linux-gnu)
---
2019-07-30T19:42:25.5518257Z 
2019-07-30T19:42:25.5518983Z    Doc-tests core
2019-07-30T19:42:29.2676189Z 
2019-07-30T19:42:29.2677005Z running 2376 tests
2019-07-30T19:42:40.8979238Z ......iiiii......................................................................................... 100/2376
2019-07-30T19:43:05.5070416Z ............................................................................................i....... 300/2376
2019-07-30T19:43:20.1533643Z .................................................................................................... 400/2376
2019-07-30T19:43:20.1533643Z .................................................................................................... 400/2376
2019-07-30T19:43:30.4443302Z ...........................i..i.................iiii................................................ 500/2376
2019-07-30T19:43:52.4509655Z .................................................................................................... 700/2376
2019-07-30T19:44:03.5932094Z .................................................................................................... 800/2376
2019-07-30T19:44:14.7383269Z .................................................................................................... 900/2376
2019-07-30T19:44:25.8090354Z .................................................................................................... 1000/2376
---
2019-07-30T19:49:21.8102012Z 
2019-07-30T19:49:21.8102464Z running 989 tests
2019-07-30T19:49:44.0729843Z i................................................................................................... 100/989
2019-07-30T19:49:56.7854902Z .................................................................................................... 200/989
2019-07-30T19:50:05.1546534Z .................iii......i......i...i......i....................................................... 300/989
2019-07-30T19:50:09.5713430Z .................................................................................................... 400/989
2019-07-30T19:50:17.2787797Z ................................i..i.................................ii............................. 500/989
2019-07-30T19:50:31.3910682Z .................................................................................................... 700/989
2019-07-30T19:50:31.3910682Z .................................................................................................... 700/989
2019-07-30T19:50:39.4186709Z ...............iiii................................................................................. 800/989
2019-07-30T19:50:53.2027720Z .................................................................................................... 900/989
2019-07-30T19:51:00.4262108Z .....................................iiii................................................
2019-07-30T19:51:00.4263019Z 
2019-07-30T19:51:00.4450061Z  finished in 226.852
2019-07-30T19:51:00.4470780Z Testing unwind stage1 (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
2019-07-30T19:51:00.6416110Z     Finished release [optimized] target(s) in 0.19s
---
2019-07-30T20:08:41.2966195Z Rustbook (x86_64-unknown-linux-gnu) - edition-guide
2019-07-30T20:08:41.6147712Z Building stage0 tool linkchecker (x86_64-unknown-linux-gnu)
2019-07-30T20:08:41.7871375Z    Compiling linkchecker v0.1.0 (/checkout/src/tools/linkchecker)
2019-07-30T20:08:43.6667614Z     Finished release [optimized] target(s) in 2.04s
2019-07-30T20:08:44.5168248Z std/convert/trait.TryFrom.html:22: broken link - std/convert/enum.Infallible.html
2019-07-30T20:08:44.5168535Z std/convert/trait.TryFrom.html:23: broken link - std/convert/enum.Infallible.html
2019-07-30T20:08:50.0982738Z core/convert/trait.TryFrom.html:22: broken link - core/convert/enum.Infallible.html
2019-07-30T20:08:50.0984040Z core/convert/trait.TryFrom.html:23: broken link - core/convert/enum.Infallible.html
2019-07-30T20:08:50.8737468Z thread 'main' panicked at 'found some broken links', src/tools/linkchecker/main.rs:39:9
2019-07-30T20:08:50.8746508Z 
2019-07-30T20:08:50.8746586Z 
2019-07-30T20:08:50.8747107Z 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"
2019-07-30T20:08:50.8747177Z expected success, got: exit code: 101
2019-07-30T20:08:50.8747177Z expected success, got: exit code: 101
2019-07-30T20:08:50.8747239Z 
2019-07-30T20:08:50.8747264Z 
2019-07-30T20:08:50.8754914Z failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
2019-07-30T20:08:50.8755181Z Build completed unsuccessfully in 1:41:57
2019-07-30T20:08:53.5636865Z ##[error]Bash exited with code '1'.
2019-07-30T20:08:53.5668802Z ##[section]Starting: Checkout
2019-07-30T20:08:53.5670245Z ==============================================================================
2019-07-30T20:08:53.5670303Z Task         : Get sources
2019-07-30T20:08:53.5670458Z 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)

@bors
Copy link
Contributor

bors commented Aug 2, 2019

☔ The latest upstream changes (presumably #63214) made this pull request unmergeable. Please resolve the merge conflicts.

@nikomatsakis
Copy link
Contributor

nikomatsakis commented Aug 5, 2019

@cramertj

Yes, they might already assume this impl does not exist for core::convert::Infallible.

ok, right, duh. I was only thinking of the core mechanism.

@nikomatsakis
Copy link
Contributor

@bors try -- well, shall we attempt the crater run then?

@bors
Copy link
Contributor

bors commented Aug 5, 2019

⌛ Trying commit 4e437d6 with merge a0236b7...

bors added a commit that referenced this pull request Aug 5, 2019
reserve `impl<T> From<!> for T`

this is necessary for never-type stabilization.

cc #57012 #35121

I think we wanted a crater run for this @nikomatsakis?

r? @nikomatsakis
@bors
Copy link
Contributor

bors commented Aug 5, 2019

☀️ Try build successful - checks-azure
Build commit: a0236b7

@Centril
Copy link
Contributor

Centril commented Aug 6, 2019

@craterbot run mode=check-only

@craterbot
Copy link
Collaborator

👌 Experiment pr-62661 created and queued.
🤖 Automatically detected try build a0236b7
🔍 You can check out the queue and this experiment's details.

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

@arielb1
Copy link
Contributor Author

arielb1 commented Sep 25, 2019

rebased

@bors r=nikomatsakis

@bors
Copy link
Contributor

bors commented Sep 25, 2019

📌 Commit e70724c has been approved by nikomatsakis

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Sep 25, 2019
Centril added a commit to Centril/rust that referenced this pull request Sep 26, 2019
reserve `impl<T> From<!> for T`

this is necessary for never-type stabilization.

cc rust-lang#57012 rust-lang#35121

I think we wanted a crater run for this @nikomatsakis?

r? @nikomatsakis
Centril added a commit to Centril/rust that referenced this pull request Sep 26, 2019
reserve `impl<T> From<!> for T`

this is necessary for never-type stabilization.

cc rust-lang#57012 rust-lang#35121

I think we wanted a crater run for this @nikomatsakis?

r? @nikomatsakis
Centril added a commit to Centril/rust that referenced this pull request Sep 26, 2019
reserve `impl<T> From<!> for T`

this is necessary for never-type stabilization.

cc rust-lang#57012 rust-lang#35121

I think we wanted a crater run for this @nikomatsakis?

r? @nikomatsakis
@bors
Copy link
Contributor

bors commented Sep 26, 2019

⌛ Testing commit e70724c with merge 134004f...

bors added a commit that referenced this pull request Sep 26, 2019
reserve `impl<T> From<!> for T`

this is necessary for never-type stabilization.

cc #57012 #35121

I think we wanted a crater run for this @nikomatsakis?

r? @nikomatsakis
@bors
Copy link
Contributor

bors commented Sep 26, 2019

☀️ Test successful - checks-azure
Approved by: nikomatsakis
Pushing 134004f to master...

@bors bors added the merged-by-bors This PR was explicitly merged by bors. label Sep 26, 2019
@bors bors merged commit e70724c into rust-lang:master Sep 26, 2019
Centril added a commit to Centril/rust that referenced this pull request Nov 21, 2019
…li-obk

Stabilize `!` in Rust 1.41.0

This PR stabilizes the `never_type` (written `!`). The type represents computations that we know diverge in the type system and therefore has no values / inhabitants / elements / members.

The current nightly version is 1.40.0 which will become stable on 2019-12-19.

Tracking issue: rust-lang#35121.
Closes rust-lang#57012.
Closes rust-lang#58184.
Original stabilization report: rust-lang#57012 (comment)

Additional notes:

- In rust-lang#62661 we reserved `impl<T> From<!> for T` so this concern should be resolved.
- The type inference fallback change is moved to `#![feature(never_type_fallback)]` (rust-lang#65992).
- You can find all of the tests referencing `never_type` in this PR which also reorganizes these tests whereas they were more scattered before.

r? @nikomatsakis
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
merged-by-bors This PR was explicitly merged by bors. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-lang Relevant to the language team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.