diagnostic_namespace

The tracking issue for this feature is: #111996


The diagnostic_namespace feature permits customization of compilation errors.

diagnostic::on_unimplemented

With #114452 support for diagnostic::on_unimplemented was added.

When used on a trait declaration, the following options are available:

  • message to customize the primary error message
  • note to add a customized note message to an error message
  • label to customize the label part of the error message

The attribute will hint to the compiler to use these in error messages:

#![allow(unused)]
fn main() {
// some library
#![feature(diagnostic_namespace)]

#[diagnostic::on_unimplemented(
    message = "cannot insert element",
    label = "cannot be put into a table",
    note = "see <link> for more information about the Table api"
)]
pub trait Element {
    // ...
}
}
#![feature(diagnostic_namespace)]

#[diagnostic::on_unimplemented(
   message = "cannot insert element",
   label = "cannot be put into a table",
   note = "see <link> for more information about the Table api"
)]
pub trait Element {
   // ...
}
struct Table;
impl Table {
   fn insert<T: Element>(&self, element: T) {
       // ..
   }
}
fn main() {
   let table = Table;
   let element = ();
// user code
table.insert(element);
}
error[E0277]: cannot insert element
  --> src/main.rs:24:18
   |
24 |     table.insert(element);
   |           ------ ^^^^^^^ cannot be put into a table
   |           |
   |           required by a bound introduced by this call
   |
   = help: the trait `Element` is not implemented for `<type>`
   = note: see <link> for more information about the Table api
note: required by a bound in `Table::insert`
  --> src/main.rs:15:18
   |
15 |     fn insert<T: Element>(&self, element: T) {
   |                  ^^^^^^^ required by this bound in `Table::insert`

For more information about this error, try `rustc --explain E0277`.

See RFC 3368 for more information.