From 4c8302811c9efc5f349c146fcf6c6e2bb5a1c7b1 Mon Sep 17 00:00:00 2001 From: Waffle Lapkin Date: Thu, 19 Feb 2026 13:53:58 +0100 Subject: [PATCH] deny-by-default & report in deps `uninhabited_static` --- compiler/rustc_lint_defs/src/builtin.rs | 5 +- tests/ui/statics/uninhabited-static.rs | 1 - tests/ui/statics/uninhabited-static.stderr | 66 ++++++++++++++++++---- 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 38ffecbafa06b..e3f69a6253c90 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -2707,7 +2707,7 @@ declare_lint! { /// /// ### Example /// - /// ```rust + /// ```rust,compile_fail /// enum Void {} /// unsafe extern { /// static EXTERN: Void; @@ -2723,10 +2723,11 @@ declare_lint! { /// compiler which assumes that there are no initialized uninhabited places (such as locals or /// statics). This was accidentally allowed, but is being phased out. pub UNINHABITED_STATIC, - Warn, + Deny, "uninhabited static", @future_incompatible = FutureIncompatibleInfo { reason: fcw!(FutureReleaseError #74840), + report_in_deps: true, }; } diff --git a/tests/ui/statics/uninhabited-static.rs b/tests/ui/statics/uninhabited-static.rs index 955d489d3133e..febbca6f0026d 100644 --- a/tests/ui/statics/uninhabited-static.rs +++ b/tests/ui/statics/uninhabited-static.rs @@ -1,5 +1,4 @@ #![feature(never_type)] -#![deny(uninhabited_static)] enum Void {} extern "C" { diff --git a/tests/ui/statics/uninhabited-static.stderr b/tests/ui/statics/uninhabited-static.stderr index 4762784574dc7..fe08865696b51 100644 --- a/tests/ui/statics/uninhabited-static.stderr +++ b/tests/ui/statics/uninhabited-static.stderr @@ -1,5 +1,5 @@ error: static of uninhabited type - --> $DIR/uninhabited-static.rs:12:1 + --> $DIR/uninhabited-static.rs:11:1 | LL | static VOID2: Void = unsafe { std::mem::transmute(()) }; | ^^^^^^^^^^^^^^^^^^ @@ -7,14 +7,10 @@ LL | static VOID2: Void = unsafe { std::mem::transmute(()) }; = note: uninhabited statics cannot be initialized, and any access would be an immediate error = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #74840 -note: the lint level is defined here - --> $DIR/uninhabited-static.rs:2:9 - | -LL | #![deny(uninhabited_static)] - | ^^^^^^^^^^^^^^^^^^ + = note: `#[deny(uninhabited_static)]` (part of `#[deny(future_incompatible)]`) on by default error: static of uninhabited type - --> $DIR/uninhabited-static.rs:15:1 + --> $DIR/uninhabited-static.rs:14:1 | LL | static NEVER2: Void = unsafe { std::mem::transmute(()) }; | ^^^^^^^^^^^^^^^^^^^ @@ -24,7 +20,7 @@ LL | static NEVER2: Void = unsafe { std::mem::transmute(()) }; = note: for more information, see issue #74840 error: static of uninhabited type - --> $DIR/uninhabited-static.rs:6:5 + --> $DIR/uninhabited-static.rs:5:5 | LL | static VOID: Void; | ^^^^^^^^^^^^^^^^^ @@ -34,7 +30,7 @@ LL | static VOID: Void; = note: for more information, see issue #74840 error: static of uninhabited type - --> $DIR/uninhabited-static.rs:8:5 + --> $DIR/uninhabited-static.rs:7:5 | LL | static NEVER: !; | ^^^^^^^^^^^^^^^ @@ -44,13 +40,13 @@ LL | static NEVER: !; = note: for more information, see issue #74840 error[E0080]: constructing invalid value: encountered a value of uninhabited type `Void` - --> $DIR/uninhabited-static.rs:12:31 + --> $DIR/uninhabited-static.rs:11:31 | LL | static VOID2: Void = unsafe { std::mem::transmute(()) }; | ^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `VOID2` failed here error[E0080]: constructing invalid value: encountered a value of uninhabited type `Void` - --> $DIR/uninhabited-static.rs:15:32 + --> $DIR/uninhabited-static.rs:14:32 | LL | static NEVER2: Void = unsafe { std::mem::transmute(()) }; | ^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `NEVER2` failed here @@ -58,3 +54,51 @@ LL | static NEVER2: Void = unsafe { std::mem::transmute(()) }; error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0080`. +Future incompatibility report: Future breakage diagnostic: +error: static of uninhabited type + --> $DIR/uninhabited-static.rs:11:1 + | +LL | static VOID2: Void = unsafe { std::mem::transmute(()) }; + | ^^^^^^^^^^^^^^^^^^ + | + = note: uninhabited statics cannot be initialized, and any access would be an immediate error + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #74840 + = note: `#[deny(uninhabited_static)]` (part of `#[deny(future_incompatible)]`) on by default + +Future breakage diagnostic: +error: static of uninhabited type + --> $DIR/uninhabited-static.rs:14:1 + | +LL | static NEVER2: Void = unsafe { std::mem::transmute(()) }; + | ^^^^^^^^^^^^^^^^^^^ + | + = note: uninhabited statics cannot be initialized, and any access would be an immediate error + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #74840 + = note: `#[deny(uninhabited_static)]` (part of `#[deny(future_incompatible)]`) on by default + +Future breakage diagnostic: +error: static of uninhabited type + --> $DIR/uninhabited-static.rs:5:5 + | +LL | static VOID: Void; + | ^^^^^^^^^^^^^^^^^ + | + = note: uninhabited statics cannot be initialized, and any access would be an immediate error + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #74840 + = note: `#[deny(uninhabited_static)]` (part of `#[deny(future_incompatible)]`) on by default + +Future breakage diagnostic: +error: static of uninhabited type + --> $DIR/uninhabited-static.rs:7:5 + | +LL | static NEVER: !; + | ^^^^^^^^^^^^^^^ + | + = note: uninhabited statics cannot be initialized, and any access would be an immediate error + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #74840 + = note: `#[deny(uninhabited_static)]` (part of `#[deny(future_incompatible)]`) on by default +