mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Auto merge of #102223 - matthiaskrgr:rollup-wb1qdhk, r=matthiaskrgr
Rollup of 11 pull requests Successful merges: - #101780 (Add a platform support document for Android) - #102044 (Remove `RtlGenRandom` (take two)) - #102081 (Adding ignore fuchsia tests for execvp (pre_exec)) - #102082 (Adding ignore fuchsia non-applicable commands) - #102146 (rustdoc: CSS prevent sidebar width change jank) - #102152 (Calculate `ProjectionTy::trait_def_id` for return-position `impl Trait` in trait correctly) - #102175 (Also require other subtrees to always build successfully) - #102176 (Add `llvm-dis` to the set of tools in `ci-llvm`) - #102188 (Update doc after renaming `fn is_zero`) - #102199 (Improve rustdoc GUI tests) - #102218 (Document some missing command-line arguments) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
199fe1d169
@ -1133,9 +1133,13 @@ pub struct ProjectionTy<'tcx> {
|
||||
|
||||
impl<'tcx> ProjectionTy<'tcx> {
|
||||
pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId {
|
||||
let parent = tcx.parent(self.item_def_id);
|
||||
assert_eq!(tcx.def_kind(parent), DefKind::Trait);
|
||||
parent
|
||||
match tcx.def_kind(self.item_def_id) {
|
||||
DefKind::AssocTy | DefKind::AssocConst => tcx.parent(self.item_def_id),
|
||||
DefKind::ImplTraitPlaceholder => {
|
||||
tcx.parent(tcx.impl_trait_in_trait_parent(self.item_def_id))
|
||||
}
|
||||
kind => bug!("unexpected DefKind in ProjectionTy: {kind:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Extracts the underlying trait reference and own substs from this projection.
|
||||
|
@ -300,7 +300,7 @@ pub mod panic_count {
|
||||
thread_local! { static LOCAL_PANIC_COUNT: Cell<usize> = const { Cell::new(0) } }
|
||||
|
||||
// Sum of panic counts from all threads. The purpose of this is to have
|
||||
// a fast path in `is_zero` (which is used by `panicking`). In any particular
|
||||
// a fast path in `count_is_zero` (which is used by `panicking`). In any particular
|
||||
// thread, if that thread currently views `GLOBAL_PANIC_COUNT` as being zero,
|
||||
// then `LOCAL_PANIC_COUNT` in that thread is zero. This invariant holds before
|
||||
// and after increase and decrease, but not necessarily during their execution.
|
||||
@ -369,7 +369,7 @@ pub mod panic_count {
|
||||
}
|
||||
|
||||
// Slow path is in a separate function to reduce the amount of code
|
||||
// inlined from `is_zero`.
|
||||
// inlined from `count_is_zero`.
|
||||
#[inline(never)]
|
||||
#[cold]
|
||||
fn is_zero_slow_path() -> bool {
|
||||
|
@ -279,7 +279,6 @@ pub const STATUS_INVALID_PARAMETER: NTSTATUS = 0xc000000d_u32 as _;
|
||||
pub const STATUS_PENDING: NTSTATUS = 0x103 as _;
|
||||
pub const STATUS_END_OF_FILE: NTSTATUS = 0xC0000011_u32 as _;
|
||||
pub const STATUS_NOT_IMPLEMENTED: NTSTATUS = 0xC0000002_u32 as _;
|
||||
pub const STATUS_NOT_SUPPORTED: NTSTATUS = 0xC00000BB_u32 as _;
|
||||
|
||||
// Equivalent to the `NT_SUCCESS` C preprocessor macro.
|
||||
// See: https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/using-ntstatus-values
|
||||
@ -289,6 +288,7 @@ pub fn nt_success(status: NTSTATUS) -> bool {
|
||||
|
||||
// "RNG\0"
|
||||
pub const BCRYPT_RNG_ALGORITHM: &[u16] = &[b'R' as u16, b'N' as u16, b'G' as u16, 0];
|
||||
pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: DWORD = 0x00000002;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct UNICODE_STRING {
|
||||
@ -817,10 +817,6 @@ if #[cfg(not(target_vendor = "uwp"))] {
|
||||
|
||||
#[link(name = "advapi32")]
|
||||
extern "system" {
|
||||
// Forbidden when targeting UWP
|
||||
#[link_name = "SystemFunction036"]
|
||||
pub fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: ULONG) -> BOOLEAN;
|
||||
|
||||
// Allowed but unused by UWP
|
||||
pub fn OpenProcessToken(
|
||||
ProcessHandle: HANDLE,
|
||||
|
@ -13,15 +13,12 @@
|
||||
//! but significant number of users to experience panics caused by a failure of
|
||||
//! this function. See [#94098].
|
||||
//!
|
||||
//! The current version changes this to use the `BCRYPT_RNG_ALG_HANDLE`
|
||||
//! [Pseudo-handle], which gets the default RNG algorithm without querying the
|
||||
//! system preference thus hopefully avoiding the previous issue.
|
||||
//! This is only supported on Windows 10+ so a fallback is used for older versions.
|
||||
//! The current version falls back to using `BCryptOpenAlgorithmProvider` if
|
||||
//! `BCRYPT_USE_SYSTEM_PREFERRED_RNG` fails for any reason.
|
||||
//!
|
||||
//! [#94098]: https://github.com/rust-lang/rust/issues/94098
|
||||
//! [`RtlGenRandom`]: https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-rtlgenrandom
|
||||
//! [`BCryptGenRandom`]: https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom
|
||||
//! [Pseudo-handle]: https://docs.microsoft.com/en-us/windows/win32/seccng/cng-algorithm-pseudo-handles
|
||||
use crate::mem;
|
||||
use crate::ptr;
|
||||
use crate::sys::c;
|
||||
@ -33,37 +30,35 @@ use crate::sys::c;
|
||||
/// [`HashMap`]: crate::collections::HashMap
|
||||
/// [`RandomState`]: crate::collections::hash_map::RandomState
|
||||
pub fn hashmap_random_keys() -> (u64, u64) {
|
||||
Rng::open().and_then(|rng| rng.gen_random_keys()).unwrap_or_else(fallback_rng)
|
||||
Rng::SYSTEM.gen_random_keys().unwrap_or_else(fallback_rng)
|
||||
}
|
||||
|
||||
struct Rng(c::BCRYPT_ALG_HANDLE);
|
||||
struct Rng {
|
||||
algorithm: c::BCRYPT_ALG_HANDLE,
|
||||
flags: u32,
|
||||
}
|
||||
impl Rng {
|
||||
#[cfg(miri)]
|
||||
fn open() -> Result<Self, c::NTSTATUS> {
|
||||
const BCRYPT_RNG_ALG_HANDLE: c::BCRYPT_ALG_HANDLE = ptr::invalid_mut(0x81);
|
||||
let _ = (
|
||||
c::BCryptOpenAlgorithmProvider,
|
||||
c::BCryptCloseAlgorithmProvider,
|
||||
c::BCRYPT_RNG_ALGORITHM,
|
||||
c::STATUS_NOT_SUPPORTED,
|
||||
);
|
||||
Ok(Self(BCRYPT_RNG_ALG_HANDLE))
|
||||
const SYSTEM: Self = unsafe { Self::new(ptr::null_mut(), c::BCRYPT_USE_SYSTEM_PREFERRED_RNG) };
|
||||
|
||||
/// Create the RNG from an existing algorithm handle.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The handle must either be null or a valid algorithm handle.
|
||||
const unsafe fn new(algorithm: c::BCRYPT_ALG_HANDLE, flags: u32) -> Self {
|
||||
Self { algorithm, flags }
|
||||
}
|
||||
#[cfg(not(miri))]
|
||||
// Open a handle to the RNG algorithm.
|
||||
|
||||
/// Open a handle to the RNG algorithm.
|
||||
fn open() -> Result<Self, c::NTSTATUS> {
|
||||
use crate::sync::atomic::AtomicPtr;
|
||||
use crate::sync::atomic::Ordering::{Acquire, Release};
|
||||
const ERROR_VALUE: c::LPVOID = ptr::invalid_mut(usize::MAX);
|
||||
|
||||
// An atomic is used so we don't need to reopen the handle every time.
|
||||
static HANDLE: AtomicPtr<crate::ffi::c_void> = AtomicPtr::new(ptr::null_mut());
|
||||
|
||||
let mut handle = HANDLE.load(Acquire);
|
||||
// We use a sentinel value to designate an error occurred last time.
|
||||
if handle == ERROR_VALUE {
|
||||
Err(c::STATUS_NOT_SUPPORTED)
|
||||
} else if handle.is_null() {
|
||||
if handle.is_null() {
|
||||
let status = unsafe {
|
||||
c::BCryptOpenAlgorithmProvider(
|
||||
&mut handle,
|
||||
@ -80,13 +75,12 @@ impl Rng {
|
||||
unsafe { c::BCryptCloseAlgorithmProvider(handle, 0) };
|
||||
handle = previous_handle;
|
||||
}
|
||||
Ok(Self(handle))
|
||||
Ok(unsafe { Self::new(handle, 0) })
|
||||
} else {
|
||||
HANDLE.store(ERROR_VALUE, Release);
|
||||
Err(status)
|
||||
}
|
||||
} else {
|
||||
Ok(Self(handle))
|
||||
Ok(unsafe { Self::new(handle, 0) })
|
||||
}
|
||||
}
|
||||
|
||||
@ -94,33 +88,19 @@ impl Rng {
|
||||
let mut v = (0, 0);
|
||||
let status = unsafe {
|
||||
let size = mem::size_of_val(&v).try_into().unwrap();
|
||||
c::BCryptGenRandom(self.0, ptr::addr_of_mut!(v).cast(), size, 0)
|
||||
c::BCryptGenRandom(self.algorithm, ptr::addr_of_mut!(v).cast(), size, self.flags)
|
||||
};
|
||||
if c::nt_success(status) { Ok(v) } else { Err(status) }
|
||||
}
|
||||
}
|
||||
|
||||
/// Generate random numbers using the fallback RNG function (RtlGenRandom)
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
/// Generate random numbers using the fallback RNG function
|
||||
#[inline(never)]
|
||||
fn fallback_rng(rng_status: c::NTSTATUS) -> (u64, u64) {
|
||||
let mut v = (0, 0);
|
||||
let ret =
|
||||
unsafe { c::RtlGenRandom(&mut v as *mut _ as *mut u8, mem::size_of_val(&v) as c::ULONG) };
|
||||
|
||||
if ret != 0 {
|
||||
v
|
||||
} else {
|
||||
panic!(
|
||||
"RNG broken: {rng_status:#x}, fallback RNG broken: {}",
|
||||
crate::io::Error::last_os_error()
|
||||
)
|
||||
match Rng::open().and_then(|rng| rng.gen_random_keys()) {
|
||||
Ok(keys) => keys,
|
||||
Err(status) => {
|
||||
panic!("RNG broken: {rng_status:#x}, fallback RNG broken: {status:#x}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// We can't use RtlGenRandom with UWP, so there is no fallback
|
||||
#[cfg(target_vendor = "uwp")]
|
||||
#[inline(never)]
|
||||
fn fallback_rng(rng_status: c::NTSTATUS) -> (u64, u64) {
|
||||
panic!("RNG broken: {rng_status:#x} fallback RNG broken: RtlGenRandom() not supported on UWP");
|
||||
}
|
||||
|
@ -1424,7 +1424,7 @@ impl Step for Extended {
|
||||
|
||||
let xform = |p: &Path| {
|
||||
let mut contents = t!(fs::read_to_string(p));
|
||||
for tool in &["rust-demangler", "rust-analyzer", "rustfmt"] {
|
||||
for tool in &["rust-demangler"] {
|
||||
if !built_tools.contains(tool) {
|
||||
contents = filter(&contents, tool);
|
||||
}
|
||||
@ -1465,7 +1465,8 @@ impl Step for Extended {
|
||||
prepare("rust-analysis");
|
||||
prepare("clippy");
|
||||
prepare("miri");
|
||||
for tool in &["rust-docs", "rust-demangler", "rust-analyzer"] {
|
||||
prepare("rust-analyzer");
|
||||
for tool in &["rust-docs", "rust-demangler"] {
|
||||
if built_tools.contains(tool) {
|
||||
prepare(tool);
|
||||
}
|
||||
@ -1525,7 +1526,8 @@ impl Step for Extended {
|
||||
prepare("rust-std");
|
||||
prepare("clippy");
|
||||
prepare("miri");
|
||||
for tool in &["rust-demangler", "rust-analyzer"] {
|
||||
prepare("rust-analyzer");
|
||||
for tool in &["rust-demangler"] {
|
||||
if built_tools.contains(tool) {
|
||||
prepare(tool);
|
||||
}
|
||||
@ -1609,25 +1611,23 @@ impl Step for Extended {
|
||||
.arg("-out")
|
||||
.arg(exe.join("StdGroup.wxs")),
|
||||
);
|
||||
if built_tools.contains("rust-analyzer") {
|
||||
builder.run(
|
||||
Command::new(&heat)
|
||||
.current_dir(&exe)
|
||||
.arg("dir")
|
||||
.arg("rust-analyzer")
|
||||
.args(&heat_flags)
|
||||
.arg("-cg")
|
||||
.arg("RustAnalyzerGroup")
|
||||
.arg("-dr")
|
||||
.arg("RustAnalyzer")
|
||||
.arg("-var")
|
||||
.arg("var.RustAnalyzerDir")
|
||||
.arg("-out")
|
||||
.arg(exe.join("RustAnalyzerGroup.wxs"))
|
||||
.arg("-t")
|
||||
.arg(etc.join("msi/remove-duplicates.xsl")),
|
||||
);
|
||||
}
|
||||
builder.run(
|
||||
Command::new(&heat)
|
||||
.current_dir(&exe)
|
||||
.arg("dir")
|
||||
.arg("rust-analyzer")
|
||||
.args(&heat_flags)
|
||||
.arg("-cg")
|
||||
.arg("RustAnalyzerGroup")
|
||||
.arg("-dr")
|
||||
.arg("RustAnalyzer")
|
||||
.arg("-var")
|
||||
.arg("var.RustAnalyzerDir")
|
||||
.arg("-out")
|
||||
.arg(exe.join("RustAnalyzerGroup.wxs"))
|
||||
.arg("-t")
|
||||
.arg(etc.join("msi/remove-duplicates.xsl")),
|
||||
);
|
||||
builder.run(
|
||||
Command::new(&heat)
|
||||
.current_dir(&exe)
|
||||
@ -2026,6 +2026,7 @@ impl Step for RustDev {
|
||||
"llvm-dwp",
|
||||
"llvm-nm",
|
||||
"llvm-dwarfdump",
|
||||
"llvm-dis",
|
||||
] {
|
||||
tarball.add_file(src_bindir.join(exe(bin, target)), "bin", 0o755);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
Change this file to make users of the `download-ci-llvm` configuration download
|
||||
a new version of LLVM from CI, even if the LLVM submodule hasn’t changed.
|
||||
|
||||
Last change is for: https://github.com/rust-lang/rust/pull/96867
|
||||
Last change is for: https://github.com/rust-lang/rust/pull/97550
|
||||
|
@ -1 +1 @@
|
||||
0.10.0
|
||||
0.11.0
|
@ -24,6 +24,7 @@
|
||||
- [armv6k-nintendo-3ds](platform-support/armv6k-nintendo-3ds.md)
|
||||
- [armv7-unknown-linux-uclibceabi](platform-support/armv7-unknown-linux-uclibceabi.md)
|
||||
- [armv7-unknown-linux-uclibceabihf](platform-support/armv7-unknown-linux-uclibceabihf.md)
|
||||
- [\*-android and \*-androideabi](platform-support/android.md)
|
||||
- [\*-fuchsia](platform-support/fuchsia.md)
|
||||
- [\*-kmc-solid_\*](platform-support/kmc-solid.md)
|
||||
- [m68k-unknown-linux-gnu](platform-support/m68k-unknown-linux-gnu.md)
|
||||
|
@ -270,6 +270,11 @@ This flag will set which lints should be set to the [warn level](lints/levels.md
|
||||
|
||||
_Note:_ The order of these lint level arguments is taken into account, see [lint level via compiler flag](lints/levels.md#via-compiler-flag) for more information.
|
||||
|
||||
<a id="option-force-warn"></a>
|
||||
## `--force-warn`: force a lint to warn
|
||||
|
||||
This flag sets the given lint to the [forced warn level](lints/levels.md#force-warn) and the level cannot be overridden, even ignoring the [lint caps](lints/levels.md#capping-lints).
|
||||
|
||||
<a id="option-a-allow"></a>
|
||||
## `-A`: set lint allowed
|
||||
|
||||
@ -381,6 +386,12 @@ are:
|
||||
- `always` — Always use colors.
|
||||
- `never` — Never colorize output.
|
||||
|
||||
<a id="option-diagnostic-width"></a>
|
||||
## `--diagnostic-width`: specify the terminal width for diagnostics
|
||||
|
||||
This flag takes a number that specifies the width of the terminal in characters.
|
||||
Formatting of diagnostics will take the width into consideration to make them better fit on the screen.
|
||||
|
||||
<a id="option-remap-path-prefix"></a>
|
||||
## `--remap-path-prefix`: remap source names in output
|
||||
|
||||
|
@ -125,17 +125,17 @@ target | std | notes
|
||||
`aarch64-apple-ios` | ✓ | ARM64 iOS
|
||||
[`aarch64-apple-ios-sim`](platform-support/aarch64-apple-ios-sim.md) | ✓ | Apple iOS Simulator on ARM64
|
||||
`aarch64-fuchsia` | ✓ | ARM64 Fuchsia
|
||||
`aarch64-linux-android` | ✓ | ARM64 Android
|
||||
[`aarch64-linux-android`](platform-support/android.md) | ✓ | ARM64 Android
|
||||
`aarch64-unknown-none-softfloat` | * | Bare ARM64, softfloat
|
||||
`aarch64-unknown-none` | * | Bare ARM64, hardfloat
|
||||
`arm-linux-androideabi` | ✓ | ARMv7 Android
|
||||
[`arm-linux-androideabi`](platform-support/android.md) | ✓ | ARMv7 Android
|
||||
`arm-unknown-linux-musleabi` | ✓ | ARMv6 Linux with MUSL
|
||||
`arm-unknown-linux-musleabihf` | ✓ | ARMv6 Linux with MUSL, hardfloat
|
||||
`armebv7r-none-eabi` | * | Bare ARMv7-R, Big Endian
|
||||
`armebv7r-none-eabihf` | * | Bare ARMv7-R, Big Endian, hardfloat
|
||||
`armv5te-unknown-linux-gnueabi` | ✓ | ARMv5TE Linux (kernel 4.4, glibc 2.23)
|
||||
`armv5te-unknown-linux-musleabi` | ✓ | ARMv5TE Linux with MUSL
|
||||
`armv7-linux-androideabi` | ✓ | ARMv7a Android
|
||||
[`armv7-linux-androideabi`](platform-support/android.md) | ✓ | ARMv7a Android
|
||||
`armv7-unknown-linux-gnueabi` | ✓ |ARMv7 Linux (kernel 4.15, glibc 2.27)
|
||||
`armv7-unknown-linux-musleabi` | ✓ |ARMv7 Linux with MUSL
|
||||
`armv7-unknown-linux-musleabihf` | ✓ | ARMv7 Linux with MUSL, hardfloat
|
||||
@ -146,7 +146,7 @@ target | std | notes
|
||||
`i586-pc-windows-msvc` | * | 32-bit Windows w/o SSE
|
||||
`i586-unknown-linux-gnu` | ✓ | 32-bit Linux w/o SSE (kernel 4.4, glibc 2.23)
|
||||
`i586-unknown-linux-musl` | ✓ | 32-bit Linux w/o SSE, MUSL
|
||||
`i686-linux-android` | ✓ | 32-bit x86 Android
|
||||
[`i686-linux-android`](platform-support/android.md) | ✓ | 32-bit x86 Android
|
||||
`i686-unknown-freebsd` | ✓ | 32-bit FreeBSD
|
||||
`i686-unknown-linux-musl` | ✓ | 32-bit Linux with MUSL
|
||||
`mips-unknown-linux-musl` | ✓ | MIPS Linux with MUSL
|
||||
@ -165,7 +165,7 @@ target | std | notes
|
||||
`thumbv7em-none-eabi` | * | Bare Cortex-M4, M7
|
||||
`thumbv7em-none-eabihf` | * | Bare Cortex-M4F, M7F, FPU, hardfloat
|
||||
`thumbv7m-none-eabi` | * | Bare Cortex-M3
|
||||
`thumbv7neon-linux-androideabi` | ✓ | Thumb2-mode ARMv7a Android with NEON
|
||||
[`thumbv7neon-linux-androideabi`](platform-support/android.md) | ✓ | Thumb2-mode ARMv7a Android with NEON
|
||||
`thumbv7neon-unknown-linux-gnueabihf` | ✓ | Thumb2-mode ARMv7a Linux with NEON (kernel 4.4, glibc 2.23)
|
||||
`thumbv8m.base-none-eabi` | * | ARMv8-M Baseline
|
||||
`thumbv8m.main-none-eabi` | * | ARMv8-M Mainline
|
||||
@ -176,7 +176,7 @@ target | std | notes
|
||||
`x86_64-apple-ios` | ✓ | 64-bit x86 iOS
|
||||
[`x86_64-fortanix-unknown-sgx`](platform-support/x86_64-fortanix-unknown-sgx.md) | ✓ | [Fortanix ABI] for 64-bit Intel SGX
|
||||
`x86_64-fuchsia` | ✓ | 64-bit Fuchsia
|
||||
`x86_64-linux-android` | ✓ | 64-bit x86 Android
|
||||
[`x86_64-linux-android`](platform-support/android.md) | ✓ | 64-bit x86 Android
|
||||
`x86_64-pc-solaris` | ✓ | 64-bit Solaris 10/11, illumos
|
||||
`x86_64-unknown-linux-gnux32` | ✓ | 64-bit Linux (x32 ABI) (kernel 4.15, glibc 2.27)
|
||||
[`x86_64-unknown-none`](platform-support/x86_64-unknown-none.md) | * | Freestanding/bare-metal x86_64, softfloat
|
||||
|
45
src/doc/rustc/src/platform-support/android.md
Normal file
45
src/doc/rustc/src/platform-support/android.md
Normal file
@ -0,0 +1,45 @@
|
||||
# *-linux-android and *-linux-androideabi
|
||||
|
||||
**Tier: 2**
|
||||
|
||||
[Android] is a mobile operating system built on top of the Linux kernel.
|
||||
|
||||
[Android]: https://source.android.com/
|
||||
|
||||
## Target maintainers
|
||||
|
||||
- Chris Wailes ([@chriswailes](https://github.com/chriswailes))
|
||||
- Matthew Maurer ([@maurer](https://github.com/maurer))
|
||||
- Martin Geisler ([@mgeisler](https://github.com/mgeisler))
|
||||
|
||||
## Requirements
|
||||
|
||||
This target is cross-compiled from a host environment. Development may be done
|
||||
from the [source tree] or using the Android NDK.
|
||||
|
||||
[source tree]: https://source.android.com/docs/setup/build/downloading
|
||||
|
||||
Android targets support std. Generated binaries use the ELF file format.
|
||||
|
||||
## NDK/API Update Policy
|
||||
|
||||
Rust will support the most recent Long Term Support (LTS) Android Native
|
||||
Development Kit (NDK). By default Rust will support all API levels supported
|
||||
by the NDK, but a higher minimum API level may be required if deemed necessary.
|
||||
|
||||
## Building the target
|
||||
|
||||
To build Rust binaries for Android you'll need a copy of the most recent LTS
|
||||
edition of the [Android NDK]. Supported Android targets are:
|
||||
|
||||
* aarch64-linux-android
|
||||
* arm-linux-androideabi
|
||||
* armv7-linux-androideabi
|
||||
* i686-linux-android
|
||||
* thumbv7neon-linux-androideabi
|
||||
* x86_64-linux-android
|
||||
|
||||
[Android NDK]: https://developer.android.com/ndk/downloads
|
||||
|
||||
A list of all supported targets can be found
|
||||
[here](https://doc.rust-lang.org/rustc/platform-support.html)
|
@ -411,7 +411,7 @@ img {
|
||||
|
||||
.sidebar {
|
||||
font-size: 0.875rem;
|
||||
width: 250px;
|
||||
width: 200px;
|
||||
min-width: 200px;
|
||||
overflow-y: scroll;
|
||||
position: sticky;
|
||||
|
@ -7,15 +7,21 @@ size: (786, 600)
|
||||
// Confirms that there 3 paragraphs.
|
||||
assert-count: (".top-doc .docblock p", 3)
|
||||
// Checking that there is no scrollable content.
|
||||
store-property: (clientHeight, ".top-doc .docblock p:nth-of-type(1)", "clientHeight")
|
||||
store-property: (clientWidth, ".top-doc .docblock p:nth-of-type(1)", "clientWidth")
|
||||
assert-property: (
|
||||
".top-doc .docblock p:nth-of-type(1)",
|
||||
{"scrollHeight": "120", "clientHeight": "120", "scrollWidth": "502", "clientWidth": "502"},
|
||||
{"scrollHeight": |clientHeight|, "scrollWidth": |clientWidth|},
|
||||
)
|
||||
store-property: (clientHeight, ".top-doc .docblock p:nth-of-type(2)", "clientHeight")
|
||||
store-property: (clientWidth, ".top-doc .docblock p:nth-of-type(2)", "clientWidth")
|
||||
assert-property: (
|
||||
".top-doc .docblock p:nth-of-type(2)",
|
||||
{"scrollHeight": "48", "clientHeight": "48", "scrollWidth": "502", "clientWidth": "502"},
|
||||
{"scrollHeight": |clientHeight|, "scrollWidth": |clientWidth|},
|
||||
)
|
||||
store-property: (clientHeight, ".top-doc .docblock p:nth-of-type(3)", "clientHeight")
|
||||
store-property: (clientWidth, ".top-doc .docblock p:nth-of-type(3)", "clientWidth")
|
||||
assert-property: (
|
||||
".top-doc .docblock p:nth-of-type(3)",
|
||||
{"scrollHeight": "48", "clientHeight": "48", "scrollWidth": "502", "clientWidth": "502"},
|
||||
{"scrollHeight": |clientHeight|, "scrollWidth": |clientWidth|},
|
||||
)
|
||||
|
@ -5,4 +5,4 @@ size: (1080, 600)
|
||||
assert-count: (".docblock > .example-wrap", 2)
|
||||
assert: ".docblock > .example-wrap > .language-txt"
|
||||
assert: ".docblock > .example-wrap > .rust-example-rendered"
|
||||
assert-css: (".docblock > .example-wrap > pre", {"width": "785.25px", "overflow-x": "auto"}, ALL)
|
||||
assert-css: (".docblock > .example-wrap > pre", {"width": "796px", "overflow-x": "auto"}, ALL)
|
||||
|
@ -4,7 +4,7 @@ goto: file://|DOC_PATH|/lib2/long_table/struct.Foo.html
|
||||
size: (1100, 800)
|
||||
// Logically, the ".docblock" and the "<p>" should have the same scroll width.
|
||||
compare-elements-property: (".top-doc .docblock", ".top-doc .docblock > p", ["scrollWidth"])
|
||||
assert-property: (".top-doc .docblock", {"scrollWidth": "801"})
|
||||
assert-property: (".top-doc .docblock", {"scrollWidth": "816"})
|
||||
// However, since there is overflow in the <table>, its scroll width is bigger.
|
||||
assert-property: (".top-doc .docblock table", {"scrollWidth": "1572"})
|
||||
|
||||
@ -16,6 +16,6 @@ compare-elements-property: (
|
||||
"#implementations-list > details .docblock > p",
|
||||
["scrollWidth"],
|
||||
)
|
||||
assert-property: ("#implementations-list > details .docblock", {"scrollWidth": "801"})
|
||||
assert-property: ("#implementations-list > details .docblock", {"scrollWidth": "816"})
|
||||
// However, since there is overflow in the <table>, its scroll width is bigger.
|
||||
assert-property: ("#implementations-list > details .docblock table", {"scrollWidth": "1572"})
|
||||
|
@ -4,7 +4,7 @@ goto: file://|DOC_PATH|/lib2/struct.LongItemInfo.html
|
||||
size: (1200, 870)
|
||||
// Logically, the "item-decl" and the "item-info" should have the same scroll width.
|
||||
compare-elements-property: (".item-decl", ".item-info", ["scrollWidth"])
|
||||
assert-property: (".item-info", {"scrollWidth": "890"})
|
||||
assert-property: (".item-info", {"scrollWidth": "940"})
|
||||
// Just to be sure we're comparing the correct "item-info":
|
||||
assert-text: (
|
||||
".item-info",
|
||||
@ -21,7 +21,7 @@ compare-elements-property: (
|
||||
)
|
||||
assert-property: (
|
||||
"#impl-SimpleTrait-for-LongItemInfo2 .item-info",
|
||||
{"scrollWidth": "866"},
|
||||
{"scrollWidth": "916"},
|
||||
)
|
||||
// Just to be sure we're comparing the correct "item-info":
|
||||
assert-text: (
|
||||
|
@ -4,9 +4,9 @@ goto: file://|DOC_PATH|/lib2/struct.Foo.html
|
||||
// We set a fixed size so there is no chance of "random" resize.
|
||||
size: (1100, 800)
|
||||
// We check that ".item-info" is bigger than its content.
|
||||
assert-css: (".item-info", {"width": "790px"})
|
||||
assert-css: (".item-info", {"width": "840px"})
|
||||
assert-css: (".item-info .stab", {"width": "289px"})
|
||||
assert-position: (".item-info .stab", {"x": 295})
|
||||
assert-position: (".item-info .stab", {"x": 245})
|
||||
|
||||
// Now we ensure that they're not rendered on the same line.
|
||||
goto: file://|DOC_PATH|/lib2/trait.Trait.html
|
||||
|
@ -18,11 +18,11 @@ compare-elements-position-false: (
|
||||
// The `i` should be *after* the type.
|
||||
assert-position: (
|
||||
"//*[@id='method.create_an_iterator_from_read']//a[text()='NotableStructWithLongName']",
|
||||
{"x": 692},
|
||||
{"x": 677},
|
||||
)
|
||||
assert-position: (
|
||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']",
|
||||
{"x": 966},
|
||||
{"x": 951},
|
||||
)
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@ press-key: 'Enter'
|
||||
wait-for: "#crate-search"
|
||||
// The width is returned by "getComputedStyle" which returns the exact number instead of the
|
||||
// CSS rule which is "50%"...
|
||||
assert-css: (".search-results div.desc", {"width": "293px"})
|
||||
assert-css: (".search-results div.desc", {"width": "318px"})
|
||||
size: (600, 100)
|
||||
// As counter-intuitive as it may seem, in this width, the width is "100%", which is why
|
||||
// when computed it's larger.
|
||||
|
@ -1,5 +1,6 @@
|
||||
// Checks multiple things on the sidebar display (width of its elements, colors, etc).
|
||||
goto: file://|DOC_PATH|/test_docs/index.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
show-text: true
|
||||
local-storage: {"rustdoc-theme": "light"}
|
||||
// We reload the page so the local storage settings are being used.
|
||||
@ -39,11 +40,13 @@ assert-property: ("html", {"scrollTop": "0"})
|
||||
|
||||
// We now go back to the crate page to click on the "lib2" crate link.
|
||||
goto: file://|DOC_PATH|/test_docs/index.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
assert-css: (".sidebar-elems .crate > ul > li:first-child > a", {"color": "rgb(53, 109, 164)"})
|
||||
click: ".sidebar-elems .crate > ul > li:first-child > a"
|
||||
|
||||
// PAGE: lib2/index.html
|
||||
goto: file://|DOC_PATH|/lib2/index.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
assert-text: (".sidebar > .location", "Crate lib2")
|
||||
// We check that we have the crates list and that the "current" on is now "lib2".
|
||||
assert-text: (".sidebar-elems .crate > ul > li > a.current", "lib2")
|
||||
@ -65,11 +68,13 @@ assert-text: (".sidebar .sidebar-elems .location", "In lib2")
|
||||
assert-false: ".sidebar-elems > .crate"
|
||||
|
||||
goto: ./module/index.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
assert-text: (".sidebar > .location", "Module module")
|
||||
// We check that we don't have the crate list.
|
||||
assert-false: ".sidebar-elems > .crate"
|
||||
|
||||
goto: ./sub_module/sub_sub_module/index.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
assert-text: (".sidebar > .location", "Module sub_sub_module")
|
||||
// We check that we don't have the crate list.
|
||||
assert-false: ".sidebar-elems .crate"
|
||||
@ -78,11 +83,21 @@ assert-text: ("#functions + .item-table .item-left > a", "foo")
|
||||
|
||||
// Links to trait implementations in the sidebar should not wrap even if they are long.
|
||||
goto: file://|DOC_PATH|/lib2/struct.HasALongTraitWithParams.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
assert-property: (".sidebar-elems section .block li > a", {"offsetHeight": 29})
|
||||
|
||||
// Test that clicking on of the "In <module>" headings in the sidebar links to the
|
||||
// appropriate anchor in index.html.
|
||||
goto: file://|DOC_PATH|/test_docs/struct.Foo.html
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
click: ".block.mod h3 a"
|
||||
// PAGE: index.html
|
||||
assert-css: ("#modules", {"background-color": "rgb(253, 255, 211)"})
|
||||
|
||||
// Finally, assert that the `[+]/[−]` toggle doesn't affect sidebar width.
|
||||
click: "#toggle-all-docs"
|
||||
assert-text: ("#toggle-all-docs", "[+]")
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
||||
click: "#toggle-all-docs"
|
||||
assert-text: ("#toggle-all-docs", "[−]")
|
||||
assert-property: (".sidebar", {"clientWidth": "200"})
|
@ -15,7 +15,7 @@ assert-property: (".item-table .struct", {"offsetWidth": "684"})
|
||||
goto: file://|DOC_PATH|/lib2/too_long/type.ReallyLongTypeNameLongLongLong.html
|
||||
assert-property: ("body", {"scrollWidth": "1100"})
|
||||
// We now check that the section width hasn't grown because of it.
|
||||
assert-property: ("#main-content", {"scrollWidth": "825"})
|
||||
assert-property: ("#main-content", {"scrollWidth": "840"})
|
||||
// And now checking that it has scrollable content.
|
||||
assert-property: (".item-decl pre", {"scrollWidth": "1103"})
|
||||
|
||||
@ -24,7 +24,7 @@ assert-property: (".item-decl pre", {"scrollWidth": "1103"})
|
||||
goto: file://|DOC_PATH|/lib2/too_long/constant.ReallyLongTypeNameLongLongLongConstBecauseWhyNotAConstRightGigaGigaSupraLong.html
|
||||
assert-property: ("body", {"scrollWidth": "1100"})
|
||||
// We now check that the section width hasn't grown because of it.
|
||||
assert-property: ("#main-content", {"scrollWidth": "825"})
|
||||
assert-property: ("#main-content", {"scrollWidth": "840"})
|
||||
// And now checking that it has scrollable content.
|
||||
assert-property: (".item-decl pre", {"scrollWidth": "950"})
|
||||
|
||||
@ -32,6 +32,6 @@ assert-property: (".item-decl pre", {"scrollWidth": "950"})
|
||||
size: (600, 600)
|
||||
goto: file://|DOC_PATH|/lib2/too_long/struct.SuperIncrediblyLongLongLongLongLongLongLongGigaGigaGigaMegaLongLongLongStructName.html
|
||||
// It shouldn't have an overflow in the topbar either.
|
||||
assert-property: (".mobile-topbar .location", {"scrollWidth": "500"})
|
||||
assert-property: (".mobile-topbar .location", {"clientWidth": "500"})
|
||||
store-property: (scrollWidth, ".mobile-topbar .location", "scrollWidth")
|
||||
assert-property: (".mobile-topbar .location", {"clientWidth": |scrollWidth|})
|
||||
assert-css: (".mobile-topbar .location", {"overflow-x": "hidden"})
|
||||
|
@ -6,6 +6,7 @@
|
||||
// ignore-windows - this is a unix-specific test
|
||||
// ignore-emscripten no processes
|
||||
// ignore-sgx no processes
|
||||
// ignore-fuchsia no execvp syscall
|
||||
#![feature(process_exec, rustc_private)]
|
||||
|
||||
extern crate libc;
|
||||
|
@ -2,6 +2,7 @@
|
||||
// ignore-android
|
||||
// ignore-emscripten
|
||||
// ignore-sgx
|
||||
// ignore-fuchsia no '/bin/sh', '/bin/ls'
|
||||
|
||||
#![feature(rustc_private)]
|
||||
|
||||
|
30
src/test/ui/impl-trait/in-trait/issue-102140.rs
Normal file
30
src/test/ui/impl-trait/in-trait/issue-102140.rs
Normal file
@ -0,0 +1,30 @@
|
||||
#![feature(return_position_impl_trait_in_trait)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait Marker {}
|
||||
impl Marker for u32 {}
|
||||
|
||||
trait MyTrait {
|
||||
fn foo(&self) -> impl Marker
|
||||
where
|
||||
Self: Sized;
|
||||
}
|
||||
|
||||
struct Outer;
|
||||
|
||||
impl MyTrait for Outer {
|
||||
fn foo(&self) -> impl Marker {
|
||||
42
|
||||
}
|
||||
}
|
||||
|
||||
impl dyn MyTrait {
|
||||
fn other(&self) -> impl Marker {
|
||||
MyTrait::foo(&self)
|
||||
//~^ ERROR the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
//~| ERROR the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
//~| ERROR the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
29
src/test/ui/impl-trait/in-trait/issue-102140.stderr
Normal file
29
src/test/ui/impl-trait/in-trait/issue-102140.stderr
Normal file
@ -0,0 +1,29 @@
|
||||
error[E0277]: the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
--> $DIR/issue-102140.rs:23:22
|
||||
|
|
||||
LL | MyTrait::foo(&self)
|
||||
| ------------ -^^^^
|
||||
| | |
|
||||
| | the trait `MyTrait` is not implemented for `&dyn MyTrait`
|
||||
| | help: consider removing the leading `&`-reference
|
||||
| required by a bound introduced by this call
|
||||
|
||||
error[E0277]: the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
--> $DIR/issue-102140.rs:23:9
|
||||
|
|
||||
LL | MyTrait::foo(&self)
|
||||
| ^^^^^^^^^^^^^^^^^^^ the trait `MyTrait` is not implemented for `&dyn MyTrait`
|
||||
|
|
||||
= help: the trait `MyTrait` is implemented for `Outer`
|
||||
|
||||
error[E0277]: the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
--> $DIR/issue-102140.rs:23:9
|
||||
|
|
||||
LL | MyTrait::foo(&self)
|
||||
| ^^^^^^^^^^^^ the trait `MyTrait` is not implemented for `&dyn MyTrait`
|
||||
|
|
||||
= help: the trait `MyTrait` is implemented for `Outer`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue
Block a user