Crate negative_impl

source ·
Expand description

Negative trait implementations on stable Rust.

This crate emulates the unstable negative_impls feature by generating a trait implementation with a condition that will never be true.

§Usage

Add this to your Cargo.toml:

[dependencies]
negative-impl = "0.1"

Compiler support: requires rustc 1.56+

§Examples

use negative_impl::negative_impl;

pub struct Type {}

#[negative_impl]
impl !Send for Type {}
#[negative_impl]
impl !Sync for Type {}

§Supported traits

Currently this crate only supports auto traits.

§Limitations

§Conflicting implementations

The following code cannot compile due to impl<T: Send> Trait for T and impl Trait for Type conflict.

use negative_impl::negative_impl;

pub struct Type {}

#[negative_impl]
impl !Send for Type {}

trait Trait {}

impl<T: Send> Trait for T {}
impl Trait for Type {}
error[E0119]: conflicting implementations of trait `Trait` for type `Type`:
  --> src/lib.rs:60:1
   |
14 | impl<T: Send> Trait for T {}
   | ------------------------- first implementation here
15 | impl Trait for Type {}
   | ^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Type`

The above code can be compiled using the unstable negative_impls feature.

#![feature(negative_impls)]

pub struct Type {}

impl !Send for Type {}

trait Trait {}

impl<T: Send> Trait for T {}
impl Trait for Type {}

Attribute Macros§