Understanding Rust Error E0192

Introduction to Rust Error E0192

Rust Error E0192 refers to the use of a negative impl on a trait implementation, which is not allowed except for auto traits. This error is no longer emitted by the compiler. To understand this error, let's look at the original erroneous code example provided in the Rust documentation:

trait Trait {
    type Bar;

struct Foo;

impl !Trait for Foo { } //~ ERROR

fn main() {}

What are Auto Traits?

Auto traits are special Rust traits that are automatically derived for types that meet specific requirements. Examples of auto traits include Send and Sync. Auto traits can be used with negative impls to express that a type does not implement a specific trait.

Negative Impls and Their Usage

A negative impl is a way of indicating that a type does not implement a particular trait. This is done by using the ! operator before the trait name in the impl block. However, negative impls are only allowed for auto traits. Attempting to use negative impls for non-auto traits will result in the E0192 error.

Fixing Rust Error E0192

To fix Rust Error E0192, you should remove the negative impl from the non-auto trait. If there's a need to create a custom trait with the same properties as auto traits, consider making it an auto trait using the unsafe auto trait syntax.

Example using Auto Trait

Here's an example of how to correctly use negative impl with an auto trait.

use std::marker::Send;

struct NotSend;

impl !Send for NotSend {} // This compiles without error

fn main() {}


Rust Error E0192 is related to the usage of negative impls, which are only allowed for auto traits. To avoid this error, ensure that negative impls are used exclusively with auto traits. For more information, refer to the Rust Opt-in Built-in Traits RFC.

Recommended Reading