rustbuild fixes
When upgrading Debian's rustc to 1.38 I needed these patches:
(1) In order to cross-compile rustc 1.38 and take it through the full rustbuild process including install, I needed the first patch.
(2) In order to build rustc 1.38 using rustc 1.38 itself I need to set --cap-lints warn, otherwise I get this error:
~~~~
error: unnecessary `unsafe` block
--> src/bootstrap/builder.rs:148:19
|
148 | name: unsafe { ::std::intrinsics::type_name::<S>() },
| ^^^^^^ unnecessary `unsafe` block
|
note: lint level defined here
--> src/bootstrap/lib.rs:107:9
|
107 | #![deny(warnings, rust_2018_idioms, unused_lifetimes)]
| ^^^^^^^^
= note: `#[deny(unused_unsafe)]` implied by `#[deny(warnings)]`
error: aborting due to previous error
error: could not compile `bootstrap`.
~~~~
In order to set --cap-lints warn however, I need bootstrap.py not to clobber RUSTFLAGS. (This worked previously, not sure if it was broken intentionally but we would like support for it.)
handle diverging functions forwarding their return place
Fixes https://github.com/rust-lang/miri/issues/1075: the shim around diverging closures turned into function pointers actually "obtains" a return place inside a diverging function, but just uses it as the return place for a diverging callee. Handle this by using NULL places.
This is kind of a hack as it breaks our invariant that all places are dereferencable, but we'd eventually let raw pointers break that anyway I assume so that seems fine.
r? @oli-obk
libunwind_panic: adjust miri panic hack
We adjust the Miri hack in libpanic_unwind such that even with `cfg(miri)`, we build a version of libpanic_unwind that actually works.
This is needed to resolve https://github.com/integer32llc/rust-playground/issues/548.
r? @oli-obk @alexcrichton
Handle const-checks for `&mut` outside of `HasMutInterior`
Addresses [this comment](https://github.com/rust-lang/rust/pull/64470#discussion_r328200508).
Const-checking relied on `HasMutInterior` to forbid `&mut` in a const context. This was strange because all we needed to do was look for an `Rvalue::Ref` with a certain `BorrowKind`, whereas the `Qualif` traits are specifically meant to get the qualifs for a *value*. This PR removes that logic from `HasMutInterior` and moves it into `check_consts::Validator`.
As a result, we can now properly handle qualifications for `static`s, which had to be ignored previously since you can e.g. borrow a static `Cell` from another `static`. We also remove the `derived_from_illegal_borrow` logic, since it is no longer necessary; we give good errors for subsequent reborrows/borrows of illegal borrows.
Conditional compilation for sanitizers
Configure sanitize option when compiling with a sanitizer to make
it possible to execute different code depending on whether given
sanitizer is enabled or not.