rust/tests/ui/parser
bors 481d45abec Auto merge of #115822 - compiler-errors:stabilize-rpitit, r=jackh726
Stabilize `async fn` and return-position `impl Trait` in trait

# Stabilization report

This report proposes the stabilization of `#![feature(return_position_impl_trait_in_trait)]` ([RPITIT][RFC 3425]) and `#![feature(async_fn_in_trait)]` ([AFIT][RFC 3185]). These are both long awaited features that increase the expressiveness of the Rust language and trait system.

Closes #91611

[RFC 3185]: https://rust-lang.github.io/rfcs/3185-static-async-fn-in-trait.html
[RFC 3425]: https://rust-lang.github.io/rfcs/3425-return-position-impl-trait-in-traits.html

## Updates from thread

The thread has covered two major concerns:

* [Given that we don't have RTN, what should we stabilize?](https://github.com/rust-lang/rust/pull/115822#issuecomment-1731149475) -- proposed resolution is [adding a lint](https://github.com/rust-lang/rust/pull/115822#issuecomment-1728354622) and [careful messaging](https://github.com/rust-lang/rust/pull/115822#issuecomment-1731136169)
* [Interaction between outlives bounds and capture semantics](https://github.com/rust-lang/rust/pull/115822#issuecomment-1731153952) -- This is fixable in a forwards-compatible way via #116040, and also eventually via ATPIT.

## Stabilization Summary

This stabilization allows the following examples to work.

### Example of return-position `impl Trait` in trait definition

```rust
trait Bar {
    fn bar(self) -> impl Send;
}
```

This declares a trait method that returns *some* type that implements `Send`.  It's similar to writing the following using an associated type, except that the associated type is anonymous.

```rust
trait Bar {
    type _0: Send;
    fn bar(self) -> Self::_0;
}
```

### Example of return-position `impl Trait` in trait implementation

```rust
impl Bar for () {
    fn bar(self) -> impl Send {}
}
```

This defines a method implementation that returns an opaque type, just like [RPIT][RFC 1522] does, except that all in-scope lifetimes are captured in the opaque type (as is already true for `async fn` and as is expected to be true for RPIT in Rust Edition 2024), as described below.

[RFC 1522]: https://rust-lang.github.io/rfcs/1522-conservative-impl-trait.html

### Example of `async fn` in trait

```rust
trait Bar {
    async fn bar(self);
}

impl Bar for () {
    async fn bar(self) {}
}
```

This declares a trait method that returns *some* [`Future`](https://doc.rust-lang.org/core/future/trait.Future.html) and a corresponding method implementation.  This is equivalent to writing the following using RPITIT.

```rust
use core::future::Future;

trait Bar {
    fn bar(self) -> impl Future<Output = ()>;
}

impl Bar for () {
    fn bar(self) -> impl Future<Output = ()> { async {} }
}
```

The desirability of this desugaring being available is part of why RPITIT and AFIT are being proposed for stabilization at the same time.

## Motivation

Long ago, Rust added [RPIT][RFC 1522] and [`async`/`await`][RFC 2394].  These are major features that are widely used in the ecosystem.  However, until now, these feature could not be used in *traits* and trait implementations.  This left traits as a kind of second-class citizen of the language.  This stabilization fixes that.

[RFC 2394]: https://rust-lang.github.io/rfcs/2394-async_await.html

### `async fn` in trait

Async/await allows users to write asynchronous code much easier than they could before. However, it doesn't play nice with other core language features that make Rust the great language it is, like traits. Support for `async fn` in traits has been long anticipated and was not added before due to limitations in the compiler that have now been lifted.

`async fn` in traits will unblock a lot of work in the ecosystem and the standard library. It is not currently possible to write a trait that is implemented using `async fn`. The workarounds that exist are undesirable because they require allocation and dynamic dispatch, and any trait that uses them will become obsolete once native `async fn` in trait is stabilized.

We also have ample evidence that there is demand for this feature from the [`async-trait` crate][async-trait], which emulates the feature using dynamic dispatch. The async-trait crate is currently the #5 async crate on crates.io ranked by recent downloads, receiving over 78M all-time downloads. According to a [recent analysis][async-trait-analysis], 4% of all crates use the `#[async_trait]` macro it provides, representing 7% of all function and method signatures in trait definitions on crates.io. We think this is a *lower bound* on demand for the feature, because users are unlikely to use `#[async_trait]` on public traits on crates.io for the reasons already given.

[async-trait]: https://crates.io/crates/async-trait
[async-trait-analysis]: https://rust-lang.zulipchat.com/#narrow/stream/315482-t-compiler.2Fetc.2Fopaque-types/topic/RPIT.20capture.20rules.20.28capturing.20everything.29/near/389496292

### Return-position `impl Trait` in trait

`async fn` always desugars to a function that returns `impl Future`.

```rust!
async fn foo() -> i32 { 100 }

// Equivalent to:
fn foo() -> impl Future<Output = i32> { async { 100 } }
```

All `async fn`s today can be rewritten this way. This is useful because it allows adding behavior that runs at the time of the function call, before the first `.await` on the returned future.

In the spirit of supporting the same set of features on `async fn` in traits that we do outside of traits, it makes sense to stabilize this as well. As described by the [RPITIT RFC][rpitit-rfc], this includes the ability to mix and match the equivalent forms in traits and their corresponding impls:

```rust!
trait Foo {
    async fn foo(self) -> i32;
}

// Can be implemented as:
impl Foo for MyType {
    fn foo(self) -> impl Future<Output = i32> {
        async { 100 }
    }
}
```

Return-position `impl Trait` in trait is useful for cases beyond async, just as regular RPIT is. As a simple example, the RFC showed an alternative way of writing the `IntoIterator` trait with one fewer associated type.

```rust!
trait NewIntoIterator {
    type Item;
    fn new_into_iter(self) -> impl Iterator<Item = Self::Item>;
}

impl<T> NewIntoIterator for Vec<T> {
    type Item = T;
    fn new_into_iter(self) -> impl Iterator<Item = T> {
        self.into_iter()
    }
}
```

[rpitit-rfc]: https://rust-lang.github.io/rfcs/3425-return-position-impl-trait-in-traits.html

## Major design decisions

This section describes the major design decisions that were reached after the RFC was accepted:

- EDIT: Lint against async fn in trait definitions

    - Until the [send bound problem](https://smallcultfollowing.com/babysteps/blog/2023/02/01/async-trait-send-bounds-part-1-intro/) is resolved, the use of `async fn` in trait definitions could lead to a bad experience for people using work-stealing executors (by far the most popular choice). However, there are significant use cases for which the current support is all that is needed (single-threaded executors, such as those used in embedded use cases, as well as thread-per-core setups). We are prioritizing serving users well over protecting people from misuse, and therefore, we opt to stabilize the full range of functionality; however, to help steer people correctly, we are will issue a warning on the use of `async fn` in trait definitions that advises users about the limitations. (See [this summary comment](https://github.com/rust-lang/rust/pull/115822#issuecomment-1731149475) for the details of the concern, and [this comment](https://github.com/rust-lang/rust/pull/115822#issuecomment-1728354622) for more details about the reasoning that led to this conclusion.)

- Capture rules:

    - The RFC's initial capture rules for lifetimes in impls/traits were found to be imprecisely precise and to introduce various inconsistencies. After much discussion, the decision was reached to make `-> impl Trait` in traits/impls capture *all* in-scope parameters, including both lifetimes and types. This is a departure from the behavior of RPITs in other contexts; an RFC is currently being authored to change the behavior of RPITs in other contexts in a future edition.

    - Major discussion links:

        - [Lang team design meeting from 2023-07-26](https://hackmd.io/sFaSIMJOQcuwCdnUvCxtuQ?view)

- Refinement:

    - The [refinement RFC] initially proposed that impl signatures that are more specific than their trait are not allowed unless the `#[refine]` attribute was included, but left it as an open question how to implement this. The stabilized proposal is that it is not a hard error to omit `#[refine]`, but there is a lint which fires if the impl's return type is more precise than the trait. This greatly simplified the desugaring and implementation while still achieving the original goal of ensuring that users do not accidentally commit to a more specific return type than they intended.

    - Major discussion links:

        - [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/.60.23.5Brefine.5D.60.20as.20a.20lint)

[refinement RFC]: https://rust-lang.github.io/rfcs/3245-refined-impls.html

## What is stabilized

### Async functions in traits and trait implementations

* `async fn` are now supported in traits and trait implementations.
* Associated functions in traits that are `async` may have default bodies.

### Return-position impl trait in traits and trait implementations

* Return-position `impl Trait`s are now supported in traits and trait implementations.
    * Return-position `impl Trait` in implementations are treated like regular return-position `impl Trait`s, and therefore behave according to the same inference rules for hidden type inference and well-formedness.
* Associated functions in traits that name return-position `impl Trait`s may have default bodies.
* Implementations may provide either concrete types or `impl Trait` for each corresponding `impl Trait` in the trait method signature.

For a detailed exploration of the technical implementation of return-position `impl Trait` in traits, see [the dev guide](https://rustc-dev-guide.rust-lang.org/return-position-impl-trait-in-trait.html).

### Mixing `async fn` in trait and return-position `impl Trait` in trait

A trait function declaration that is `async fn ..() -> T` may be satisfied by an implementation function that returns `impl Future<Output = T>`, or vice versa.

```rust
trait Async {
    async fn hello();
}

impl Async for () {
    fn hello() -> impl Future<Output = ()> {
        async {}
    }
}

trait RPIT {
    fn hello() -> impl Future<Output = String>;
}

impl RPIT for () {
    async fn hello() -> String {
        "hello".to_string()
    }
}
```

### Return-position `impl Trait` in traits and trait implementations capture all in-scope lifetimes

Described above in "major design decisions".

### Return-position `impl Trait` in traits are "always revealing"

When a trait uses `-> impl Trait` in return position, it logically desugars to an associated type that represents the return (the actual implementation in the compiler is different, as described below). The value of this associated type is determined by the actual return type written in the impl; if the impl also uses `-> impl Trait` as the return type, then the value of the associated type is an opaque type scoped to the impl method (similar to what you would get when calling an inherent function returning `-> impl Trait`). As with any associated type, the value of this special associated type can be revealed by the compiler if the compiler can figure out what impl is being used.

For example, given this trait:

```rust
trait AsDebug {
    fn as_debug(&self) -> impl Debug;
}
```

A function working with the trait generically is only able to see that the return value is `Debug`:

```rust
fn foo<T: AsDebug>(t: &T) {
    let u = t.as_debug();
    println!("{}", u); // ERROR: `u` is not known to implement `Display`
}
```

But if a function calls `as_debug` on a known type (say, `u32`), it may be able to resolve the return type more specifically, if that implementation specifies a concrete type as well:

```rust
impl AsDebug for u32 {
    fn as_debug(&self) -> u32 {
        *self
    }
}

fn foo(t: &u32) {
    let u: u32 = t.as_debug(); // OK!
    println!("{}",  t.as_debug()); // ALSO OK (since `u32: Display`).
}
```

The return type used in the impl therefore represents a **semver binding** promise from the impl author that the return type of `<u32 as AsDebug>::as_debug` will not change. This could come as a surprise to users, who might expect that they are free to change the return type to any other type that implements `Debug`. To address this, we include a [`refining_impl_trait` lint](https://github.com/rust-lang/rust/pull/115582) that warns if the impl uses a specific type -- the `impl AsDebug for u32` above, for example, would toggle the lint.

The lint message explains what is going on and encourages users to `allow` the lint to indicate that they meant to refine the return type:

```rust
impl AsDebug for u32 {
    #[allow(refining_impl_trait)]
    fn as_debug(&self) -> u32 {
        *self
    }
}
```

[RFC #3245](https://github.com/rust-lang/rfcs/pull/3245) proposed a new attribute, `#[refine]`, that could also be used to "opt-in" to refinements like this (and which would then silence the lint). That RFC is not currently implemented -- the `#[refine]` attribute is also expected to reveal other details from the signature and has not yet been fully implemented.

### Return-position `impl Trait` and `async fn` in traits are opted-out of object safety checks when the parent function has `Self: Sized`

```rust
trait IsObjectSafe {
    fn rpit() -> impl Sized where Self: Sized;
    async fn afit() where Self: Sized;
}
```

Traits that mention return-position `impl Trait` or `async fn` in trait when the associated function includes a `Self: Sized` bound will remain object safe. That is because the associated function that defines them will be opted-out of the vtable of the trait, and the associated types will be unnameable from any trait object.

This can alternatively be seen as a consequence of https://github.com/rust-lang/rust/pull/112319#issue-1742251747 and the desugaring of return-position `impl Trait` in traits to associated types which inherit the where-clauses of the associated function that defines them.

## What isn't stabilized (aka, potential future work)

### Dynamic dispatch

As stabilized, traits containing RPITIT and AFIT are **not dyn compatible**. This means that you cannot create `dyn Trait` objects from them and can only use static dispatch. The reason for this limitation is that dynamic dispatch support for RPITIT and AFIT is more complex than static dispatch, as described on the [async fundamentals page](https://rust-lang.github.io/async-fundamentals-initiative/evaluation/challenges/dyn_traits.html). The primary challenge to using `dyn Trait` in today's Rust is that **`dyn Trait` today must list the values of all associated types**. This means you would have to write `dyn for<'s> Trait<Foo<'s> = XXX>` where `XXX` is the future type defined by the impl, such as `F_A`. This is not only verbose (or impossible), it also uniquely ties the `dyn Trait` to a particular impl, defeating the whole point of `dyn Trait`.

The precise design for handling dynamic dispatch is not yet determined. Top candidates include:

- [callee site selection][], in which we permit unsized return values so that the return type for an `-> impl Foo` method be can be `dyn Foo`, but then users must specify the type of wide pointer at the call-site in some fashion.

- [`dyn*`][], where we create a built-in encapsulation of a "wide pointer" and map the associated type corresponding to an RPITIT to the corresponding `dyn*` type (`dyn*` itself is not exposed to users as a type in this proposal, though that could be a future extension).

[callee site selection]: https://smallcultfollowing.com/babysteps/blog/2022/09/21/dyn-async-traits-part-9-callee-site-selection/

[`dyn*`]: https://smallcultfollowing.com/babysteps/blog/2022/03/29/dyn-can-we-make-dyn-sized/

### Where-clause bounds on return-position `impl Trait` in traits or async futures (RTN/ART)

One limitation of async fn in traits and RPITIT as stabilized is that there is no way for users to write code that adds additional bounds beyond those listed in the `-> impl Trait`. The most common example is wanting to write a generic function that requires that the future returned from an `async fn` be `Send`:

```rust
trait Greet {
    async fn greet(&self);
}

fn greet_in_parallel<G: Greet>(g: &G) {
    runtime::spawn(async move {
        g.greet().await; //~ ERROR: future returned by `greet` may not be `Send`
    })
}
```

Currently, since the associated types added for the return type are anonymous, there is no where-clause that could be added to make this code compile.

There have been various proposals for how to address this problem (e.g., [return type notation][rtn] or having an annotation to give a name to the associated type), but we leave the selection of one of those mechanisms to future work.

[rtn]: https://smallcultfollowing.com/babysteps/blog/2023/02/13/return-type-notation-send-bounds-part-2/

In the meantime, there are workarounds that one can use to address this problem, listed below.

#### Require all futures to be `Send`

For many users, the trait may only ever be used with `Send` futures, in which case one can write an explicit `impl Future + Send`:

```rust
trait Greet {
    fn greet(&self) -> impl Future<Output = ()> + Send;
}
```

The nice thing about this is that it is still compatible with using `async fn` in the trait impl. In the async working group case studies, we found that this could work for the [builder provider API](https://rust-lang.github.io/async-fundamentals-initiative/evaluation/case-studies/builder-provider-api.html). This is also the default approach used by the `#[async_trait]` crate which, as we have noted, has seen widespread adoption.

#### Avoid generics

This problem only applies when the `Self` type is generic. If the `Self` type is known, then the precise return type from an `async fn` is revealed, and the `Send` bound can be inferred thanks to auto-trait leakage. Even in cases where generics may appear to be required, it is sometimes possible to rewrite the code to avoid them. The [socket handler refactor](https://rust-lang.github.io/async-fundamentals-initiative/evaluation/case-studies/socket-handler.html) case study provides one such example.

### Unify capture behavior for `-> impl Trait` in inherent methods and traits

As stabilized, the capture behavior for `-> impl Trait` in a trait (whether as part of an async fn or a RPITIT) captures all types and lifetimes, whereas the existing behavior for inherent methods only captures types and lifetimes that are explicitly referenced. Capturing all lifetimes in traits was necessary to avoid various surprising inconsistencies; the expressed intent of the lang team is to extend that behavior so that we also capture all lifetimes in inherent methods, which would create more consistency and also address a common source of user confusion, but that will have to happen over the 2024 edition. The RFC is in progress. Should we opt not to accept that RFC, we can bring the capture behavior for `-> impl Trait` into alignment in other ways as part of the 2024 edition.

### `impl_trait_projections`

Orthgonal to `async_fn_in_trait` and `return_position_impl_trait_in_trait`, since it can be triggered on stable code. This will be stabilized separately in [#115659](https://github.com/rust-lang/rust/pull/115659).

<details>
If we try to write this code without `impl_trait_projections`, we will get an error:

```rust
#![feature(async_fn_in_trait)]

trait Foo {
    type Error;
    async fn foo(&mut self) -> Result<(), Self::Error>;
}

impl<T: Foo> Foo for &mut T {
    type Error = T::Error;
    async fn foo(&mut self) -> Result<(), Self::Error> {
        T::foo(self).await
    }
}
```

The error relates to the use of `Self` in a trait impl when the self type has a lifetime. It can be worked around by rewriting the impl not to use `Self`:

```rust
#![feature(async_fn_in_trait)]

trait Foo {
    type Error;
    async fn foo(&mut self) -> Result<(), Self::Error>;
}

impl<T: Foo> Foo for &mut T {
    type Error = T::Error;
    async fn foo(&mut self) -> Result<(), <&mut T as Foo>::Error> {
        T::foo(self).await
    }
}
```
</details>

## Tests

Tests are generally organized between return-position `impl Trait` and `async fn` in trait, when the distinction matters.
* RPITIT: https://github.com/rust-lang/rust/tree/master/tests/ui/impl-trait/in-trait
* AFIT: https://github.com/rust-lang/rust/tree/master/tests/ui/async-await/in-trait

## Remaining bugs and open issues

* #112047: Indirection introduced by `async fn` and return-position `impl Trait` in traits may hide cycles in opaque types, causing overflow errors that can only be discovered by monomorphization.
* #111105 - `async fn` in trait is susceptible to issues with checking auto traits on futures' generators, like regular `async`. This is a manifestation of #110338.
    * This was deemed not blocking because fixing it is forwards-compatible, and regular `async` is subject to the same issues.
* #104689: `async fn` and return-position `impl Trait` in trait requires the late-bound lifetimes in a trait and impl function signature to be equal.
    * This can be relaxed in the future with a smarter lexical region resolution algorithm.
* #102527: Nesting return-position `impl Trait` in trait deeply may result in slow compile times.
    * This has only been reported once, and can be fixed in the future.
* #108362: Inference between return types and generics of a function may have difficulties when there's an `.await`.
    * This isn't related to AFIT (https://github.com/rust-lang/rust/issues/108362#issuecomment-1717927918) -- using traits does mean that there's possibly easier ways to hit it.
* #112626: Because `async fn` and return-position `impl Trait` in traits lower to associated types, users may encounter strange behaviors when implementing circularly dependent traits.
    * This is not specific to RPITIT, and is a limitation of associated types: https://github.com/rust-lang/rust/issues/112626#issuecomment-1603405105
* **(Nightly)** #108309: `async fn` and return-position `impl Trait` in trait do not support specialization. This was deemed not blocking, since it can be fixed in the future (e.g. #108321) and specialization is a nightly feature.

#### (Nightly) Return type notation bugs

RTN is not being stabilized here, but there are some interesting outstanding bugs. None of them are blockers for AFIT/RPITIT, but I'm noting them for completeness.

<details>

* #109924 is a bug that occurs when a higher-ranked trait bound has both inference variables and associated types. This is pre-existing -- RTN just gives you a more convenient way of producing them. This should be fixed by the new trait solver.
* #109924 is a manifestation of a more general issue with `async` and auto-trait bounds: #110338. RTN does not cause this issue, just allows us to put `Send` bounds on the anonymous futures that we have in traits.
* #112569 is a bug similar to associated type bounds, where nested bounds are not implied correctly.

</details>

## Alternatives

### Do nothing

We could choose not to stabilize these features. Users that can use the `#[async_trait]` macro would continue to do so. Library maintainers would continue to avoid async functions in traits, potentially blocking the stable release of many useful crates.

### Stabilize `impl Trait` in associated type instead

AFIT and RPITIT solve the problem of returning unnameable types from trait methods. It is also possible to solve this by using another unstable feature, `impl Trait` in an associated type. Users would need to define an associated type in both the trait and trait impl:

```rust!
trait Foo {
    type Fut<'a>: Future<Output = i32> where Self: 'a;
    fn foo(&self) -> Self::Fut<'_>;
}

impl Foo for MyType {
    type Fut<'a> where Self: 'a = impl Future<Output = i32>;
    fn foo(&self) -> Self::Fut<'_> {
        async { 42 }
    }
}
```

This also has the advantage of allowing generic code to bound the associated type. However, it is substantially less ergonomic than either `async fn` or `-> impl Future`, and users still expect to be able to use those features in traits. **Even if this feature were stable, we would still want to stabilize AFIT and RPITIT.**

That said, we can have both. `impl Trait` in associated types is desireable because it can be used in existing traits with explicit associated types, among other reasons. We *should* stabilize this feature once it is ready, but that's outside the scope of this proposal.

### Use the old capture semantics for RPITIT

We could choose to make the capture rules for RPITIT consistent with the existing rules for RPIT. However, there was strong consensus in a recent [lang team meeting](https://hackmd.io/sFaSIMJOQcuwCdnUvCxtuQ?view) that we should *change* these rules, and furthermore that new features should adopt the new rules.

This is consistent with the tenet in RFC 3085 of favoring ["Uniform behavior across editions"](https://rust-lang.github.io/rfcs/3085-edition-2021.html#uniform-behavior-across-editions) when possible. It greatly reduces the complexity of the feature by not requiring us to answer, or implement, the design questions that arise out of the interaction between the current capture rules and traits. This reduction in complexity – and eventual technical debt – is exactly in line with the motivation listed in the aforementioned RFC.

### Make refinement a hard error

Refinement (`refining_impl_trait`) is only a concern for library authors, and therefore doesn't really warrant making into a deny-by-default warning or an error.

Additionally, refinement is currently checked via a lint that compares bounds in the `impl Trait`s in the trait and impl syntactically. This is good enough for a warning that can be opted-out, but not if this were a hard error, which would ideally be implemented using fully semantic, implicational logic. This was implemented (#111931), but also is an unnecessary burden on the type system for little pay-off.

## History

- Dec 7, 2021: [RFC #3185: Static async fn in traits](https://rust-lang.github.io/rfcs/3185-static-async-fn-in-trait.html) merged
- Sep 9, 2022: [Initial implementation](https://github.com/rust-lang/rust/pull/101224) of AFIT and RPITIT landed
- Jun 13, 2023: [RFC #3425: Return position `impl Trait` in traits](https://rust-lang.github.io/rfcs/3425-return-position-impl-trait-in-traits.html) merged

<!--These will render pretty when pasted into github-->
Non-exhaustive list of PRs that are particularly relevant to the implementation:

- #101224
- #103491
- #104592
- #108141
- #108319
- #108672
- #112988
- #113182 (later made redundant by #114489)
- #113215
- #114489
- #115467
- #115582

Doc co-authored by `@nikomatsakis,` `@tmandry,` `@traviscross.` Thanks also to `@spastorino,` `@cjgillot` (for changes to opaque captures!), `@oli-obk` for many reviews, and many other contributors and issue-filers. Apologies if I left your name off 😺
2023-10-14 07:29:08 +00:00
..
assoc Move some tests around 2023-10-03 21:31:27 +00:00
attribute Move some tests around 2023-10-09 19:24:05 +00:00
char
diff-markers
issues Detect ruby-style closure in parser 2023-10-12 21:50:18 +00:00
macro Add a note to duplicate diagnostics 2023-10-05 01:04:41 +00:00
mismatched-braces
raw
shebang Add explanatory note to 'expected item' error 2023-09-06 09:05:07 +05:30
suggest_misplaced_generics
anon-enums-are-ambiguous.rs
ascii-only-character-escape.rs
ascii-only-character-escape.stderr
async-with-nonterminal-block.rs Support interpolated block for try and async 2023-07-22 15:22:12 +00:00
bad-char-literals.rs
bad-char-literals.stderr
bad-crate-name.rs
bad-crate-name.stderr
bad-escape-suggest-raw-string.rs Use a better link 2023-06-10 14:46:11 -04:00
bad-escape-suggest-raw-string.stderr Use a better link 2023-06-10 14:46:11 -04:00
bad-fn-ptr-qualifier.fixed
bad-fn-ptr-qualifier.rs
bad-fn-ptr-qualifier.stderr
bad-if-statements.rs
bad-if-statements.stderr
bad-interpolated-block.rs
bad-interpolated-block.stderr Add suggestion for bad block fragment error 2023-06-23 19:18:20 +00:00
bad-let-as-field.rs
bad-let-as-field.stderr
bad-lit-suffixes.rs
bad-lit-suffixes.stderr
bad-match.rs
bad-match.stderr
bad-name.rs
bad-name.stderr
bad-pointer-type.rs
bad-pointer-type.stderr
bad-recover-kw-after-impl.rs
bad-recover-ty-after-impl.rs
bad-struct-following-where.rs
bad-struct-following-where.stderr
bad-value-ident-false.rs
bad-value-ident-false.stderr
bad-value-ident-true.rs
bad-value-ident-true.stderr
bare-struct-body.rs
bare-struct-body.stderr
bastion-of-the-turbofish.rs
better-expected.rs
better-expected.stderr
bind-struct-early-modifiers.rs
bind-struct-early-modifiers.stderr
block-no-opening-brace.rs
block-no-opening-brace.stderr
bound-single-question-mark.rs
bound-single-question-mark.stderr
bounds-lifetime-1.rs
bounds-lifetime-1.stderr
bounds-lifetime-2.rs
bounds-lifetime-2.stderr
bounds-lifetime-where-1.rs
bounds-lifetime-where-1.stderr
bounds-lifetime-where.rs
bounds-lifetime-where.stderr
bounds-lifetime.rs
bounds-lifetime.stderr
bounds-obj-parens.rs
bounds-type-where.rs
bounds-type-where.stderr
bounds-type.rs
bounds-type.stderr
break-in-unlabeled-block-in-macro.rs Account for macros 2023-10-09 22:48:10 +00:00
break-in-unlabeled-block-in-macro.stderr Account for macros 2023-10-09 22:48:10 +00:00
break-in-unlabeled-block.fixed fix 2023-10-09 19:24:05 +00:00
break-in-unlabeled-block.rs Suggest labeling block if break is in bare block 2023-10-09 19:24:05 +00:00
break-in-unlabeled-block.stderr Suggest labeling block if break is in bare block 2023-10-09 19:24:05 +00:00
builtin-syntax.rs
builtin-syntax.stderr
byte-literals.rs
byte-literals.stderr Use a better link 2023-06-10 14:46:11 -04:00
byte-string-literals.rs
byte-string-literals.stderr Use a better link 2023-06-10 14:46:11 -04:00
can-begin-expr-check.rs
can-begin-expr-check.stderr
chained-comparison-suggestion.rs
chained-comparison-suggestion.stderr
circular_modules_hello.rs
circular_modules_main.rs
circular_modules_main.stderr
class-implements-bad-trait.rs
class-implements-bad-trait.stderr
closure-return-syntax.rs
closure-return-syntax.stderr
column-offset-1-based.rs
column-offset-1-based.stderr
const-param-decl-on-type-instead-of-impl.rs
const-param-decl-on-type-instead-of-impl.stderr
constraints-before-generic-args-syntactic-pass.rs
constraints-before-generic-args-syntactic-pass.stderr
default-on-wrong-item-kind.rs
default-on-wrong-item-kind.stderr
default-unmatched-assoc.rs
default-unmatched-assoc.stderr
default-unmatched-extern.rs
default-unmatched-extern.stderr
default-unmatched.rs
default-unmatched.stderr Add explanatory note to 'expected item' error 2023-09-06 09:05:07 +05:30
default.rs
default.stderr
deli-ident-issue-1.rs
deli-ident-issue-1.stderr
deli-ident-issue-2.rs
deli-ident-issue-2.stderr
do-catch-suggests-try.rs
do-catch-suggests-try.stderr
do-not-suggest-semicolon-before-array.rs
do-not-suggest-semicolon-before-array.stderr
do-not-suggest-semicolon-between-macro-without-exclamation-mark-and-array.rs
do-not-suggest-semicolon-between-macro-without-exclamation-mark-and-array.stderr
doc-after-struct-field.rs
doc-after-struct-field.stderr
doc-before-attr.rs
doc-before-attr.stderr
doc-before-eof.rs
doc-before-eof.stderr
doc-before-extern-rbrace.rs
doc-before-extern-rbrace.stderr
doc-before-fn-rbrace.rs
doc-before-fn-rbrace.stderr
doc-before-identifier.rs
doc-before-identifier.stderr
doc-before-mod-rbrace.rs
doc-before-mod-rbrace.stderr
doc-before-rbrace.rs
doc-before-rbrace.stderr
doc-before-semi.rs
doc-before-semi.stderr
doc-before-struct-rbrace-1.rs
doc-before-struct-rbrace-1.stderr
doc-before-struct-rbrace-2.rs
doc-before-struct-rbrace-2.stderr
doc-comment-in-if-statement.rs
doc-comment-in-if-statement.stderr
doc-comment-in-stmt.rs
doc-comment-in-stmt.stderr
doc-inside-trait-item.rs
doc-inside-trait-item.stderr
dotdotdot-expr.rs
dotdotdot-expr.stderr
double-pointer.rs
double-pointer.stderr
duplicate-visibility.rs
duplicate-visibility.stderr
duplicate-where-clauses.rs
duplicate-where-clauses.stderr
dyn-trait-compatibility.rs
dyn-trait-compatibility.stderr
else-no-if.rs
else-no-if.stderr
emoji-identifiers.rs
emoji-identifiers.stderr
empty-impl-semicolon.rs
empty-impl-semicolon.stderr
eq-less-to-less-eq.rs
eq-less-to-less-eq.stderr
expr-as-stmt-2.rs
expr-as-stmt-2.stderr
expr-as-stmt.fixed
expr-as-stmt.rs
expr-as-stmt.stderr adjust how closure/generator types and rvalues are printed 2023-09-21 22:20:58 +02:00
extern-abi-from-mac-literal-frag.rs
extern-abi-raw-strings.rs
extern-abi-string-escaping.rs
extern-abi-syntactic.rs
extern-crate-async.rs
extern-crate-unexpected-token.rs
extern-crate-unexpected-token.stderr
extern-expected-fn-or-brace.rs
extern-expected-fn-or-brace.stderr
extern-foreign-crate.rs
extern-foreign-crate.stderr
extern-no-fn.rs
extern-no-fn.stderr
float-field-interpolated.rs
float-field-interpolated.stderr
float-field.rs
float-field.stderr
float-literals.rs
fn-arg-doc-comment.rs
fn-arg-doc-comment.stderr
fn-body-eq-expr-semi.rs
fn-body-eq-expr-semi.stderr
fn-body-optional-semantic-fail.rs
fn-body-optional-semantic-fail.stderr
fn-body-optional-syntactic-pass.rs
fn-colon-return-type.rs
fn-colon-return-type.stderr
fn-defined-using-def.rs
fn-defined-using-def.stderr
fn-defined-using-fun.rs
fn-defined-using-fun.stderr
fn-defined-using-func.rs
fn-defined-using-func.stderr
fn-defined-using-function.rs
fn-defined-using-function.stderr
fn-field-parse-error-ice.rs
fn-field-parse-error-ice.stderr
fn-header-semantic-fail.rs Stabilize AFIT and RPITIT 2023-10-13 21:01:36 +00:00
fn-header-semantic-fail.stderr Stabilize AFIT and RPITIT 2023-10-13 21:01:36 +00:00
fn-header-syntactic-pass.rs
fn-returns-fn-pointer.rs
foreign-const-semantic-fail.rs
foreign-const-semantic-fail.stderr
foreign-const-syntactic-fail.rs
foreign-const-syntactic-fail.stderr
foreign-static-semantic-fail.rs
foreign-static-semantic-fail.stderr
foreign-static-syntactic-pass.rs
foreign-ty-semantic-fail.rs Fix debug ICE for extern type with where clauses 2023-06-12 15:15:45 +08:00
foreign-ty-semantic-fail.stderr Fix debug ICE for extern type with where clauses 2023-06-12 15:15:45 +08:00
foreign-ty-syntactic-pass.rs
generic-statics.rs Add UI tests for generic const items 2023-07-28 22:23:20 +02:00
generic-statics.stderr Add UI tests for generic const items 2023-07-28 22:23:20 +02:00
ident-recovery.rs
ident-recovery.stderr
if-block-unreachable-expr.rs
if-in-in.fixed
if-in-in.rs
if-in-in.stderr
impl-item-const-pass.rs
impl-item-const-semantic-fail.rs
impl-item-const-semantic-fail.stderr
impl-item-fn-no-body-pass.rs
impl-item-fn-no-body-semantic-fail.rs
impl-item-fn-no-body-semantic-fail.stderr
impl-item-type-no-body-pass.rs
impl-item-type-no-body-semantic-fail.rs
impl-item-type-no-body-semantic-fail.stderr
impl-on-unsized-typo.rs Recover impl<T ?Sized> correctly 2023-05-15 17:14:59 +00:00
impl-on-unsized-typo.stderr Recover impl<T ?Sized> correctly 2023-05-15 17:14:59 +00:00
impl-parsing.rs
impl-parsing.stderr Add explanatory note to 'expected item' error 2023-09-06 09:05:07 +05:30
impl-qpath.rs
import-from-path.rs
import-from-path.stderr
import-from-rename.rs
import-from-rename.stderr
import-glob-path.rs
import-glob-path.stderr
import-glob-rename.rs
import-glob-rename.stderr
increment-autofix-2.fixed
increment-autofix-2.rs
increment-autofix-2.stderr
increment-autofix.fixed
increment-autofix.rs
increment-autofix.stderr
inner-attr-after-doc-comment.rs
inner-attr-after-doc-comment.stderr
inner-attr-in-trait-def.rs
inner-attr.rs
inner-attr.stderr
int-literal-too-large-span.rs
int-literal-too-large-span.stderr
integer-literal-start-ident.rs
integer-literal-start-ident.stderr
intersection-patterns-1.fixed
intersection-patterns-1.rs
intersection-patterns-1.stderr
intersection-patterns-2.rs
intersection-patterns-2.stderr
inverted-parameters.rs
inverted-parameters.stderr
issue-17718-parse-const.rs
issue-39616.rs
issue-39616.stderr
issue-49257.rs
issue-49257.stderr Fix suggestion for matching struct with .. on both ends 2023-06-03 15:02:13 +08:00
issue-61858.rs
issue-61858.stderr
issue-68091-unicode-ident-after-if.rs
issue-68091-unicode-ident-after-if.stderr
issue-68092-unicode-ident-after-incomplete-expr.rs
issue-68092-unicode-ident-after-incomplete-expr.stderr
issue-68987-unmatch-issue-1.rs
issue-68987-unmatch-issue-1.stderr
issue-68987-unmatch-issue-2.rs
issue-68987-unmatch-issue-2.stderr
issue-68987-unmatch-issue-3.rs
issue-68987-unmatch-issue-3.stderr
issue-68987-unmatch-issue.rs
issue-68987-unmatch-issue.stderr
issue-81804.rs
issue-81804.stderr
issue-81827.rs
issue-81827.stderr
issue-87694-duplicated-pub.rs
issue-87694-duplicated-pub.stderr
issue-87694-misplaced-pub.rs
issue-87694-misplaced-pub.stderr
issue-90728.rs
issue-90728.stderr
issue-91421.rs
issue-91421.stderr
issue-99625-enum-struct-mutually-exclusive.fixed
issue-99625-enum-struct-mutually-exclusive.rs
issue-99625-enum-struct-mutually-exclusive.stderr
issue-99910-const-let-mutually-exclusive.fixed
issue-99910-const-let-mutually-exclusive.rs
issue-99910-const-let-mutually-exclusive.stderr
issue-100197-mut-let.fixed
issue-100197-mut-let.rs
issue-100197-mut-let.stderr
issue-101477-enum.fixed
issue-101477-enum.rs
issue-101477-enum.stderr Add explanatory note to 'expected item' error 2023-09-06 09:05:07 +05:30
issue-101477-let.fixed
issue-101477-let.rs
issue-101477-let.stderr
issue-102806.rs
issue-102806.stderr
issue-103143.rs
issue-103143.stderr
issue-103381.fixed
issue-103381.rs
issue-103381.stderr
issue-103425.rs
issue-103425.stderr
issue-103451.rs
issue-103451.stderr
issue-103748-ICE-wrong-braces.rs
issue-103748-ICE-wrong-braces.stderr
issue-104620.rs
issue-104620.stderr
issue-104867-inc-dec-2.rs
issue-104867-inc-dec-2.stderr
issue-104867-inc-dec.rs
issue-104867-inc-dec.stderr
issue-105366.fixed
issue-105366.rs
issue-105366.stderr
issue-105634.rs
issue-107705.rs
issue-107705.stderr
issue-108495-dec.rs
issue-108495-dec.stderr
issue-112188.fixed Fix suggestion for matching struct with .. on both ends 2023-06-03 15:02:13 +08:00
issue-112188.rs Fix suggestion for matching struct with .. on both ends 2023-06-03 15:02:13 +08:00
issue-112188.stderr Fix suggestion for matching struct with .. on both ends 2023-06-03 15:02:13 +08:00
issue-113342.rs Fix the issue of wrong diagnosis for extern pub fn 2023-07-05 16:25:46 +08:00
issue-113342.stderr Fix the issue of wrong diagnosis for extern pub fn 2023-07-05 16:25:46 +08:00
item-free-const-no-body-semantic-fail.rs
item-free-const-no-body-semantic-fail.stderr
item-free-const-no-body-syntactic-pass.rs
item-free-static-no-body-semantic-fail.rs
item-free-static-no-body-semantic-fail.stderr
item-free-static-no-body-syntactic-pass.rs
item-free-type-bounds-semantic-fail.rs
item-free-type-bounds-semantic-fail.stderr
item-free-type-bounds-syntactic-pass.rs
item-kw-case-mismatch.fixed
item-kw-case-mismatch.rs
item-kw-case-mismatch.stderr
item-needs-block.rs
item-needs-block.stderr
keyword-abstract.rs
keyword-abstract.stderr
keyword-as-as-identifier.rs
keyword-as-as-identifier.stderr
keyword-box-as-identifier.rs
keyword-box-as-identifier.stderr
keyword-break-as-identifier.rs
keyword-break-as-identifier.stderr
keyword-const-as-identifier.rs
keyword-const-as-identifier.stderr
keyword-continue-as-identifier.rs
keyword-continue-as-identifier.stderr
keyword-else-as-identifier.rs
keyword-else-as-identifier.stderr
keyword-enum-as-identifier.rs
keyword-enum-as-identifier.stderr
keyword-final.rs
keyword-final.stderr
keyword-fn-as-identifier.rs
keyword-fn-as-identifier.stderr
keyword-for-as-identifier.rs
keyword-for-as-identifier.stderr
keyword-if-as-identifier.rs
keyword-if-as-identifier.stderr
keyword-impl-as-identifier.rs
keyword-impl-as-identifier.stderr
keyword-in-as-identifier.rs
keyword-in-as-identifier.stderr
keyword-let-as-identifier.rs
keyword-let-as-identifier.stderr
keyword-loop-as-identifier.rs
keyword-loop-as-identifier.stderr
keyword-match-as-identifier.rs
keyword-match-as-identifier.stderr
keyword-mod-as-identifier.rs
keyword-mod-as-identifier.stderr
keyword-move-as-identifier.rs
keyword-move-as-identifier.stderr
keyword-mut-as-identifier.rs
keyword-mut-as-identifier.stderr
keyword-override.rs
keyword-override.stderr
keyword-pub-as-identifier.rs
keyword-pub-as-identifier.stderr
keyword-ref-as-identifier.rs
keyword-ref-as-identifier.stderr
keyword-return-as-identifier.rs
keyword-return-as-identifier.stderr
keyword-static-as-identifier.rs
keyword-static-as-identifier.stderr
keyword-struct-as-identifier.rs
keyword-struct-as-identifier.stderr
keyword-trait-as-identifier.rs
keyword-trait-as-identifier.stderr
keyword-try-as-identifier-edition2018.rs
keyword-try-as-identifier-edition2018.stderr
keyword-type-as-identifier.rs
keyword-type-as-identifier.stderr
keyword-typeof.rs
keyword-typeof.stderr
keyword-union-as-identifier.rs Parse unnamed fields and anonymous structs or unions 2023-08-24 11:17:54 +08:00
keyword-unsafe-as-identifier.rs
keyword-unsafe-as-identifier.stderr
keyword-use-as-identifier.rs
keyword-use-as-identifier.stderr
keyword-where-as-identifier.rs
keyword-where-as-identifier.stderr
keyword-while-as-identifier.rs
keyword-while-as-identifier.stderr
keyword.rs
keyword.stderr
keywords-followed-by-double-colon.rs
keywords-followed-by-double-colon.stderr
kw-in-trait-bounds.rs
kw-in-trait-bounds.stderr
label-after-block-like.rs
label-after-block-like.stderr
label-is-actually-char.rs
label-is-actually-char.stderr
labeled-no-colon-expr.rs
labeled-no-colon-expr.stderr Add suggestion for bad block fragment error 2023-06-23 19:18:20 +00:00
let-binop.fixed
let-binop.rs
let-binop.stderr
lifetime_starts_expressions.rs
lifetime_starts_expressions.stderr
lifetime-in-pattern-recover.rs
lifetime-in-pattern-recover.stderr
lifetime-in-pattern.rs
lifetime-in-pattern.stderr
lifetime-semicolon.fixed
lifetime-semicolon.rs
lifetime-semicolon.stderr
lit-err-in-macro.rs Handle interpolated literal errors 2023-06-15 01:55:37 +00:00
lit-err-in-macro.stderr Handle interpolated literal errors 2023-06-15 01:55:37 +00:00
macro-bad-delimiter-ident.rs
macro-bad-delimiter-ident.stderr
macro-braces-dot-question.rs
macro-keyword.rs
macro-keyword.stderr
macro-mismatched-delim-brace-paren.rs
macro-mismatched-delim-brace-paren.stderr
macro-mismatched-delim-paren-brace.rs
macro-mismatched-delim-paren-brace.stderr
macros-no-semicolon-items.rs
macros-no-semicolon-items.stderr
macros-no-semicolon.rs
macros-no-semicolon.stderr
match-arm-without-braces.rs
match-arm-without-braces.stderr
match-arrows-block-then-binop.rs
match-arrows-block-then-binop.stderr
match-refactor-to-expr.fixed
match-refactor-to-expr.rs
match-refactor-to-expr.stderr
mbe_missing_right_paren.rs
mbe_missing_right_paren.stderr
method-call-on-struct-literal-in-if-condition.rs
method-call-on-struct-literal-in-if-condition.stderr reword the message to suggest surrounding with parentheses 2023-06-10 06:28:35 +08:00
mismatched-delim-brace-empty-block.rs
mismatched-delim-brace-empty-block.stderr
missing_right_paren.rs
missing_right_paren.stderr
missing-closing-angle-bracket-eq-constraint.rs
missing-closing-angle-bracket-eq-constraint.stderr
missing-closing-angle-bracket-struct-field-ty.rs
missing-closing-angle-bracket-struct-field-ty.stderr
missing-expression-in-for-loop.rs
missing-expression-in-for-loop.stderr
missing-fat-arrow.rs review comments 2023-10-04 01:35:07 +00:00
missing-fat-arrow.stderr review comments 2023-10-04 01:35:07 +00:00
missing-semicolon.rs
missing-semicolon.stderr
misspelled-macro-rules.fixed
misspelled-macro-rules.rs
misspelled-macro-rules.stderr
mod_file_not_exist_windows.rs
mod_file_not_exist_windows.stderr
mod_file_not_exist.rs
mod_file_not_exist.stderr
mod_file_with_path_attr.rs
mod_file_with_path_attr.stderr
multibyte-char-use-seperator-issue-80134.rs
multibyte-char-use-seperator-issue-80134.stderr
multiline-comment-line-tracking.rs
multiline-comment-line-tracking.stderr
multitrait.rs
multitrait.stderr
mut-patterns.rs
mut-patterns.stderr
nested-bad-turbofish.rs
nested-bad-turbofish.stderr
nested-missing-closing-angle-bracket.rs
nested-missing-closing-angle-bracket.stderr
new-unicode-escapes-1.rs
new-unicode-escapes-1.stderr
new-unicode-escapes-2.rs
new-unicode-escapes-2.stderr
new-unicode-escapes-3.rs
new-unicode-escapes-3.stderr
new-unicode-escapes-4.rs
new-unicode-escapes-4.stderr
no-binary-float-literal.rs
no-binary-float-literal.stderr
no-const-fn-in-extern-block.rs
no-const-fn-in-extern-block.stderr
no-hex-float-literal.rs
no-hex-float-literal.stderr
no-unsafe-self.rs
no-unsafe-self.stderr
not-a-pred.rs
not-a-pred.stderr
nt-parsing-has-recovery.rs
nt-parsing-has-recovery.stderr
numeric-lifetime.rs
numeric-lifetime.stderr
obsolete-syntax-impl-for-dotdot.rs
obsolete-syntax-impl-for-dotdot.stderr
old-suffixes-are-really-forbidden.rs
old-suffixes-are-really-forbidden.stderr
omitted-arg-in-item-fn.rs
omitted-arg-in-item-fn.stderr
operator-associativity.rs
paamayim-nekudotayim.rs
paamayim-nekudotayim.stderr
parse-assoc-type-lt.rs
parse-error-correct.rs
parse-error-correct.stderr
parse-panic.rs
parser-recovery-1.rs
parser-recovery-1.stderr
parser-recovery-2.rs
parser-recovery-2.stderr
parser-unicode-whitespace.rs
pat-lt-bracket-1.rs
pat-lt-bracket-1.stderr
pat-lt-bracket-2.rs
pat-lt-bracket-2.stderr
pat-lt-bracket-3.rs Suggests turbofish in patterns 2023-08-01 23:30:40 +08:00
pat-lt-bracket-3.stderr Suggests turbofish in patterns 2023-08-01 23:30:40 +08:00
pat-lt-bracket-4.rs Suggests turbofish in patterns 2023-08-01 23:30:40 +08:00
pat-lt-bracket-4.stderr Suggests turbofish in patterns 2023-08-01 23:30:40 +08:00
pat-lt-bracket-5.rs
pat-lt-bracket-5.stderr
pat-lt-bracket-6.rs
pat-lt-bracket-6.stderr
pat-lt-bracket-7.rs
pat-lt-bracket-7.stderr
pat-ranges-1.rs
pat-ranges-1.stderr
pat-ranges-2.rs
pat-ranges-2.stderr
pat-ranges-3.rs
pat-ranges-3.stderr
pat-ranges-4.rs
pat-ranges-4.stderr
pat-ref-enum.rs
pat-ref-enum.stderr
pat-tuple-1.rs
pat-tuple-1.stderr
pat-tuple-2.rs
pat-tuple-3.rs
pat-tuple-3.stderr
pub-method-macro.rs
pub-method-macro.stderr
public-instead-of-pub-1.fixed
public-instead-of-pub-1.rs
public-instead-of-pub-1.stderr
public-instead-of-pub-2.rs
public-instead-of-pub-2.stderr
public-instead-of-pub-3.fixed
public-instead-of-pub-3.rs
public-instead-of-pub-3.stderr
public-instead-of-pub.fixed
public-instead-of-pub.rs
public-instead-of-pub.stderr
qualified-path-in-turbofish.fixed
qualified-path-in-turbofish.rs
qualified-path-in-turbofish.stderr
range_inclusive_dotdotdot.rs
range_inclusive_dotdotdot.stderr
range_inclusive.fixed
range_inclusive.rs
range_inclusive.stderr
range-3.rs
range-3.stderr
range-4.rs
range-4.stderr
range-inclusive-extra-equals.rs
range-inclusive-extra-equals.stderr
ranges-precedence.rs
recover-assoc-const-constraint.rs
recover-assoc-const-constraint.stderr
recover-assoc-eq-missing-term.rs
recover-assoc-eq-missing-term.stderr
recover-assoc-lifetime-constraint.rs
recover-assoc-lifetime-constraint.stderr
recover-const-async-fn-ptr.rs
recover-const-async-fn-ptr.stderr
recover-enum2.rs
recover-enum2.stderr
recover-enum.rs
recover-enum.stderr
recover-field-extra-angle-brackets-in-struct-with-a-field.rs
recover-field-extra-angle-brackets-in-struct-with-a-field.stderr
recover-field-extra-angle-brackets.rs
recover-field-extra-angle-brackets.stderr
recover-field-semi.rs
recover-field-semi.stderr
recover-fn-ptr-with-generics.rs
recover-fn-ptr-with-generics.stderr
recover-fn-trait-from-fn-kw.rs
recover-fn-trait-from-fn-kw.stderr
recover-for-loop-parens-around-head.rs
recover-for-loop-parens-around-head.stderr
recover-from-bad-variant.rs
recover-from-bad-variant.stderr
recover-from-homoglyph.rs
recover-from-homoglyph.stderr
recover-labeled-non-block-expr.fixed
recover-labeled-non-block-expr.rs
recover-labeled-non-block-expr.stderr
recover-missing-semi-before-item.fixed
recover-missing-semi-before-item.rs
recover-missing-semi-before-item.stderr
recover-missing-semi.rs
recover-missing-semi.stderr
recover-quantified-closure.rs
recover-quantified-closure.stderr Point to where missing return type should go 2023-10-04 21:09:54 +00:00
recover-range-pats.rs
recover-range-pats.stderr
recover-ref-dyn-mut.rs
recover-ref-dyn-mut.stderr
recover-struct.rs
recover-struct.stderr
recover-tuple-pat.rs
recover-tuple-pat.stderr
recover-tuple.rs
recover-tuple.stderr
recover-unticked-labels.fixed
recover-unticked-labels.rs
recover-unticked-labels.stderr
recover-where-clause-before-tuple-struct-body-0.fixed
recover-where-clause-before-tuple-struct-body-0.rs
recover-where-clause-before-tuple-struct-body-0.stderr
recover-where-clause-before-tuple-struct-body-1.rs
recover-where-clause-before-tuple-struct-body-1.stderr
recovered-struct-variant.rs
recovered-struct-variant.stderr
regions-out-of-scope-slice.rs
regions-out-of-scope-slice.stderr
removed-syntax-box.fixed
removed-syntax-box.rs
removed-syntax-box.stderr
removed-syntax-closure-lifetime.rs
removed-syntax-closure-lifetime.stderr
removed-syntax-enum-newtype.rs
removed-syntax-enum-newtype.stderr
removed-syntax-field-let-2.rs
removed-syntax-field-let-2.stderr
removed-syntax-field-let.rs
removed-syntax-field-let.stderr
removed-syntax-field-semicolon.rs
removed-syntax-field-semicolon.stderr
removed-syntax-fixed-vec.rs
removed-syntax-fixed-vec.stderr
removed-syntax-fn-sigil.rs
removed-syntax-fn-sigil.stderr
removed-syntax-mode.rs
removed-syntax-mode.stderr
removed-syntax-mut-vec-expr.rs
removed-syntax-mut-vec-expr.stderr
removed-syntax-mut-vec-ty.rs
removed-syntax-mut-vec-ty.stderr
removed-syntax-ptr-lifetime.rs
removed-syntax-ptr-lifetime.stderr
removed-syntax-record.rs
removed-syntax-record.stderr
removed-syntax-static-fn.rs
removed-syntax-static-fn.stderr
removed-syntax-uniq-mut-expr.rs
removed-syntax-uniq-mut-expr.stderr
removed-syntax-uniq-mut-ty.rs
removed-syntax-uniq-mut-ty.stderr
removed-syntax-with-1.rs
removed-syntax-with-1.stderr
removed-syntax-with-2.rs
removed-syntax-with-2.stderr Detect missing => after match guard during parsing 2023-10-03 21:21:02 +00:00
require-parens-for-chained-comparison.rs
require-parens-for-chained-comparison.stderr
self-in-function-arg.rs
self-in-function-arg.stderr
self-param-semantic-fail.rs
self-param-semantic-fail.stderr
self-param-syntactic-pass.rs
semi-after-closure-in-macro.rs
several-carriage-returns-in-doc-comment.rs
several-carriage-returns-in-doc-comment.stderr
similar-tokens.rs
similar-tokens.stderr
slowparse-bstring.rs
slowparse-string.rs
stmt_expr_attrs_placement.rs
stmt_expr_attrs_placement.stderr
stripped-nested-outline-mod-pass.rs
struct-default-values-and-missing-field-separator.fixed
struct-default-values-and-missing-field-separator.rs
struct-default-values-and-missing-field-separator.stderr
struct-field-numeric-shorthand.rs
struct-field-numeric-shorthand.stderr
struct-filed-with-attr.fixed
struct-filed-with-attr.rs
struct-filed-with-attr.stderr
struct-literal-in-for.rs
struct-literal-in-for.stderr
struct-literal-in-if.rs Add tests for struct literals in if let/while let 2023-08-28 10:30:48 +01:00
struct-literal-in-if.stderr Add tests for struct literals in if let/while let 2023-08-28 10:30:48 +01:00
struct-literal-in-match-discriminant.rs
struct-literal-in-match-discriminant.stderr
struct-literal-in-match-guard.rs Allow stuct literals in if let guards 2023-08-28 10:31:45 +01:00
struct-literal-in-while.rs Add tests for struct literals in if let/while let 2023-08-28 10:30:48 +01:00
struct-literal-in-while.stderr Add tests for struct literals in if let/while let 2023-08-28 10:30:48 +01:00
struct-literal-restrictions-in-lamda.rs
struct-literal-restrictions-in-lamda.stderr adjust how closure/generator types and rvalues are printed 2023-09-21 22:20:58 +02:00
struct-literal-variant-in-if.rs
struct-literal-variant-in-if.stderr
suggest-assoc-const.fixed
suggest-assoc-const.rs
suggest-assoc-const.stderr
suggest-const-for-global-var.rs
suggest-const-for-global-var.stderr
suggest-removing-semicolon-after-impl-trait-items.fixed
suggest-removing-semicolon-after-impl-trait-items.rs
suggest-removing-semicolon-after-impl-trait-items.stderr
suggest-semi-in-array.rs
suggest-semi-in-array.stderr
suggest-semicolon-before-array.fixed
suggest-semicolon-before-array.rs
suggest-semicolon-before-array.stderr
ternary_operator.rs Remove unnecessary maybe_ternary_lo field 2023-07-25 18:37:56 +00:00
ternary_operator.stderr Remove unnecessary maybe_ternary_lo field 2023-07-25 18:37:56 +00:00
trailing-carriage-return-in-string.rs
trailing-carriage-return-in-string.stderr
trailing-plus-in-bounds.rs
trailing-question-in-macro-type.rs
trailing-question-in-macro-type.stderr
trailing-question-in-type.fixed
trailing-question-in-type.rs
trailing-question-in-type.stderr
trait-bounds-not-on-impl.rs
trait-bounds-not-on-impl.stderr
trait-item-with-defaultness-fail-semantic.rs
trait-item-with-defaultness-fail-semantic.stderr
trait-item-with-defaultness-pass.rs
trait-object-bad-parens.rs
trait-object-bad-parens.stderr
trait-object-delimiters.rs Fix bad suggestion when wrong parentheses around a dyn trait 2023-08-16 00:26:10 +08:00
trait-object-delimiters.stderr Fix bad suggestion when wrong parentheses around a dyn trait 2023-08-16 00:26:10 +08:00
trait-object-lifetime-parens.rs
trait-object-lifetime-parens.stderr
trait-object-polytrait-priority.rs
trait-object-polytrait-priority.stderr
trait-object-trait-parens.rs
trait-object-trait-parens.stderr
trait-plusequal-splitting.rs
trait-pub-assoc-const.rs
trait-pub-assoc-const.stderr
trait-pub-assoc-ty.rs
trait-pub-assoc-ty.stderr
trait-pub-method.rs
trait-pub-method.stderr
try-with-nonterminal-block.rs Support interpolated block for try and async 2023-07-22 15:22:12 +00:00
type-ascription-in-pattern.rs
type-ascription-in-pattern.stderr
type-parameters-in-field-exprs.rs
type-parameters-in-field-exprs.stderr
typod-const-in-const-param-def.rs Recover upon encountering mistyped Const in const param def 2023-05-28 16:55:21 +08:00
typod-const-in-const-param-def.stderr Recover upon encountering mistyped Const in const param def 2023-05-28 16:55:21 +08:00
unbalanced-doublequote.rs
unbalanced-doublequote.stderr
unclosed_delim_mod.rs
unclosed_delim_mod.stderr
unclosed-braces.rs
unclosed-braces.stderr
unclosed-delimiter-in-dep.rs
unclosed-delimiter-in-dep.stderr
underscore_item_not_const.rs
underscore_item_not_const.stderr
underscore-suffix-for-float.rs
underscore-suffix-for-float.stderr
underscore-suffix-for-string.rs
underscore-suffix-for-string.stderr
unicode-character-literal.fixed
unicode-character-literal.rs
unicode-character-literal.stderr
unicode-chars.rs
unicode-chars.stderr
unicode-control-codepoints.rs
unicode-control-codepoints.stderr
unicode-quote-chars.rs
unicode-quote-chars.stderr
unmatched-delimiter-at-end-of-file.rs
unmatched-delimiter-at-end-of-file.stderr
unmatched-langle-1.rs
unmatched-langle-1.stderr
unmatched-langle-2.rs
unmatched-langle-2.stderr
unnecessary-let.rs
unnecessary-let.stderr
unsafe-foreign-mod-2.rs
unsafe-foreign-mod-2.stderr
unsafe-foreign-mod.rs
unsafe-foreign-mod.stderr
unsafe-mod.rs
unsafe-mod.stderr
unsized2.rs
unsized2.stderr
unsized.rs
unsized.stderr
use-as-where-use-ends-with-mod-sep.rs
use-as-where-use-ends-with-mod-sep.stderr
use-colon-as-mod-sep.rs
use-colon-as-mod-sep.stderr
use-ends-with-mod-sep.rs
use-ends-with-mod-sep.stderr
use-unclosed-brace.rs
use-unclosed-brace.stderr
utf8_idents-rpass.rs
utf16-be-without-bom.rs
utf16-be-without-bom.stderr Detect extra space in keyword for better hint 2023-07-04 18:13:31 +08:00
utf16-le-without-bom.rs
utf16-le-without-bom.stderr Detect extra space in keyword for better hint 2023-07-04 18:13:31 +08:00
variadic-ffi-nested-syntactic-fail.rs
variadic-ffi-nested-syntactic-fail.stderr
variadic-ffi-semantic-restrictions.rs
variadic-ffi-semantic-restrictions.stderr
variadic-ffi-syntactic-pass.rs
virtual-structs.rs
virtual-structs.stderr Add explanatory note to 'expected item' error 2023-09-06 09:05:07 +05:30
where_with_bound.rs
where_with_bound.stderr
where-clauses-no-bounds-or-predicates.rs
where-clauses-no-bounds-or-predicates.stderr
while-if-let-without-body.rs
while-if-let-without-body.stderr
wrong-escape-of-curly-braces.rs
wrong-escape-of-curly-braces.stderr