Understanding Rust Error E0789
Overview
Rust Error E0789 is an internal compiler error encountered when the rustc_allowed_through_unstable_modules attribute is used without being paired with a stable attribute. This error typically occurs with the use of unstable features in the Rust compiler or standard library.
Background
Items marked with a stable attribute usually require their parent modules to also be marked as stable, otherwise, the items become unstable by default. The rustc_allowed_through_unstable_modules attribute is a workaround that allows items to 'escape' their unstable parent modules. However, this attribute must be accompanied by a supplementary stable attribute.
Example of Erroneous Code
#![allow(unused)]
fn main() {
#![feature(rustc_attrs)]
#![feature(staged_api)]
#![unstable(feature = "foo_module", reason = "...", issue = "123")]
#[rustc_allowed_through_unstable_modules]
// #[stable(feature = "foo", since = "1.0")]
struct Foo;
} // ^^^ error: `rustc_allowed_through_unstable_modules` attribute must be
// paired with a `stable` attribute
How to Fix Error E0789
The solution to Rust Error E0789 is to ensure that when using the rustc_allowed_through_unstable_modules attribute, a stable attribute must be included alongside it. Uncommenting the stable attribute in the erroneous code example above will resolve the error:
#![allow(unused)]
fn main() {
#![feature(rustc_attrs)]
#![feature(staged_api)]
#![unstable(feature = "foo_module", reason = "...", issue = "123")]
#[rustc_allowed_through_unstable_modules]
#[stable(feature = "foo", since = "1.0")]
struct Foo;
} // No error
Conclusion
In summary, Rust Error E0789 occurs when the rustc_allowed_through_unstable_modules attribute is used without a corresponding stable attribute. By including the required stable attribute, the error can be resolved, allowing a safe use of unstable features within the Rust compiler or standard library.