From 540d5f41f155bee7e8712e3abe8e88d896d86b41 Mon Sep 17 00:00:00 2001 From: mejrs <59372212+mejrs@users.noreply.github.com> Date: Mon, 2 Nov 2026 21:39:32 +0100 Subject: [PATCH] declare_tool_lint: allow use without `default_field_values` feature --- compiler/rustc_hir_typeck/src/expr.rs | 4 +++- compiler/rustc_lint_defs/src/lib.rs | 3 +++ .../default-field-values/allow_internal_unstable_user.rs | 8 ++++++++ .../auxiliary/allow_internal_unstable.rs | 8 ++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 tests/ui/structs/default-field-values/allow_internal_unstable_user.rs create mode 100644 tests/ui/structs/default-field-values/auxiliary/allow_internal_unstable.rs diff --git a/compiler/rustc_hir_typeck/src/expr.rs b/compiler/rustc_hir_typeck/src/expr.rs index 39b4b8c1417d7..fe36aa95479f4 100644 --- a/compiler/rustc_hir_typeck/src/expr.rs +++ b/compiler/rustc_hir_typeck/src/expr.rs @@ -2055,7 +2055,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } } } - if !self.tcx.features().default_field_values() { + if !(self.tcx.features().default_field_values() + || span.allows_unstable(sym::default_field_values)) + { let sugg = self.tcx.crate_level_attribute_injection_span(); self.dcx().emit_err(BaseExpressionDoubleDot { span: span.shrink_to_hi(), diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 5e7b417ef68a4..956975536c424 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -1,4 +1,6 @@ // tidy-alphabetical-start +#![allow(internal_features)] +#![feature(allow_internal_unstable)] #![feature(default_field_values)] // tidy-alphabetical-end @@ -698,6 +700,7 @@ macro_rules! declare_lint { } #[macro_export] +#[allow_internal_unstable(default_field_values)] macro_rules! declare_tool_lint { ( $(#[$attr:meta])* $vis:vis $tool:ident ::$NAME:ident, $Level: ident, $desc: expr diff --git a/tests/ui/structs/default-field-values/allow_internal_unstable_user.rs b/tests/ui/structs/default-field-values/allow_internal_unstable_user.rs new file mode 100644 index 0000000000000..b9445c2491f72 --- /dev/null +++ b/tests/ui/structs/default-field-values/allow_internal_unstable_user.rs @@ -0,0 +1,8 @@ +//@check-pass +//@aux-build:allow_internal_unstable.rs + +extern crate allow_internal_unstable; + +allow_internal_unstable::foo!(); + +fn main(){} diff --git a/tests/ui/structs/default-field-values/auxiliary/allow_internal_unstable.rs b/tests/ui/structs/default-field-values/auxiliary/allow_internal_unstable.rs new file mode 100644 index 0000000000000..3fae6565fad05 --- /dev/null +++ b/tests/ui/structs/default-field-values/auxiliary/allow_internal_unstable.rs @@ -0,0 +1,8 @@ +#![allow(internal_features)] +#![feature(allow_internal_unstable)] + +#[macro_export] +#[allow_internal_unstable(default_field_values)] +macro_rules! foo { + () => { fn foo() { struct Foo {x: usize = 0, } Foo {..}; } }; +}