Understanding Rust Error E0398

Introduction to Rust Error E0398

Rust Error E0398 is no longer emitted by the compiler. It was a warning regarding the changes to default object lifetime bounds introduced in Rust 1.3, as described in RFC 1156. The compiler would issue this warning if it suspected that the changes might cause compilation errors in your code. However, it was possible that the warning was a false alarm.

Changes in Default Object Lifetime Bounds

The main change was related to the default object lifetime bounds for references to boxed trait objects. In older versions of Rust, the default object lifetime bound for &'a Box<SomeTrait> was &'a Box<SomeTrait+'a>. With the changes introduced in Rust 1.3, it now defaults to &'a Box<SomeTrait+'static>. Note that only references to boxes (e.g., &Box<SomeTrait> or &[Box<SomeTrait>]) were affected, and more common types like &SomeTrait or Box<SomeTrait> remained unchanged.

Addressing the E0398 Warning

To resolve the E0398 warning, you would need to update the code to use explicit bounds. In most cases, this would involve updating the function signatures you were calling. Consider the following example:

trait SomeTrait {}

fn foo(arg: &Box<SomeTrait>) { /* ... */ }

To address the E0398 warning, you would update the function signature like this:

trait SomeTrait {}

fn foo<'a>(arg: &'a Box<SomeTrait+'a>) { /* ... */ }

By making this change, you would explicitly state that the trait object SomeTrait can contain references with a maximum lifetime of 'a.


As Rust Error E0398 is no longer emitted by the compiler, you likely won't encounter this warning in modern versions of the language. However, understanding the changes in default object lifetime bounds and how to explicitly specify bounds can still be useful when working with Rust code that predates these changes or when reading older Rust documentation.