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 {..}; } }; +}