Auto merge of #152450 - cuviper:stable-next, r=cuviper
[stable] prepare Rust 1.93.1 This includes the following backported fixes: - Don't try to recover keyword as non-keyword identifier rust-lang/rust#150590 - Fix `panicking_unwrap` FP on field access with implicit deref rust-lang/rust-clippy#16196 - Revert "Update wasm-related dependencies in CI" rust-lang/rust#152259 And these are just to avoid recent CI issues: - Remove rustdoc GUI flaky test rust-lang/rust#152116 - Remove the 4 failing tests from rustdoc-gui rust-lang/rust#152194 r? @rust-lang/release @rustbot ping relnotes-interest-group
This commit is contained in:
commit
01f6ddf758
17 changed files with 136 additions and 583 deletions
52
RELEASES.md
52
RELEASES.md
|
|
@ -1,45 +1,49 @@
|
||||||
Version 1.93 (2026-01-22)
|
Version 1.93.1 (2026-02-12)
|
||||||
|
===========================
|
||||||
|
|
||||||
|
<a id="1.93.1"></a>
|
||||||
|
|
||||||
|
- [Don't try to recover keyword as non-keyword identifier](https://github.com/rust-lang/rust/pull/150590), fixing an ICE that especially [affected rustfmt](https://github.com/rust-lang/rustfmt/issues/6739).
|
||||||
|
- [Fix `clippy::panicking_unwrap` false-positive on field access with implicit deref](https://github.com/rust-lang/rust-clippy/pull/16196).
|
||||||
|
- [Revert "Update wasm-related dependencies in CI"](https://github.com/rust-lang/rust/pull/152259), fixing file descriptor leaks on the `wasm32-wasip2` target.
|
||||||
|
|
||||||
|
Version 1.93.0 (2026-01-22)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
<a id="1.93-Language"></a>
|
<a id="1.93.0-Language"></a>
|
||||||
|
|
||||||
Language
|
Language
|
||||||
--------
|
--------
|
||||||
- [Add warn-by-default `function_casts_as_integer` lint](https://github.com/rust-lang/rust/pull/141470)
|
|
||||||
- [Add future-incompatibility warning for `...` function parameters without a pattern outside of `extern` blocks](https://github.com/rust-lang/rust/pull/143619)
|
|
||||||
- [Stabilize several s390x `vector`-related target features and the `is_s390x_feature_detected!` macro](https://github.com/rust-lang/rust/pull/145656)
|
- [Stabilize several s390x `vector`-related target features and the `is_s390x_feature_detected!` macro](https://github.com/rust-lang/rust/pull/145656)
|
||||||
- [Stabilize declaration of C-style variadic functions for the `system` ABI](https://github.com/rust-lang/rust/pull/145954)
|
- [Stabilize declaration of C-style variadic functions for the `system` ABI](https://github.com/rust-lang/rust/pull/145954)
|
||||||
- [Emit error when using some keyword as a `cfg` predicate](https://github.com/rust-lang/rust/pull/146978)
|
- [Emit error when using some keyword as a `cfg` predicate](https://github.com/rust-lang/rust/pull/146978)
|
||||||
- [Introduce future-compatibility warning for `repr(C)` enums whose discriminant values do not fit into a `c_int` or `c_uint`](https://github.com/rust-lang/rust/pull/147017)
|
|
||||||
- [Introduce future-compatibility warning against ignoring `repr(C)` types as part of `repr(transparent)`](https://github.com/rust-lang/rust/pull/147185)
|
|
||||||
- [Stabilize `asm_cfg`](https://github.com/rust-lang/rust/pull/147736)
|
- [Stabilize `asm_cfg`](https://github.com/rust-lang/rust/pull/147736)
|
||||||
- [Upgrade the `deref_nullptr` lint from warn-by-default to deny-by-default](https://github.com/rust-lang/rust/pull/148122)
|
|
||||||
- [During const-evaluation, support copying pointers byte-by-byte](https://github.com/rust-lang/rust/pull/148259)
|
- [During const-evaluation, support copying pointers byte-by-byte](https://github.com/rust-lang/rust/pull/148259)
|
||||||
- [Add warn-by-default `const_item_interior_mutations` lint to warn against calls which mutate interior mutable `const` items](https://github.com/rust-lang/rust/pull/148407)
|
|
||||||
- [LUB coercions now correctly handle function item types, and functions with differing safeties](https://github.com/rust-lang/rust/pull/148602)
|
- [LUB coercions now correctly handle function item types, and functions with differing safeties](https://github.com/rust-lang/rust/pull/148602)
|
||||||
- [Allow `const` items that contain mutable references to `static` (which is *very* unsafe, but not *always* UB)](https://github.com/rust-lang/rust/pull/148746)
|
- [Allow `const` items that contain mutable references to `static` (which is *very* unsafe, but not *always* UB)](https://github.com/rust-lang/rust/pull/148746)
|
||||||
|
- [Add warn-by-default `const_item_interior_mutations` lint to warn against calls which mutate interior mutable `const` items](https://github.com/rust-lang/rust/pull/148407)
|
||||||
|
- [Add warn-by-default `function_casts_as_integer` lint](https://github.com/rust-lang/rust/pull/141470)
|
||||||
|
|
||||||
|
|
||||||
<a id="1.93-Compiler"></a>
|
<a id="1.93.0-Compiler"></a>
|
||||||
|
|
||||||
Compiler
|
Compiler
|
||||||
--------
|
--------
|
||||||
- [Stabilize `-Cjump-tables=bool`](https://github.com/rust-lang/rust/pull/145974). The flag was previously called `-Zno-jump-tables`.
|
- [Stabilize `-Cjump-tables=bool`](https://github.com/rust-lang/rust/pull/145974). The flag was previously called `-Zno-jump-tables`.
|
||||||
- [Promote `riscv64a23-unknown-linux-gnu` to Tier 2 (without host tools)](https://github.com/rust-lang/rust/pull/148435)
|
|
||||||
|
|
||||||
|
<a id="1.93.0-Platform-Support"></a>
|
||||||
<a id="1.93-Platform-Support"></a>
|
|
||||||
|
|
||||||
Platform Support
|
Platform Support
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
- [Promote `riscv64a23-unknown-linux-gnu` to Tier 2 (without host tools)](https://github.com/rust-lang/rust/pull/148435)
|
||||||
|
|
||||||
Refer to Rust's [platform support page][platform-support-doc]
|
Refer to Rust's [platform support page][platform-support-doc]
|
||||||
for more information on Rust's tiered platform support.
|
for more information on Rust's tiered platform support.
|
||||||
|
|
||||||
[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html
|
[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html
|
||||||
|
|
||||||
<a id="1.93-Libraries"></a>
|
<a id="1.93.0-Libraries"></a>
|
||||||
|
|
||||||
Libraries
|
Libraries
|
||||||
---------
|
---------
|
||||||
|
|
@ -49,14 +53,14 @@ Libraries
|
||||||
- [Don't require `T: RefUnwindSafe` for `vec::IntoIter<T>: UnwindSafe`](https://github.com/rust-lang/rust/pull/145665)
|
- [Don't require `T: RefUnwindSafe` for `vec::IntoIter<T>: UnwindSafe`](https://github.com/rust-lang/rust/pull/145665)
|
||||||
|
|
||||||
|
|
||||||
<a id="1.93-Stabilized-APIs"></a>
|
<a id="1.93.0-Stabilized-APIs"></a>
|
||||||
|
|
||||||
Stabilized APIs
|
Stabilized APIs
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
- [`<MaybeUninit<T>>::assume_init_drop`](https://doc.rust-lang.org/stable/core/mem/union.MaybeUninit.html#method.assume_init_drop)
|
- [`<[MaybeUninit<T>]>::assume_init_drop`](https://doc.rust-lang.org/stable/core/primitive.slice.html#method.assume_init_drop)
|
||||||
- [`<MaybeUninit<T>>::assume_init_ref`](https://doc.rust-lang.org/stable/core/mem/union.MaybeUninit.html#method.assume_init_ref)
|
- [`<[MaybeUninit<T>]>::assume_init_ref`](https://doc.rust-lang.org/stable/core/primitive.slice.html#method.assume_init_ref)
|
||||||
- [`<MaybeUninit<T>>::assume_init_mut`](https://doc.rust-lang.org/stable/core/mem/union.MaybeUninit.html#method.assume_init_mut)
|
- [`<[MaybeUninit<T>]>::assume_init_mut`](https://doc.rust-lang.org/stable/core/primitive.slice.html#method.assume_init_mut)
|
||||||
- [`<[MaybeUninit<T>]>::write_copy_of_slice`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.write_copy_of_slice)
|
- [`<[MaybeUninit<T>]>::write_copy_of_slice`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.write_copy_of_slice)
|
||||||
- [`<[MaybeUninit<T>]>::write_clone_of_slice`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.write_clone_of_slice)
|
- [`<[MaybeUninit<T>]>::write_clone_of_slice`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.write_clone_of_slice)
|
||||||
- [`String::into_raw_parts`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.into_raw_parts)
|
- [`String::into_raw_parts`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.into_raw_parts)
|
||||||
|
|
@ -67,9 +71,9 @@ Stabilized APIs
|
||||||
- [`<uN>::unchecked_shl`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.unchecked_shl)
|
- [`<uN>::unchecked_shl`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.unchecked_shl)
|
||||||
- [`<uN>::unchecked_shr`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.unchecked_shr)
|
- [`<uN>::unchecked_shr`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.unchecked_shr)
|
||||||
- [`<[T]>::as_array`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_array)
|
- [`<[T]>::as_array`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_array)
|
||||||
- [`<[T]>::as_array_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_mut_array)
|
- [`<[T]>::as_mut_array`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_mut_array)
|
||||||
- [`<*const [T]>::as_array`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_array)
|
- [`<*const [T]>::as_array`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_array)
|
||||||
- [`<*mut [T]>::as_array_mut`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_mut_array)
|
- [`<*mut [T]>::as_mut_array`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_mut_array)
|
||||||
- [`VecDeque::pop_front_if`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.pop_front_if)
|
- [`VecDeque::pop_front_if`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.pop_front_if)
|
||||||
- [`VecDeque::pop_back_if`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.pop_back_if)
|
- [`VecDeque::pop_back_if`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.pop_back_if)
|
||||||
- [`Duration::from_nanos_u128`](https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_nanos_u128)
|
- [`Duration::from_nanos_u128`](https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_nanos_u128)
|
||||||
|
|
@ -79,7 +83,7 @@ Stabilized APIs
|
||||||
- [`std::fmt::FromFn`](https://doc.rust-lang.org/stable/std/fmt/struct.FromFn.html)
|
- [`std::fmt::FromFn`](https://doc.rust-lang.org/stable/std/fmt/struct.FromFn.html)
|
||||||
|
|
||||||
|
|
||||||
<a id="1.93-Cargo"></a>
|
<a id="1.93.0-Cargo"></a>
|
||||||
|
|
||||||
Cargo
|
Cargo
|
||||||
-----
|
-----
|
||||||
|
|
@ -87,7 +91,7 @@ Cargo
|
||||||
- [In `cargo tree`, support long forms for `--format` variables](https://github.com/rust-lang/cargo/pull/16204/)
|
- [In `cargo tree`, support long forms for `--format` variables](https://github.com/rust-lang/cargo/pull/16204/)
|
||||||
- [Add `--workspace` to `cargo clean`](https://github.com/rust-lang/cargo/pull/16263/)
|
- [Add `--workspace` to `cargo clean`](https://github.com/rust-lang/cargo/pull/16263/)
|
||||||
|
|
||||||
<a id="1.93-Rustdoc"></a>
|
<a id="1.93.0-Rustdoc"></a>
|
||||||
|
|
||||||
Rustdoc
|
Rustdoc
|
||||||
-----
|
-----
|
||||||
|
|
@ -97,7 +101,7 @@ Rustdoc
|
||||||
- [Validate usage of crate-level doc attributes](https://github.com/rust-lang/rust/pull/149197). This means if any of `html_favicon_url`, `html_logo_url`, `html_playground_url`, `issue_tracker_base_url`, or `html_no_source` either has a missing value, an unexpected value, or a value of the wrong type, rustdoc will emit the deny-by-default lint `rustdoc::invalid_doc_attributes`.
|
- [Validate usage of crate-level doc attributes](https://github.com/rust-lang/rust/pull/149197). This means if any of `html_favicon_url`, `html_logo_url`, `html_playground_url`, `issue_tracker_base_url`, or `html_no_source` either has a missing value, an unexpected value, or a value of the wrong type, rustdoc will emit the deny-by-default lint `rustdoc::invalid_doc_attributes`.
|
||||||
|
|
||||||
|
|
||||||
<a id="1.93-Compatibility-Notes"></a>
|
<a id="1.93.0-Compatibility-Notes"></a>
|
||||||
|
|
||||||
Compatibility Notes
|
Compatibility Notes
|
||||||
-------------------
|
-------------------
|
||||||
|
|
@ -108,6 +112,10 @@ Compatibility Notes
|
||||||
- Cargo now sets the `CARGO_CFG_DEBUG_ASSERTIONS` environment variable in more situations. This will cause crates depending on `static-init` versions 1.0.1 to 1.0.3 to fail compilation with "failed to resolve: use of unresolved module or unlinked crate `parking_lot`". See [the linked issue](https://github.com/rust-lang/rust/issues/150646#issuecomment-3718964342) for details.
|
- Cargo now sets the `CARGO_CFG_DEBUG_ASSERTIONS` environment variable in more situations. This will cause crates depending on `static-init` versions 1.0.1 to 1.0.3 to fail compilation with "failed to resolve: use of unresolved module or unlinked crate `parking_lot`". See [the linked issue](https://github.com/rust-lang/rust/issues/150646#issuecomment-3718964342) for details.
|
||||||
- [User written types in the `offset_of!` macro are now checked to be well formed.](https://github.com/rust-lang/rust/issues/150465/)
|
- [User written types in the `offset_of!` macro are now checked to be well formed.](https://github.com/rust-lang/rust/issues/150465/)
|
||||||
- `cargo publish` no longer emits `.crate` files as a final artifact for user access when the `build.build-dir` config is unset
|
- `cargo publish` no longer emits `.crate` files as a final artifact for user access when the `build.build-dir` config is unset
|
||||||
|
- [Upgrade the `deref_nullptr` lint from warn-by-default to deny-by-default](https://github.com/rust-lang/rust/pull/148122)
|
||||||
|
- [Add future-incompatibility warning for `...` function parameters without a pattern outside of `extern` blocks](https://github.com/rust-lang/rust/pull/143619)
|
||||||
|
- [Introduce future-compatibility warning for `repr(C)` enums whose discriminant values do not fit into a `c_int` or `c_uint`](https://github.com/rust-lang/rust/pull/147017)
|
||||||
|
- [Introduce future-compatibility warning against ignoring `repr(C)` types as part of `repr(transparent)`](https://github.com/rust-lang/rust/pull/147185)
|
||||||
|
|
||||||
|
|
||||||
Version 1.92.0 (2025-12-11)
|
Version 1.92.0 (2025-12-11)
|
||||||
|
|
|
||||||
|
|
@ -393,6 +393,7 @@ impl<'a> Parser<'a> {
|
||||||
let insert_span = ident_span.shrink_to_lo();
|
let insert_span = ident_span.shrink_to_lo();
|
||||||
|
|
||||||
let ident = if self.token.is_ident()
|
let ident = if self.token.is_ident()
|
||||||
|
&& self.token.is_non_reserved_ident()
|
||||||
&& (!is_const || self.look_ahead(1, |t| *t == token::OpenParen))
|
&& (!is_const || self.look_ahead(1, |t| *t == token::OpenParen))
|
||||||
&& self.look_ahead(1, |t| {
|
&& self.look_ahead(1, |t| {
|
||||||
matches!(t.kind, token::Lt | token::OpenBrace | token::OpenParen)
|
matches!(t.kind, token::Lt | token::OpenBrace | token::OpenParen)
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,9 @@ RUN /tmp/build-fuchsia-toolchain.sh
|
||||||
COPY host-x86_64/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/
|
COPY host-x86_64/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/
|
||||||
RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh
|
RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh
|
||||||
|
|
||||||
RUN curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-x86_64-linux.tar.gz | \
|
RUN curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-27/wasi-sdk-27.0-x86_64-linux.tar.gz | \
|
||||||
tar -xz
|
tar -xz
|
||||||
ENV WASI_SDK_PATH=/tmp/wasi-sdk-29.0-x86_64-linux
|
ENV WASI_SDK_PATH=/tmp/wasi-sdk-27.0-x86_64-linux
|
||||||
|
|
||||||
COPY scripts/freebsd-toolchain.sh /tmp/
|
COPY scripts/freebsd-toolchain.sh /tmp/
|
||||||
RUN /tmp/freebsd-toolchain.sh i686
|
RUN /tmp/freebsd-toolchain.sh i686
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
mingw-w64 \
|
mingw-w64 \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-x86_64-linux.tar.gz | \
|
RUN curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-27/wasi-sdk-27.0-x86_64-linux.tar.gz | \
|
||||||
tar -xz
|
tar -xz
|
||||||
ENV WASI_SDK_PATH=/wasi-sdk-29.0-x86_64-linux
|
ENV WASI_SDK_PATH=/wasi-sdk-27.0-x86_64-linux
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS="--set rust.validate-mir-opts=3"
|
ENV RUST_CONFIGURE_ARGS="--set rust.validate-mir-opts=3"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,9 @@ WORKDIR /
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
RUN curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-x86_64-linux.tar.gz | \
|
RUN curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-27/wasi-sdk-27.0-x86_64-linux.tar.gz | \
|
||||||
tar -xz
|
tar -xz
|
||||||
ENV WASI_SDK_PATH=/wasi-sdk-29.0-x86_64-linux
|
ENV WASI_SDK_PATH=/wasi-sdk-27.0-x86_64-linux
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS \
|
ENV RUST_CONFIGURE_ARGS \
|
||||||
--musl-root-x86_64=/usr/local/x86_64-linux-musl \
|
--musl-root-x86_64=/usr/local/x86_64-linux-musl \
|
||||||
|
|
@ -56,9 +56,9 @@ ENV RUST_CONFIGURE_ARGS \
|
||||||
ENV NO_DEBUG_ASSERTIONS=1
|
ENV NO_DEBUG_ASSERTIONS=1
|
||||||
ENV NO_OVERFLOW_CHECKS=1
|
ENV NO_OVERFLOW_CHECKS=1
|
||||||
|
|
||||||
RUN curl -L https://github.com/bytecodealliance/wasmtime/releases/download/v38.0.4/wasmtime-v38.0.4-x86_64-linux.tar.xz | \
|
RUN curl -L https://github.com/bytecodealliance/wasmtime/releases/download/v19.0.0/wasmtime-v19.0.0-x86_64-linux.tar.xz | \
|
||||||
tar -xJ
|
tar -xJ
|
||||||
ENV PATH "$PATH:/wasmtime-v38.0.4-x86_64-linux"
|
ENV PATH "$PATH:/wasmtime-v19.0.0-x86_64-linux"
|
||||||
|
|
||||||
ENV WASM_WASIP_TARGET=wasm32-wasip1
|
ENV WASM_WASIP_TARGET=wasm32-wasip1
|
||||||
ENV WASM_WASIP_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_WASIP_TARGET \
|
ENV WASM_WASIP_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_WASIP_TARGET \
|
||||||
|
|
|
||||||
|
|
@ -180,14 +180,19 @@ impl Local {
|
||||||
field_indices,
|
field_indices,
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
|
let field_projections = place
|
||||||
|
.projections
|
||||||
|
.iter()
|
||||||
|
.filter(|proj| matches!(proj.kind, ProjectionKind::Field(_, _)))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
is_potentially_local_place(*local_id, place)
|
is_potentially_local_place(*local_id, place)
|
||||||
// If there were projections other than field projections, err on the side of caution and say that they
|
// If there were projections other than field projections, err on the side of caution and say that they
|
||||||
// _might_ be mutating something.
|
// _might_ be mutating something.
|
||||||
//
|
//
|
||||||
// The reason we use `<=` and not `==` is that a mutation of `struct` or `struct.field1` should count as
|
// The reason we use `<=` and not `==` is that a mutation of `struct` or `struct.field1` should count as
|
||||||
// mutation of the child fields such as `struct.field1.field2`
|
// mutation of the child fields such as `struct.field1.field2`
|
||||||
&& place.projections.len() <= field_indices.len()
|
&& field_projections.len() <= field_indices.len()
|
||||||
&& iter::zip(&place.projections, field_indices.iter().copied().rev()).all(|(proj, field_idx)| {
|
&& iter::zip(&field_projections, field_indices.iter().copied().rev()).all(|(proj, field_idx)| {
|
||||||
match proj.kind {
|
match proj.kind {
|
||||||
ProjectionKind::Field(f_idx, _) => f_idx == field_idx,
|
ProjectionKind::Field(f_idx, _) => f_idx == field_idx,
|
||||||
// If this is a projection we don't expect, it _might_ be mutating something
|
// If this is a projection we don't expect, it _might_ be mutating something
|
||||||
|
|
|
||||||
|
|
@ -472,3 +472,22 @@ fn issue15321() {
|
||||||
//~^ unnecessary_unwrap
|
//~^ unnecessary_unwrap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod issue16188 {
|
||||||
|
struct Foo {
|
||||||
|
value: Option<i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo {
|
||||||
|
pub fn bar(&mut self) {
|
||||||
|
let print_value = |v: i32| {
|
||||||
|
println!("{}", v);
|
||||||
|
};
|
||||||
|
|
||||||
|
if self.value.is_none() {
|
||||||
|
self.value = Some(10);
|
||||||
|
print_value(self.value.unwrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
1.93.0
|
1.93.1
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
// Make sure search stores its data in `window`
|
|
||||||
// It needs to use a global to avoid racing on search-index.js and search.js
|
|
||||||
// https://github.com/rust-lang/rust/pull/118961
|
|
||||||
include: "utils.goml"
|
|
||||||
|
|
||||||
// URL query
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html?search=sa'%3Bda'%3Bds"
|
|
||||||
wait-for: "#search-tabs"
|
|
||||||
assert-window-property-false: {"searchIndex": null}
|
|
||||||
|
|
||||||
// Form input
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html"
|
|
||||||
call-function: ("perform-search", {"query": "Foo"})
|
|
||||||
assert-window-property-false: {"searchIndex": null}
|
|
||||||
|
|
||||||
// source sidebar
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/src/test_docs/lib.rs.html"
|
|
||||||
click: "#sidebar-button"
|
|
||||||
wait-for: "#src-sidebar details"
|
|
||||||
assert-window-property: {"searchIndex": null}
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
// This test check for headings text and background colors for the different themes.
|
|
||||||
|
|
||||||
include: "utils.goml"
|
|
||||||
|
|
||||||
define-function: (
|
|
||||||
"check-colors",
|
|
||||||
[theme, color, code_header_color, focus_background_color, headings_color],
|
|
||||||
block {
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.Foo.html"
|
|
||||||
// This is needed so that the text color is computed.
|
|
||||||
show-text: true
|
|
||||||
call-function: ("switch-theme", {"theme": |theme|})
|
|
||||||
assert-css: (
|
|
||||||
".impl",
|
|
||||||
{"color": |color|, "background-color": "rgba(0, 0, 0, 0)"},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
assert-css: (
|
|
||||||
".impl .code-header",
|
|
||||||
{"color": |code_header_color|, "background-color": "rgba(0, 0, 0, 0)"},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.Foo.html#impl-Foo"
|
|
||||||
assert-css: (
|
|
||||||
"#impl-Foo",
|
|
||||||
{"color": |color|, "background-color": |focus_background_color|},
|
|
||||||
)
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.Foo.html#method.must_use"
|
|
||||||
assert-css: (
|
|
||||||
"#method\.must_use",
|
|
||||||
{"color": |color|, "background-color": |focus_background_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html"
|
|
||||||
assert-css: (".section-header a", {"color": |color|}, ALL)
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.HeavilyDocumentedStruct.html"
|
|
||||||
// We select headings (h2, h3, h...).
|
|
||||||
assert-css: (".docblock > :not(p) > a", {"color": |headings_color|}, ALL)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
call-function: (
|
|
||||||
"check-colors",
|
|
||||||
{
|
|
||||||
"theme": "ayu",
|
|
||||||
"color": "#c5c5c5",
|
|
||||||
"code_header_color": "#e6e1cf",
|
|
||||||
"focus_background_color": "rgba(255, 236, 164, 0.06)",
|
|
||||||
"headings_color": "#c5c5c5",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
call-function: (
|
|
||||||
"check-colors",
|
|
||||||
{
|
|
||||||
"theme": "dark",
|
|
||||||
"color": "#ddd",
|
|
||||||
"code_header_color": "#ddd",
|
|
||||||
"focus_background_color": "#494a3d",
|
|
||||||
"headings_color": "#ddd",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
call-function: (
|
|
||||||
"check-colors",
|
|
||||||
{
|
|
||||||
"theme": "light",
|
|
||||||
"color": "black",
|
|
||||||
"code_header_color": "black",
|
|
||||||
"focus_background_color": "#fdffd3",
|
|
||||||
"headings_color": "black",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
@ -1,257 +0,0 @@
|
||||||
// This test checks the position of the `i` for the notable traits.
|
|
||||||
include: "utils.goml"
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.NotableStructWithLongName.html"
|
|
||||||
show-text: true
|
|
||||||
|
|
||||||
define-function: (
|
|
||||||
"check-notable-tooltip-position",
|
|
||||||
[x, i_x],
|
|
||||||
block {
|
|
||||||
// Checking they have the same y position.
|
|
||||||
compare-elements-position-near: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//a[normalize-space()='NotableStructWithLongName']",
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
{"y": 1},
|
|
||||||
)
|
|
||||||
// Checking they don't have the same x position.
|
|
||||||
compare-elements-position-false: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//a[normalize-space()='NotableStructWithLongName']",
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
["x"],
|
|
||||||
)
|
|
||||||
// The `i` should be *after* the type.
|
|
||||||
assert-position: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//a[normalize-space()='NotableStructWithLongName']",
|
|
||||||
{"x": |x|},
|
|
||||||
)
|
|
||||||
assert-position: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
{"x": |i_x|},
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
define-function: (
|
|
||||||
"check-notable-tooltip-position-complete",
|
|
||||||
[x, i_x, popover_x],
|
|
||||||
block {
|
|
||||||
call-function: ("check-notable-tooltip-position", {"x": |x|, "i_x": |i_x|})
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 1)
|
|
||||||
compare-elements-position-near: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
"//*[@class='tooltip popover']",
|
|
||||||
{"y": 30}
|
|
||||||
)
|
|
||||||
compare-elements-position-false: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
"//*[@class='tooltip popover']",
|
|
||||||
["x"]
|
|
||||||
)
|
|
||||||
assert-position: (
|
|
||||||
"//*[@class='tooltip popover']",
|
|
||||||
{"x": |popover_x|}
|
|
||||||
)
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
move-cursor-to: "//h1"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// We start with a wide screen.
|
|
||||||
set-window-size: (1100, 600)
|
|
||||||
call-function: ("check-notable-tooltip-position-complete", {
|
|
||||||
"x": 682,
|
|
||||||
"i_x": 960,
|
|
||||||
"popover_x": 468,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Now only the `i` should be on the next line.
|
|
||||||
set-window-size: (1055, 600)
|
|
||||||
compare-elements-position-false: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//a[normalize-space()='NotableStructWithLongName']",
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
["y", "x"],
|
|
||||||
)
|
|
||||||
|
|
||||||
// Now both the `i` and the struct name should be on the next line.
|
|
||||||
set-window-size: (980, 600)
|
|
||||||
call-function: ("check-notable-tooltip-position", {
|
|
||||||
"x": 250,
|
|
||||||
"i_x": 528,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Now check the colors.
|
|
||||||
define-function: (
|
|
||||||
"check-colors",
|
|
||||||
[theme, header_color, content_color, type_color, trait_color, link_color],
|
|
||||||
block {
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.NotableStructWithLongName.html"
|
|
||||||
// This is needed to ensure that the text color is computed.
|
|
||||||
show-text: true
|
|
||||||
|
|
||||||
call-function: ("switch-theme", {"theme": |theme|})
|
|
||||||
|
|
||||||
assert-css: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
{"color": |content_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
|
|
||||||
move-cursor-to: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
wait-for-count: (".tooltip.popover", 1)
|
|
||||||
|
|
||||||
assert-css: (
|
|
||||||
"//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']",
|
|
||||||
{"color": |link_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert-css: (
|
|
||||||
".tooltip.popover h3",
|
|
||||||
{"color": |header_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
assert-css: (
|
|
||||||
".tooltip.popover pre",
|
|
||||||
{"color": |content_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
assert-css: (
|
|
||||||
".tooltip.popover pre a.struct",
|
|
||||||
{"color": |type_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
assert-css: (
|
|
||||||
".tooltip.popover pre a.trait",
|
|
||||||
{"color": |trait_color|},
|
|
||||||
ALL,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
call-function: (
|
|
||||||
"check-colors",
|
|
||||||
{
|
|
||||||
"theme": "ayu",
|
|
||||||
"link_color": "#39afd7",
|
|
||||||
"content_color": "#e6e1cf",
|
|
||||||
"header_color": "#fff",
|
|
||||||
"type_color": "#ffa0a5",
|
|
||||||
"trait_color": "#39afd7",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
call-function: (
|
|
||||||
"check-colors",
|
|
||||||
{
|
|
||||||
"theme": "dark",
|
|
||||||
"link_color": "#d2991d",
|
|
||||||
"content_color": "#ddd",
|
|
||||||
"header_color": "#ddd",
|
|
||||||
"type_color": "#2dbfb8",
|
|
||||||
"trait_color": "#b78cf2",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
call-function: (
|
|
||||||
"check-colors",
|
|
||||||
{
|
|
||||||
"theme": "light",
|
|
||||||
"link_color": "#3873ad",
|
|
||||||
"content_color": "black",
|
|
||||||
"header_color": "black",
|
|
||||||
"type_color": "#ad378a",
|
|
||||||
"trait_color": "#6e4fc9",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// Checking on mobile now.
|
|
||||||
set-window-size: (650, 600)
|
|
||||||
wait-for-size: ("body", {"width": 650})
|
|
||||||
call-function: ("check-notable-tooltip-position-complete", {
|
|
||||||
"x": 26,
|
|
||||||
"i_x": 305,
|
|
||||||
"popover_x": 0,
|
|
||||||
})
|
|
||||||
|
|
||||||
reload:
|
|
||||||
|
|
||||||
// Check that pressing escape works
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
move-cursor-to: "//*[@class='tooltip popover']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 1)
|
|
||||||
press-key: "Escape"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
assert: "#method\.create_an_iterator_from_read .tooltip:focus"
|
|
||||||
|
|
||||||
// Check that clicking outside works.
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 1)
|
|
||||||
click: ".main-heading h1"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
assert-false: "#method\.create_an_iterator_from_read .tooltip:focus"
|
|
||||||
|
|
||||||
// Check that pressing tab over and over works.
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
move-cursor-to: "//*[@class='tooltip popover']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 1)
|
|
||||||
press-key: "Tab"
|
|
||||||
press-key: "Tab"
|
|
||||||
press-key: "Tab"
|
|
||||||
press-key: "Tab"
|
|
||||||
press-key: "Tab"
|
|
||||||
press-key: "Tab"
|
|
||||||
press-key: "Tab"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
assert: "#method\.create_an_iterator_from_read .tooltip:focus"
|
|
||||||
|
|
||||||
define-function: (
|
|
||||||
"setup-popup",
|
|
||||||
[],
|
|
||||||
block {
|
|
||||||
store-window-property: {"scrollY": scroll}
|
|
||||||
click: "#method\.create_an_iterator_from_read .fn"
|
|
||||||
// We ensure that the scroll position changed.
|
|
||||||
assert-window-property-false: {"scrollY": |scroll|}
|
|
||||||
// Store the new position.
|
|
||||||
store-window-property: {"scrollY": scroll}
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
wait-for: "//*[@class='tooltip popover']"
|
|
||||||
click: ".main-heading h1"
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
// Now we check that the focus isn't given back to the wrong item when opening
|
|
||||||
// another popover.
|
|
||||||
call-function: ("setup-popup", {})
|
|
||||||
click: ".main-heading h1"
|
|
||||||
// We ensure we didn't come back to the previous focused item.
|
|
||||||
assert-window-property-false: {"scrollY": |scroll|}
|
|
||||||
|
|
||||||
// Same but with Escape handling.
|
|
||||||
call-function: ("setup-popup", {})
|
|
||||||
press-key: "Escape"
|
|
||||||
// We ensure we didn't come back to the previous focused item.
|
|
||||||
assert-window-property-false: {"scrollY": |scroll|}
|
|
||||||
|
|
||||||
// Opening the mobile sidebar should close the popover.
|
|
||||||
set-window-size: (650, 600)
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 1)
|
|
||||||
click: ".sidebar-menu-toggle"
|
|
||||||
assert: "//*[@class='sidebar shown']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
assert-false: "#method\.create_an_iterator_from_read .tooltip:focus"
|
|
||||||
|
|
||||||
// Also check the focus handling for the settings button.
|
|
||||||
set-window-size: (1100, 600)
|
|
||||||
reload:
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='tooltip']"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 1)
|
|
||||||
click: "rustdoc-toolbar .settings-menu a"
|
|
||||||
wait-for: "#settings"
|
|
||||||
assert-count: ("//*[@class='tooltip popover']", 0)
|
|
||||||
assert-false: "#method\.create_an_iterator_from_read .tooltip:focus"
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
// Checks that the crate search filtering is handled correctly and changes the results.
|
|
||||||
include: "utils.goml"
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html"
|
|
||||||
show-text: true
|
|
||||||
call-function: ("perform-search", {"query": "test"})
|
|
||||||
assert-text: ("#results .externcrate", "test_docs")
|
|
||||||
|
|
||||||
wait-for: "#crate-search"
|
|
||||||
// We now want to change the crate filter.
|
|
||||||
click: "#crate-search"
|
|
||||||
// We select "lib2" option then press enter to change the filter.
|
|
||||||
press-key: "ArrowDown"
|
|
||||||
press-key: "ArrowDown"
|
|
||||||
press-key: "ArrowDown"
|
|
||||||
press-key: "ArrowDown"
|
|
||||||
press-key: "ArrowDown"
|
|
||||||
press-key: "Enter"
|
|
||||||
// Waiting for the search results to appear...
|
|
||||||
wait-for: "#search-tabs"
|
|
||||||
wait-for-false: "#search-tabs .count.loading"
|
|
||||||
assert-document-property: ({"URL": "&filter-crate="}, CONTAINS)
|
|
||||||
// We check that there is no more "test_docs" appearing.
|
|
||||||
assert-false: "#results .externcrate"
|
|
||||||
// We also check that "lib2" is the filter crate.
|
|
||||||
assert-property: ("#crate-search", {"value": "lib2"})
|
|
||||||
|
|
||||||
// Now we check that leaving the search results and putting them back keeps the
|
|
||||||
// crate filtering.
|
|
||||||
press-key: "Escape"
|
|
||||||
wait-for-css: ("#main-content", {"display": "block"})
|
|
||||||
click: "#search-button"
|
|
||||||
wait-for: ".search-input"
|
|
||||||
wait-for-css: ("#main-content", {"display": "none"})
|
|
||||||
// We check that there is no more "test_docs" appearing.
|
|
||||||
assert-false: "#results .externcrate"
|
|
||||||
assert-property: ("#crate-search", {"value": "lib2"})
|
|
||||||
|
|
||||||
// Selecting back "All crates"
|
|
||||||
click: "#crate-search"
|
|
||||||
press-key: "ArrowUp"
|
|
||||||
press-key: "ArrowUp"
|
|
||||||
press-key: "ArrowUp"
|
|
||||||
press-key: "ArrowUp"
|
|
||||||
press-key: "ArrowUp"
|
|
||||||
press-key: "Enter"
|
|
||||||
// Waiting for the search results to appear...
|
|
||||||
wait-for: "#search-tabs"
|
|
||||||
wait-for-false: "#search-tabs .count.loading"
|
|
||||||
assert-property: ("#crate-search", {"value": "all crates"})
|
|
||||||
|
|
||||||
// Checking that the URL parameter is taken into account for crate filtering.
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html?search=test&filter-crate=lib2"
|
|
||||||
wait-for: "#crate-search"
|
|
||||||
assert-property: ("#crate-search", {"value": "lib2"})
|
|
||||||
assert-false: "#results .externcrate"
|
|
||||||
|
|
||||||
// Checking that the text for the "title" is correct (the "all crates" comes from the "<select>").
|
|
||||||
assert-text: (".search-switcher", "Search results in all crates", STARTS_WITH)
|
|
||||||
|
|
||||||
// Checking the display of the crate filter.
|
|
||||||
// We start with the light theme.
|
|
||||||
call-function: ("switch-theme", {"theme": "light"})
|
|
||||||
|
|
||||||
set-timeout: 2000
|
|
||||||
wait-for: "#crate-search"
|
|
||||||
assert-css: ("#crate-search", {
|
|
||||||
"border": "1px solid #e0e0e0",
|
|
||||||
"color": "black",
|
|
||||||
"background-color": "white",
|
|
||||||
})
|
|
||||||
|
|
||||||
// We now check the dark theme.
|
|
||||||
click: "rustdoc-toolbar .settings-menu"
|
|
||||||
wait-for: "#settings"
|
|
||||||
click: "#theme-dark"
|
|
||||||
wait-for-css: ("#crate-search", {
|
|
||||||
"border": "1px solid #e0e0e0",
|
|
||||||
"color": "#ddd",
|
|
||||||
"background-color": "#353535",
|
|
||||||
})
|
|
||||||
|
|
||||||
// And finally we check the ayu theme.
|
|
||||||
click: "#theme-ayu"
|
|
||||||
wait-for-css: ("#crate-search", {
|
|
||||||
"border": "1px solid #5c6773",
|
|
||||||
"color": "#c5c5c5",
|
|
||||||
"background-color": "#0f1419",
|
|
||||||
})
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
// ignore-tidy-linelength
|
|
||||||
// Checks that the search results have the expected width.
|
|
||||||
include: "utils.goml"
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html"
|
|
||||||
set-window-size: (900, 1000)
|
|
||||||
write-into: (".search-input", "test")
|
|
||||||
// To be SURE that the search will be run.
|
|
||||||
press-key: 'Enter'
|
|
||||||
wait-for: "#crate-search"
|
|
||||||
wait-for-false: "#search-tabs .count.loading"
|
|
||||||
// The width is returned by "getComputedStyle" which returns the exact number instead of the
|
|
||||||
// CSS rule which is "50%"...
|
|
||||||
assert-size: (".search-results div.desc", {"width": 248})
|
|
||||||
store-size: (".search-results .result-name .typename", {"width": width})
|
|
||||||
set-window-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.
|
|
||||||
assert-size: (".search-results div.desc", {"width": 566})
|
|
||||||
|
|
||||||
// The result set is all on one line.
|
|
||||||
compare-elements-position-near: (
|
|
||||||
".search-results .result-name .typename",
|
|
||||||
".search-results .result-name .path",
|
|
||||||
{"y": 2},
|
|
||||||
)
|
|
||||||
compare-elements-position-near-false: (
|
|
||||||
".search-results .result-name .typename",
|
|
||||||
".search-results .result-name .path",
|
|
||||||
{"x": 5},
|
|
||||||
)
|
|
||||||
// The width of the "typename" isn't fixed anymore in this display mode.
|
|
||||||
store-size: (".search-results .result-name .typename", {"width": new_width})
|
|
||||||
assert: |new_width| < |width| - 10
|
|
||||||
|
|
||||||
// Check that if the search is too long on mobile, it'll go under the "typename".
|
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html?search=SuperIncrediblyLongLongLongLongLongLongLongGigaGigaGigaMegaLongLongLongStructName"
|
|
||||||
wait-for: "#crate-search"
|
|
||||||
wait-for-false: "#search-tabs .count.loading"
|
|
||||||
compare-elements-position-near: (
|
|
||||||
".search-results .result-name .typename",
|
|
||||||
".search-results .result-name .path",
|
|
||||||
{"y": 2, "x": 0},
|
|
||||||
)
|
|
||||||
compare-elements-size-near: (
|
|
||||||
".search-results .result-name",
|
|
||||||
".search-results .result-name .path",
|
|
||||||
{"width": 8, "height": 8},
|
|
||||||
)
|
|
||||||
|
|
||||||
// Check that the crate filter `<select>` is correctly handled when it goes to next line.
|
|
||||||
// To do so we need to update the length of one of its `<option>`.
|
|
||||||
set-window-size: (900, 900)
|
|
||||||
|
|
||||||
// First we check the current width, height and position.
|
|
||||||
assert-css: ("#crate-search", {"width": "159px"})
|
|
||||||
store-size: (".search-switcher", {
|
|
||||||
"height": search_results_title_height,
|
|
||||||
"width": search_results_title_width,
|
|
||||||
})
|
|
||||||
assert-css: ("#search", {"width": "640px"})
|
|
||||||
|
|
||||||
// Then we update the text of one of the `<option>`.
|
|
||||||
set-text: (
|
|
||||||
"#crate-search option",
|
|
||||||
"sdjfaksdjfaksjdbfkadsbfkjsadbfkdsbkfbsadkjfbkdsabfkadsfkjdsafa",
|
|
||||||
)
|
|
||||||
|
|
||||||
// Then we compare again to confirm the height didn't change.
|
|
||||||
assert-size: ("#crate-search", {"width": 185})
|
|
||||||
assert-size: (".search-switcher", {
|
|
||||||
"height": |search_results_title_height|,
|
|
||||||
})
|
|
||||||
assert-css: ("#search", {"width": "640px"})
|
|
||||||
assert: |search_results_title_width| <= 640
|
|
||||||
|
|
||||||
// Now checking that the crate filter is working as expected too.
|
|
||||||
show-text: true
|
|
||||||
define-function: (
|
|
||||||
"check-filter",
|
|
||||||
[theme, border, filter, hover_border, hover_filter],
|
|
||||||
block {
|
|
||||||
call-function: ("switch-theme", {"theme": |theme|})
|
|
||||||
wait-for: "#crate-search"
|
|
||||||
wait-for-false: "#search-tabs .count.loading"
|
|
||||||
assert-css: ("#crate-search", {"border": "1px solid " + |border|})
|
|
||||||
assert-css: ("#crate-search-div::after", {"filter": |filter|})
|
|
||||||
move-cursor-to: "#crate-search"
|
|
||||||
assert-css: ("#crate-search", {"border": "1px solid " + |hover_border|})
|
|
||||||
assert-css: ("#crate-search-div::after", {"filter": |hover_filter|})
|
|
||||||
move-cursor-to: ".search-input"
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
call-function: ("check-filter", {
|
|
||||||
"theme": "ayu",
|
|
||||||
"border": "#5c6773",
|
|
||||||
"filter": "invert(0.41) sepia(0.12) saturate(4.87) hue-rotate(171deg) brightness(0.94) contrast(0.94)",
|
|
||||||
"hover_border": "#e0e0e0",
|
|
||||||
"hover_filter": "invert(0.98) sepia(0.12) saturate(0.81) hue-rotate(343deg) brightness(1.13) contrast(0.76)",
|
|
||||||
})
|
|
||||||
call-function: ("check-filter", {
|
|
||||||
"theme": "dark",
|
|
||||||
"border": "#e0e0e0",
|
|
||||||
"filter": "invert(0.94) sepia(0) saturate(7.21) hue-rotate(255deg) brightness(0.9) contrast(0.9)",
|
|
||||||
"hover_border": "#2196f3",
|
|
||||||
"hover_filter": "invert(0.69) sepia(0.6) saturate(66.13) hue-rotate(184deg) brightness(1) contrast(0.91)",
|
|
||||||
})
|
|
||||||
call-function: ("check-filter", {
|
|
||||||
"theme": "light",
|
|
||||||
"border": "#e0e0e0",
|
|
||||||
"filter": "invert(1) sepia(0) saturate(42.23) hue-rotate(289deg) brightness(1.14) contrast(0.76)",
|
|
||||||
"hover_border": "#717171",
|
|
||||||
"hover_filter": "invert(0.44) sepia(0.18) saturate(0.23) hue-rotate(317deg) brightness(0.96) contrast(0.93)",
|
|
||||||
})
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
//! More test coverage for <https://github.com/rust-lang/rust/issues/149692>; this test is
|
||||||
|
//! specifically for `const` items.
|
||||||
|
|
||||||
|
macro_rules! m {
|
||||||
|
(const $id:item()) => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
m!(const Self());
|
||||||
|
//~^ ERROR expected one of `!` or `::`, found `(`
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
error: expected one of `!` or `::`, found `(`
|
||||||
|
--> $DIR/kw-in-const-item-pos-recovery-149692.rs:8:14
|
||||||
|
|
|
||||||
|
LL | (const $id:item()) => {}
|
||||||
|
| -------- while parsing argument for this `item` macro fragment
|
||||||
|
...
|
||||||
|
LL | m!(const Self());
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
19
tests/ui/parser/macro/kw-in-item-pos-recovery-149692.rs
Normal file
19
tests/ui/parser/macro/kw-in-item-pos-recovery-149692.rs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
//! Regression test for a diagnostic ICE where we tried to recover a keyword as the identifier when
|
||||||
|
//! we are already trying to recover a missing keyword before item.
|
||||||
|
//!
|
||||||
|
//! See <https://github.com/rust-lang/rust/issues/149692>.
|
||||||
|
|
||||||
|
macro_rules! m {
|
||||||
|
($id:item()) => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
m!(Self());
|
||||||
|
//~^ ERROR expected one of `!` or `::`, found `(`
|
||||||
|
|
||||||
|
m!(Self{});
|
||||||
|
//~^ ERROR expected one of `!` or `::`, found `{`
|
||||||
|
|
||||||
|
m!(crate());
|
||||||
|
//~^ ERROR expected one of `!` or `::`, found `(`
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
29
tests/ui/parser/macro/kw-in-item-pos-recovery-149692.stderr
Normal file
29
tests/ui/parser/macro/kw-in-item-pos-recovery-149692.stderr
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
error: expected one of `!` or `::`, found `(`
|
||||||
|
--> $DIR/kw-in-item-pos-recovery-149692.rs:10:8
|
||||||
|
|
|
||||||
|
LL | ($id:item()) => {}
|
||||||
|
| -------- while parsing argument for this `item` macro fragment
|
||||||
|
...
|
||||||
|
LL | m!(Self());
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
||||||
|
error: expected one of `!` or `::`, found `{`
|
||||||
|
--> $DIR/kw-in-item-pos-recovery-149692.rs:13:8
|
||||||
|
|
|
||||||
|
LL | ($id:item()) => {}
|
||||||
|
| -------- while parsing argument for this `item` macro fragment
|
||||||
|
...
|
||||||
|
LL | m!(Self{});
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
||||||
|
error: expected one of `!` or `::`, found `(`
|
||||||
|
--> $DIR/kw-in-item-pos-recovery-149692.rs:16:9
|
||||||
|
|
|
||||||
|
LL | ($id:item()) => {}
|
||||||
|
| -------- while parsing argument for this `item` macro fragment
|
||||||
|
...
|
||||||
|
LL | m!(crate());
|
||||||
|
| ^ expected one of `!` or `::`
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue